Commit acf9170f authored by Tobias Tebbi's avatar Tobias Tebbi Committed by Commit Bot

[torque] simplify AST around generics

Bug: v8:7793
Change-Id: I5f5461e4e3d31c6d3c2c1fba4ce48a4eb5db5d8e
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1725625
Commit-Queue: Tobias Tebbi <tebbi@chromium.org>
Reviewed-by: 's avatarJakob Gruber <jgruber@chromium.org>
Cr-Commit-Position: refs/heads/master@{#63098}
parent 11524453
...@@ -16,7 +16,7 @@ namespace array_join { ...@@ -16,7 +16,7 @@ namespace array_join {
return GetProperty(receiver, k); return GetProperty(receiver, k);
} }
LoadJoinElement<array::DictionaryElements>( transitioning LoadJoinElement<array::DictionaryElements>(
context: Context, receiver: JSReceiver, k: Number): Object { context: Context, receiver: JSReceiver, k: Number): Object {
const array: JSArray = UnsafeCast<JSArray>(receiver); const array: JSArray = UnsafeCast<JSArray>(receiver);
const dict: NumberDictionary = UnsafeCast<NumberDictionary>(array.elements); const dict: NumberDictionary = UnsafeCast<NumberDictionary>(array.elements);
...@@ -323,7 +323,7 @@ namespace array_join { ...@@ -323,7 +323,7 @@ namespace array_join {
useToLocaleString: constexpr bool, receiver: JSReceiver, sep: String, useToLocaleString: constexpr bool, receiver: JSReceiver, sep: String,
lenNumber: Number, locales: Object, options: Object): Object; lenNumber: Number, locales: Object, options: Object): Object;
ArrayJoin<JSArray>(implicit context: Context)( transitioning ArrayJoin<JSArray>(implicit context: Context)(
useToLocaleString: constexpr bool, receiver: JSReceiver, sep: String, useToLocaleString: constexpr bool, receiver: JSReceiver, sep: String,
lenNumber: Number, locales: Object, options: Object): Object { lenNumber: Number, locales: Object, options: Object): Object {
const map: Map = receiver.map; const map: Map = receiver.map;
...@@ -370,7 +370,7 @@ namespace array_join { ...@@ -370,7 +370,7 @@ namespace array_join {
receiver, sep, lenNumber, useToLocaleString, locales, options, loadFn); receiver, sep, lenNumber, useToLocaleString, locales, options, loadFn);
} }
ArrayJoin<JSTypedArray>(implicit context: Context)( transitioning ArrayJoin<JSTypedArray>(implicit context: Context)(
useToLocaleString: constexpr bool, receiver: JSReceiver, sep: String, useToLocaleString: constexpr bool, receiver: JSReceiver, sep: String,
lenNumber: Number, locales: Object, options: Object): Object { lenNumber: Number, locales: Object, options: Object): Object {
const map: Map = receiver.map; const map: Map = receiver.map;
......
This diff is collapsed.
...@@ -59,7 +59,7 @@ std::ostream& operator<<(std::ostream& os, const RuntimeFunction& b) { ...@@ -59,7 +59,7 @@ std::ostream& operator<<(std::ostream& os, const RuntimeFunction& b) {
std::ostream& operator<<(std::ostream& os, const Generic& g) { std::ostream& operator<<(std::ostream& os, const Generic& g) {
os << "generic " << g.name() << "<"; os << "generic " << g.name() << "<";
PrintCommaSeparatedList( PrintCommaSeparatedList(
os, g.declaration()->generic_parameters, os, g.generic_parameters(),
[](const Identifier* identifier) { return identifier->value; }); [](const Identifier* identifier) { return identifier->value; });
os << ">"; os << ">";
...@@ -69,19 +69,29 @@ std::ostream& operator<<(std::ostream& os, const Generic& g) { ...@@ -69,19 +69,29 @@ std::ostream& operator<<(std::ostream& os, const Generic& g) {
TypeArgumentInference Generic::InferSpecializationTypes( TypeArgumentInference Generic::InferSpecializationTypes(
const TypeVector& explicit_specialization_types, const TypeVector& explicit_specialization_types,
const TypeVector& arguments) { const TypeVector& arguments) {
size_t implicit_count = size_t implicit_count = declaration()->parameters.implicit_count;
declaration()->callable->signature->parameters.implicit_count;
const std::vector<TypeExpression*>& parameters = const std::vector<TypeExpression*>& parameters =
declaration()->callable->signature->parameters.types; declaration()->parameters.types;
std::vector<TypeExpression*> explicit_parameters( std::vector<TypeExpression*> explicit_parameters(
parameters.begin() + implicit_count, parameters.end()); parameters.begin() + implicit_count, parameters.end());
TypeArgumentInference inference(declaration()->generic_parameters, TypeArgumentInference inference(generic_parameters(),
explicit_specialization_types, explicit_specialization_types,
explicit_parameters, arguments); explicit_parameters, arguments);
return inference; return inference;
} }
base::Optional<Statement*> Generic::CallableBody() {
if (auto* decl = TorqueMacroDeclaration::DynamicCast(declaration())) {
return decl->body;
} else if (auto* decl =
TorqueBuiltinDeclaration::DynamicCast(declaration())) {
return decl->body;
} else {
return base::nullopt;
}
}
bool Namespace::IsDefaultNamespace() const { bool Namespace::IsDefaultNamespace() const {
return this == GlobalContext::GetDefaultNamespace(); return this == GlobalContext::GetDefaultNamespace();
} }
......
...@@ -262,6 +262,7 @@ class Callable : public Scope { ...@@ -262,6 +262,7 @@ class Callable : public Scope {
const std::string& ExternalName() const { return external_name_; } const std::string& ExternalName() const { return external_name_; }
const std::string& ReadableName() const { return readable_name_; } const std::string& ReadableName() const { return readable_name_; }
const Signature& signature() const { return signature_; } const Signature& signature() const { return signature_; }
bool IsTransitioning() const { return signature().transitioning; }
const NameVector& parameter_names() const { const NameVector& parameter_names() const {
return signature_.parameter_names; return signature_.parameter_names;
} }
...@@ -270,7 +271,6 @@ class Callable : public Scope { ...@@ -270,7 +271,6 @@ class Callable : public Scope {
} }
void IncrementReturns() { ++returns_; } void IncrementReturns() { ++returns_; }
bool HasReturns() const { return returns_; } bool HasReturns() const { return returns_; }
bool IsTransitioning() const { return transitioning_; }
base::Optional<Statement*> body() const { return body_; } base::Optional<Statement*> body() const { return body_; }
bool IsExternal() const { return !body_.has_value(); } bool IsExternal() const { return !body_.has_value(); }
virtual bool ShouldBeInlined() const { return false; } virtual bool ShouldBeInlined() const { return false; }
...@@ -278,14 +278,13 @@ class Callable : public Scope { ...@@ -278,14 +278,13 @@ class Callable : public Scope {
protected: protected:
Callable(Declarable::Kind kind, std::string external_name, Callable(Declarable::Kind kind, std::string external_name,
std::string readable_name, Signature signature, bool transitioning, std::string readable_name, Signature signature,
base::Optional<Statement*> body) base::Optional<Statement*> body)
: Scope(kind), : Scope(kind),
external_name_(std::move(external_name)), external_name_(std::move(external_name)),
readable_name_(std::move(readable_name)), readable_name_(std::move(readable_name)),
signature_(std::move(signature)), signature_(std::move(signature)),
transitioning_(transitioning),
returns_(0), returns_(0),
body_(body) { body_(body) {
DCHECK(!body || *body); DCHECK(!body || *body);
...@@ -295,7 +294,6 @@ class Callable : public Scope { ...@@ -295,7 +294,6 @@ class Callable : public Scope {
std::string external_name_; std::string external_name_;
std::string readable_name_; std::string readable_name_;
Signature signature_; Signature signature_;
bool transitioning_;
size_t returns_; size_t returns_;
base::Optional<Statement*> body_; base::Optional<Statement*> body_;
}; };
...@@ -321,9 +319,9 @@ class Macro : public Callable { ...@@ -321,9 +319,9 @@ class Macro : public Callable {
protected: protected:
Macro(Declarable::Kind kind, std::string external_name, Macro(Declarable::Kind kind, std::string external_name,
std::string readable_name, const Signature& signature, std::string readable_name, const Signature& signature,
bool transitioning, base::Optional<Statement*> body) base::Optional<Statement*> body)
: Callable(kind, std::move(external_name), std::move(readable_name), : Callable(kind, std::move(external_name), std::move(readable_name),
signature, transitioning, body), signature, body),
used_(false) { used_(false) {
if (signature.parameter_types.var_args) { if (signature.parameter_types.var_args) {
ReportError("Varargs are not supported for macros."); ReportError("Varargs are not supported for macros.");
...@@ -345,9 +343,9 @@ class ExternMacro : public Macro { ...@@ -345,9 +343,9 @@ class ExternMacro : public Macro {
private: private:
friend class Declarations; friend class Declarations;
ExternMacro(const std::string& name, std::string external_assembler_name, ExternMacro(const std::string& name, std::string external_assembler_name,
Signature signature, bool transitioning) Signature signature)
: Macro(Declarable::kExternMacro, name, name, std::move(signature), : Macro(Declarable::kExternMacro, name, name, std::move(signature),
transitioning, base::nullopt), base::nullopt),
external_assembler_name_(std::move(external_assembler_name)) {} external_assembler_name_(std::move(external_assembler_name)) {}
std::string external_assembler_name_; std::string external_assembler_name_;
...@@ -361,10 +359,10 @@ class TorqueMacro : public Macro { ...@@ -361,10 +359,10 @@ class TorqueMacro : public Macro {
protected: protected:
TorqueMacro(Declarable::Kind kind, std::string external_name, TorqueMacro(Declarable::Kind kind, std::string external_name,
std::string readable_name, const Signature& signature, std::string readable_name, const Signature& signature,
bool transitioning, base::Optional<Statement*> body, base::Optional<Statement*> body, bool is_user_defined,
bool is_user_defined, bool exported_to_csa) bool exported_to_csa)
: Macro(kind, std::move(external_name), std::move(readable_name), : Macro(kind, std::move(external_name), std::move(readable_name),
signature, transitioning, body), signature, body),
exported_to_csa_(exported_to_csa) { exported_to_csa_(exported_to_csa) {
SetIsUserDefined(is_user_defined); SetIsUserDefined(is_user_defined);
} }
...@@ -372,12 +370,11 @@ class TorqueMacro : public Macro { ...@@ -372,12 +370,11 @@ class TorqueMacro : public Macro {
private: private:
friend class Declarations; friend class Declarations;
TorqueMacro(std::string external_name, std::string readable_name, TorqueMacro(std::string external_name, std::string readable_name,
const Signature& signature, bool transitioning, const Signature& signature, base::Optional<Statement*> body,
base::Optional<Statement*> body, bool is_user_defined, bool is_user_defined, bool exported_to_csa)
bool exported_to_csa)
: TorqueMacro(Declarable::kTorqueMacro, std::move(external_name), : TorqueMacro(Declarable::kTorqueMacro, std::move(external_name),
std::move(readable_name), signature, transitioning, body, std::move(readable_name), signature, body, is_user_defined,
is_user_defined, exported_to_csa) {} exported_to_csa) {}
bool exported_to_csa_ = false; bool exported_to_csa_ = false;
}; };
...@@ -396,11 +393,9 @@ class Method : public TorqueMacro { ...@@ -396,11 +393,9 @@ class Method : public TorqueMacro {
private: private:
friend class Declarations; friend class Declarations;
Method(AggregateType* aggregate_type, std::string external_name, Method(AggregateType* aggregate_type, std::string external_name,
std::string readable_name, const Signature& signature, std::string readable_name, const Signature& signature, Statement* body)
bool transitioning, Statement* body)
: TorqueMacro(Declarable::kMethod, std::move(external_name), : TorqueMacro(Declarable::kMethod, std::move(external_name),
std::move(readable_name), signature, transitioning, body, std::move(readable_name), signature, body, true, false),
true, false),
aggregate_type_(aggregate_type) {} aggregate_type_(aggregate_type) {}
AggregateType* aggregate_type_; AggregateType* aggregate_type_;
}; };
...@@ -417,10 +412,10 @@ class Builtin : public Callable { ...@@ -417,10 +412,10 @@ class Builtin : public Callable {
private: private:
friend class Declarations; friend class Declarations;
Builtin(std::string external_name, std::string readable_name, Builtin(std::string external_name, std::string readable_name,
Builtin::Kind kind, const Signature& signature, bool transitioning, Builtin::Kind kind, const Signature& signature,
base::Optional<Statement*> body) base::Optional<Statement*> body)
: Callable(Declarable::kBuiltin, std::move(external_name), : Callable(Declarable::kBuiltin, std::move(external_name),
std::move(readable_name), signature, transitioning, body), std::move(readable_name), signature, body),
kind_(kind) {} kind_(kind) {}
Kind kind_; Kind kind_;
...@@ -432,10 +427,9 @@ class RuntimeFunction : public Callable { ...@@ -432,10 +427,9 @@ class RuntimeFunction : public Callable {
private: private:
friend class Declarations; friend class Declarations;
RuntimeFunction(const std::string& name, const Signature& signature, RuntimeFunction(const std::string& name, const Signature& signature)
bool transitioning)
: Callable(Declarable::kRuntimeFunction, name, name, signature, : Callable(Declarable::kRuntimeFunction, name, name, signature,
transitioning, base::nullopt) {} base::nullopt) {}
}; };
class Intrinsic : public Callable { class Intrinsic : public Callable {
...@@ -445,8 +439,7 @@ class Intrinsic : public Callable { ...@@ -445,8 +439,7 @@ class Intrinsic : public Callable {
private: private:
friend class Declarations; friend class Declarations;
Intrinsic(std::string name, const Signature& signature) Intrinsic(std::string name, const Signature& signature)
: Callable(Declarable::kIntrinsic, name, name, signature, false, : Callable(Declarable::kIntrinsic, name, name, signature, base::nullopt) {
base::nullopt) {
if (signature.parameter_types.var_args) { if (signature.parameter_types.var_args) {
ReportError("Varargs are not supported for intrinsics."); ReportError("Varargs are not supported for intrinsics.");
} }
...@@ -484,25 +477,29 @@ class Generic : public Declarable { ...@@ -484,25 +477,29 @@ class Generic : public Declarable {
DECLARE_DECLARABLE_BOILERPLATE(Generic, generic) DECLARE_DECLARABLE_BOILERPLATE(Generic, generic)
const std::string& name() const { return name_; } const std::string& name() const { return name_; }
GenericDeclaration* declaration() const { return declaration_; } CallableDeclaration* declaration() const {
return generic_declaration_->declaration;
}
const std::vector<Identifier*> generic_parameters() const { const std::vector<Identifier*> generic_parameters() const {
return declaration()->generic_parameters; return generic_declaration_->generic_parameters;
} }
SpecializationMap<Callable>& specializations() { return specializations_; } SpecializationMap<Callable>& specializations() { return specializations_; }
base::Optional<Statement*> CallableBody();
TypeArgumentInference InferSpecializationTypes( TypeArgumentInference InferSpecializationTypes(
const TypeVector& explicit_specialization_types, const TypeVector& explicit_specialization_types,
const TypeVector& arguments); const TypeVector& arguments);
private: private:
friend class Declarations; friend class Declarations;
Generic(const std::string& name, GenericDeclaration* declaration) Generic(const std::string& name, GenericDeclaration* generic_declaration)
: Declarable(Declarable::kGeneric), : Declarable(Declarable::kGeneric),
name_(name), name_(name),
declaration_(declaration) {} generic_declaration_(generic_declaration) {}
std::string name_; std::string name_;
GenericDeclaration* declaration_; GenericDeclaration* generic_declaration_;
SpecializationMap<Callable> specializations_; SpecializationMap<Callable> specializations_;
}; };
......
This diff is collapsed.
...@@ -45,7 +45,7 @@ class PredeclarationVisitor { ...@@ -45,7 +45,7 @@ class PredeclarationVisitor {
} }
} }
static void Predeclare(GenericDeclaration* decl) { static void Predeclare(GenericDeclaration* decl) {
Declarations::DeclareGeneric(decl->callable->name, decl); Declarations::DeclareGeneric(decl->declaration->name->value, decl);
} }
}; };
...@@ -76,30 +76,15 @@ class DeclarationVisitor { ...@@ -76,30 +76,15 @@ class DeclarationVisitor {
std::string external_name, std::string external_name,
std::string readable_name, Signature signature, std::string readable_name, Signature signature,
base::Optional<Statement*> body); base::Optional<Statement*> body);
static void Visit(ExternalBuiltinDeclaration* decl,
const Signature& signature,
base::Optional<Statement*> body) {
Declarations::Declare(
decl->name,
CreateBuiltin(decl, decl->name, decl->name, signature, base::nullopt));
}
static void Visit(ExternalRuntimeDeclaration* decl, const Signature& sig,
base::Optional<Statement*> body);
static void Visit(ExternalMacroDeclaration* decl, const Signature& sig,
base::Optional<Statement*> body);
static void Visit(TorqueBuiltinDeclaration* decl, const Signature& signature,
base::Optional<Statement*> body);
static void Visit(TorqueMacroDeclaration* decl, const Signature& signature,
base::Optional<Statement*> body);
static void Visit(IntrinsicDeclaration* decl, const Signature& signature,
base::Optional<Statement*> body);
static void Visit(CallableNode* decl, const Signature& signature, static void Visit(ExternalBuiltinDeclaration* decl);
base::Optional<Statement*> body); static void Visit(ExternalRuntimeDeclaration* decl);
static void Visit(ExternalMacroDeclaration* decl);
static void Visit(TorqueBuiltinDeclaration* decl);
static void Visit(TorqueMacroDeclaration* decl);
static void Visit(IntrinsicDeclaration* decl);
static void Visit(ConstDeclaration* decl); static void Visit(ConstDeclaration* decl);
static void Visit(StandardDeclaration* decl);
static void Visit(GenericDeclaration* decl) { static void Visit(GenericDeclaration* decl) {
// The PredeclarationVisitor already handled this case. // The PredeclarationVisitor already handled this case.
} }
...@@ -111,8 +96,8 @@ class DeclarationVisitor { ...@@ -111,8 +96,8 @@ class DeclarationVisitor {
const SpecializationKey<Generic>& key); const SpecializationKey<Generic>& key);
static Callable* SpecializeImplicit(const SpecializationKey<Generic>& key); static Callable* SpecializeImplicit(const SpecializationKey<Generic>& key);
static Callable* Specialize( static Callable* Specialize(
const SpecializationKey<Generic>& key, CallableNode* declaration, const SpecializationKey<Generic>& key, CallableDeclaration* declaration,
base::Optional<const CallableNodeSignature*> signature, base::Optional<const SpecializationDeclaration*> explicit_specialization,
base::Optional<Statement*> body, SourcePosition position); base::Optional<Statement*> body, SourcePosition position);
private: private:
......
...@@ -165,43 +165,44 @@ const TypeAlias* Declarations::PredeclareTypeAlias(const Identifier* name, ...@@ -165,43 +165,44 @@ const TypeAlias* Declarations::PredeclareTypeAlias(const Identifier* name,
return Declare(name->value, std::move(alias_ptr)); return Declare(name->value, std::move(alias_ptr));
} }
TorqueMacro* Declarations::CreateTorqueMacro( TorqueMacro* Declarations::CreateTorqueMacro(std::string external_name,
std::string external_name, std::string readable_name, bool exported_to_csa, std::string readable_name,
Signature signature, bool transitioning, base::Optional<Statement*> body, bool exported_to_csa,
bool is_user_defined) { Signature signature,
base::Optional<Statement*> body,
bool is_user_defined) {
// TODO(tebbi): Switch to more predictable names to improve incremental // TODO(tebbi): Switch to more predictable names to improve incremental
// compilation. // compilation.
external_name += "_" + std::to_string(GlobalContext::FreshId()); external_name += "_" + std::to_string(GlobalContext::FreshId());
return RegisterDeclarable(std::unique_ptr<TorqueMacro>(new TorqueMacro( return RegisterDeclarable(std::unique_ptr<TorqueMacro>(new TorqueMacro(
std::move(external_name), std::move(readable_name), std::move(signature), std::move(external_name), std::move(readable_name), std::move(signature),
transitioning, body, is_user_defined, exported_to_csa))); body, is_user_defined, exported_to_csa)));
} }
ExternMacro* Declarations::CreateExternMacro( ExternMacro* Declarations::CreateExternMacro(
std::string name, std::string external_assembler_name, Signature signature, std::string name, std::string external_assembler_name,
bool transitioning) { Signature signature) {
return RegisterDeclarable(std::unique_ptr<ExternMacro>( return RegisterDeclarable(std::unique_ptr<ExternMacro>(
new ExternMacro(std::move(name), std::move(external_assembler_name), new ExternMacro(std::move(name), std::move(external_assembler_name),
std::move(signature), transitioning))); std::move(signature))));
} }
Macro* Declarations::DeclareMacro( Macro* Declarations::DeclareMacro(
const std::string& name, bool accessible_from_csa, const std::string& name, bool accessible_from_csa,
base::Optional<std::string> external_assembler_name, base::Optional<std::string> external_assembler_name,
const Signature& signature, bool transitioning, const Signature& signature, base::Optional<Statement*> body,
base::Optional<Statement*> body, base::Optional<std::string> op, base::Optional<std::string> op, bool is_user_defined) {
bool is_user_defined) {
if (TryLookupMacro(name, signature.GetExplicitTypes())) { if (TryLookupMacro(name, signature.GetExplicitTypes())) {
ReportError("cannot redeclare macro ", name, ReportError("cannot redeclare macro ", name,
" with identical explicit parameters"); " with identical explicit parameters");
} }
Macro* macro; Macro* macro;
if (external_assembler_name) { if (external_assembler_name) {
macro = CreateExternMacro(name, std::move(*external_assembler_name), macro =
signature, transitioning); CreateExternMacro(name, std::move(*external_assembler_name), signature);
} else { } else {
macro = CreateTorqueMacro(name, name, accessible_from_csa, signature, macro = CreateTorqueMacro(name, name, accessible_from_csa, signature, body,
transitioning, body, is_user_defined); is_user_defined);
} }
Declare(name, macro); Declare(name, macro);
if (op) { if (op) {
...@@ -216,11 +217,11 @@ Macro* Declarations::DeclareMacro( ...@@ -216,11 +217,11 @@ Macro* Declarations::DeclareMacro(
Method* Declarations::CreateMethod(AggregateType* container_type, Method* Declarations::CreateMethod(AggregateType* container_type,
const std::string& name, Signature signature, const std::string& name, Signature signature,
bool transitioning, Statement* body) { Statement* body) {
std::string generated_name{container_type->GetGeneratedMethodName(name)}; std::string generated_name{container_type->GetGeneratedMethodName(name)};
Method* result = RegisterDeclarable(std::unique_ptr<Method>( Method* result = RegisterDeclarable(std::unique_ptr<Method>(
new Method(container_type, container_type->GetGeneratedMethodName(name), new Method(container_type, container_type->GetGeneratedMethodName(name),
name, std::move(signature), transitioning, body))); name, std::move(signature), body)));
container_type->RegisterMethod(result); container_type->RegisterMethod(result);
return result; return result;
} }
...@@ -242,29 +243,27 @@ Intrinsic* Declarations::DeclareIntrinsic(const std::string& name, ...@@ -242,29 +243,27 @@ Intrinsic* Declarations::DeclareIntrinsic(const std::string& name,
Builtin* Declarations::CreateBuiltin(std::string external_name, Builtin* Declarations::CreateBuiltin(std::string external_name,
std::string readable_name, std::string readable_name,
Builtin::Kind kind, Signature signature, Builtin::Kind kind, Signature signature,
bool transitioning,
base::Optional<Statement*> body) { base::Optional<Statement*> body) {
return RegisterDeclarable(std::unique_ptr<Builtin>( return RegisterDeclarable(std::unique_ptr<Builtin>(
new Builtin(std::move(external_name), std::move(readable_name), kind, new Builtin(std::move(external_name), std::move(readable_name), kind,
std::move(signature), transitioning, body))); std::move(signature), body)));
} }
Builtin* Declarations::DeclareBuiltin(const std::string& name, Builtin* Declarations::DeclareBuiltin(const std::string& name,
Builtin::Kind kind, Builtin::Kind kind,
const Signature& signature, const Signature& signature,
bool transitioning,
base::Optional<Statement*> body) { base::Optional<Statement*> body) {
CheckAlreadyDeclared<Builtin>(name, "builtin"); CheckAlreadyDeclared<Builtin>(name, "builtin");
return Declare( return Declare(name, CreateBuiltin(name, name, kind, signature, body));
name, CreateBuiltin(name, name, kind, signature, transitioning, body));
} }
RuntimeFunction* Declarations::DeclareRuntimeFunction( RuntimeFunction* Declarations::DeclareRuntimeFunction(
const std::string& name, const Signature& signature, bool transitioning) { const std::string& name, const Signature& signature) {
CheckAlreadyDeclared<RuntimeFunction>(name, "runtime function"); CheckAlreadyDeclared<RuntimeFunction>(name, "runtime function");
return Declare(name, return Declare(name, RegisterDeclarable(std::unique_ptr<RuntimeFunction>(
RegisterDeclarable(std::unique_ptr<RuntimeFunction>( new RuntimeFunction(name, signature))));
new RuntimeFunction(name, signature, transitioning))));
} }
void Declarations::DeclareExternConstant(Identifier* name, const Type* type, void Declarations::DeclareExternConstant(Identifier* name, const Type* type,
......
...@@ -88,23 +88,21 @@ class Declarations { ...@@ -88,23 +88,21 @@ class Declarations {
static TorqueMacro* CreateTorqueMacro(std::string external_name, static TorqueMacro* CreateTorqueMacro(std::string external_name,
std::string readable_name, std::string readable_name,
bool exported_to_csa, bool exported_to_csa,
Signature signature, bool transitioning, Signature signature,
base::Optional<Statement*> body, base::Optional<Statement*> body,
bool is_user_defined); bool is_user_defined);
static ExternMacro* CreateExternMacro(std::string name, static ExternMacro* CreateExternMacro(std::string name,
std::string external_assembler_name, std::string external_assembler_name,
Signature signature, Signature signature);
bool transitioning);
static Macro* DeclareMacro( static Macro* DeclareMacro(
const std::string& name, bool accessible_from_csa, const std::string& name, bool accessible_from_csa,
base::Optional<std::string> external_assembler_name, base::Optional<std::string> external_assembler_name,
const Signature& signature, bool transitioning, const Signature& signature, base::Optional<Statement*> body,
base::Optional<Statement*> body, base::Optional<std::string> op = {}, base::Optional<std::string> op = {}, bool is_user_defined = true);
bool is_user_defined = true);
static Method* CreateMethod(AggregateType* class_type, static Method* CreateMethod(AggregateType* class_type,
const std::string& name, Signature signature, const std::string& name, Signature signature,
bool transitioning, Statement* body); Statement* body);
static Intrinsic* CreateIntrinsic(const std::string& name, static Intrinsic* CreateIntrinsic(const std::string& name,
const Signature& signature); const Signature& signature);
...@@ -114,15 +112,14 @@ class Declarations { ...@@ -114,15 +112,14 @@ class Declarations {
static Builtin* CreateBuiltin(std::string external_name, static Builtin* CreateBuiltin(std::string external_name,
std::string readable_name, Builtin::Kind kind, std::string readable_name, Builtin::Kind kind,
Signature signature, bool transitioning, Signature signature,
base::Optional<Statement*> body); base::Optional<Statement*> body);
static Builtin* DeclareBuiltin(const std::string& name, Builtin::Kind kind, static Builtin* DeclareBuiltin(const std::string& name, Builtin::Kind kind,
const Signature& signature, bool transitioning, const Signature& signature,
base::Optional<Statement*> body); base::Optional<Statement*> body);
static RuntimeFunction* DeclareRuntimeFunction(const std::string& name, static RuntimeFunction* DeclareRuntimeFunction(const std::string& name,
const Signature& signature, const Signature& signature);
bool transitioning);
static void DeclareExternConstant(Identifier* name, const Type* type, static void DeclareExternConstant(Identifier* name, const Type* type,
std::string value); std::string value);
......
...@@ -108,7 +108,8 @@ void ImplementationVisitor::EndCSAFiles() { ...@@ -108,7 +108,8 @@ void ImplementationVisitor::EndCSAFiles() {
} }
void ImplementationVisitor::Visit(NamespaceConstant* decl) { void ImplementationVisitor::Visit(NamespaceConstant* decl) {
Signature signature{{}, base::nullopt, {{}, false}, 0, decl->type(), {}}; Signature signature{{}, base::nullopt, {{}, false}, 0, decl->type(),
{}, false};
BindingsManagersScope bindings_managers_scope; BindingsManagersScope bindings_managers_scope;
...@@ -2412,7 +2413,7 @@ VisitResult ImplementationVisitor::Visit(IntrinsicCallExpression* expr) { ...@@ -2412,7 +2413,7 @@ VisitResult ImplementationVisitor::Visit(IntrinsicCallExpression* expr) {
for (Expression* arg : expr->arguments) for (Expression* arg : expr->arguments)
arguments.parameters.push_back(Visit(arg)); arguments.parameters.push_back(Visit(arg));
return scope.Yield( return scope.Yield(
GenerateCall(expr->name, arguments, specialization_types, false)); GenerateCall(expr->name->value, arguments, specialization_types, false));
} }
void ImplementationVisitor::GenerateBranch(const VisitResult& condition, void ImplementationVisitor::GenerateBranch(const VisitResult& condition,
......
This diff is collapsed.
...@@ -92,22 +92,18 @@ void DeclareMethods(AggregateType* container_type, ...@@ -92,22 +92,18 @@ void DeclareMethods(AggregateType* container_type,
const std::vector<Declaration*>& methods) { const std::vector<Declaration*>& methods) {
for (auto declaration : methods) { for (auto declaration : methods) {
CurrentSourcePosition::Scope pos_scope(declaration->pos); CurrentSourcePosition::Scope pos_scope(declaration->pos);
StandardDeclaration* standard_declaration =
StandardDeclaration::DynamicCast(declaration);
DCHECK(standard_declaration);
TorqueMacroDeclaration* method = TorqueMacroDeclaration* method =
TorqueMacroDeclaration::DynamicCast(standard_declaration->callable); TorqueMacroDeclaration::DynamicCast(declaration);
Signature signature = TypeVisitor::MakeSignature(method->signature.get()); Signature signature = TypeVisitor::MakeSignature(method);
signature.parameter_names.insert( signature.parameter_names.insert(
signature.parameter_names.begin() + signature.implicit_count, signature.parameter_names.begin() + signature.implicit_count,
MakeNode<Identifier>(kThisParameterName)); MakeNode<Identifier>(kThisParameterName));
Statement* body = *(standard_declaration->body); Statement* body = *(method->body);
std::string method_name(method->name); const std::string& method_name(method->name->value);
signature.parameter_types.types.insert( signature.parameter_types.types.insert(
signature.parameter_types.types.begin() + signature.implicit_count, signature.parameter_types.types.begin() + signature.implicit_count,
container_type); container_type);
Declarations::CreateMethod(container_type, method_name, signature, false, Declarations::CreateMethod(container_type, method_name, signature, body);
body);
} }
} }
...@@ -231,22 +227,23 @@ const Type* TypeVisitor::ComputeType(TypeExpression* type_expression) { ...@@ -231,22 +227,23 @@ const Type* TypeVisitor::ComputeType(TypeExpression* type_expression) {
} }
} }
Signature TypeVisitor::MakeSignature(const CallableNodeSignature* signature) { Signature TypeVisitor::MakeSignature(const CallableDeclaration* declaration) {
LabelDeclarationVector definition_vector; LabelDeclarationVector definition_vector;
for (const auto& label : signature->labels) { for (const auto& label : declaration->labels) {
LabelDeclaration def = {label.name, ComputeTypeVector(label.types)}; LabelDeclaration def = {label.name, ComputeTypeVector(label.types)};
definition_vector.push_back(def); definition_vector.push_back(def);
} }
base::Optional<std::string> arguments_variable; base::Optional<std::string> arguments_variable;
if (signature->parameters.has_varargs) if (declaration->parameters.has_varargs)
arguments_variable = signature->parameters.arguments_variable; arguments_variable = declaration->parameters.arguments_variable;
Signature result{signature->parameters.names, Signature result{declaration->parameters.names,
arguments_variable, arguments_variable,
{ComputeTypeVector(signature->parameters.types), {ComputeTypeVector(declaration->parameters.types),
signature->parameters.has_varargs}, declaration->parameters.has_varargs},
signature->parameters.implicit_count, declaration->parameters.implicit_count,
ComputeType(signature->return_type), ComputeType(declaration->return_type),
definition_vector}; definition_vector,
declaration->transitioning};
return result; return result;
} }
......
...@@ -27,7 +27,7 @@ class TypeVisitor { ...@@ -27,7 +27,7 @@ class TypeVisitor {
static const Type* ComputeType(TypeExpression* type_expression); static const Type* ComputeType(TypeExpression* type_expression);
static void VisitClassFieldsAndMethods( static void VisitClassFieldsAndMethods(
ClassType* class_type, const ClassDeclaration* class_declaration); ClassType* class_type, const ClassDeclaration* class_declaration);
static Signature MakeSignature(const CallableNodeSignature* signature); static Signature MakeSignature(const CallableDeclaration* declaration);
static const StructType* ComputeTypeForStructExpression( static const StructType* ComputeTypeForStructExpression(
TypeExpression* type_expression, TypeExpression* type_expression,
const std::vector<const Type*>& term_argument_types); const std::vector<const Type*>& term_argument_types);
......
...@@ -453,8 +453,7 @@ void ClassType::GenerateAccessors() { ...@@ -453,8 +453,7 @@ void ClassType::GenerateAccessors() {
MakeNode<ReturnStatement>(MakeNode<FieldAccessExpression>( MakeNode<ReturnStatement>(MakeNode<FieldAccessExpression>(
parameter, MakeNode<Identifier>(field.name_and_type.name))); parameter, MakeNode<Identifier>(field.name_and_type.name)));
Declarations::DeclareMacro(load_macro_name, true, base::nullopt, Declarations::DeclareMacro(load_macro_name, true, base::nullopt,
load_signature, false, load_body, base::nullopt, load_signature, load_body, base::nullopt);
false);
// Store accessor // Store accessor
IdentifierExpression* value = MakeNode<IdentifierExpression>( IdentifierExpression* value = MakeNode<IdentifierExpression>(
...@@ -474,8 +473,8 @@ void ClassType::GenerateAccessors() { ...@@ -474,8 +473,8 @@ void ClassType::GenerateAccessors() {
parameter, MakeNode<Identifier>(field.name_and_type.name)), parameter, MakeNode<Identifier>(field.name_and_type.name)),
value)); value));
Declarations::DeclareMacro(store_macro_name, true, base::nullopt, Declarations::DeclareMacro(store_macro_name, true, base::nullopt,
store_signature, false, store_body, store_signature, store_body, base::nullopt,
base::nullopt, false); false);
} }
} }
......
...@@ -647,22 +647,25 @@ using NameVector = std::vector<Identifier*>; ...@@ -647,22 +647,25 @@ using NameVector = std::vector<Identifier*>;
struct Signature { struct Signature {
Signature(NameVector n, base::Optional<std::string> arguments_variable, Signature(NameVector n, base::Optional<std::string> arguments_variable,
ParameterTypes p, size_t i, const Type* r, LabelDeclarationVector l) ParameterTypes p, size_t i, const Type* r, LabelDeclarationVector l,
bool transitioning)
: parameter_names(std::move(n)), : parameter_names(std::move(n)),
arguments_variable(arguments_variable), arguments_variable(arguments_variable),
parameter_types(std::move(p)), parameter_types(std::move(p)),
implicit_count(i), implicit_count(i),
return_type(r), return_type(r),
labels(std::move(l)) {} labels(std::move(l)),
Signature() : implicit_count(0), return_type(nullptr) {} transitioning(transitioning) {}
Signature() = default;
const TypeVector& types() const { return parameter_types.types; } const TypeVector& types() const { return parameter_types.types; }
NameVector parameter_names; NameVector parameter_names;
base::Optional<std::string> arguments_variable; base::Optional<std::string> arguments_variable;
ParameterTypes parameter_types; ParameterTypes parameter_types;
size_t implicit_count; size_t implicit_count = 0;
size_t ExplicitCount() const { return types().size() - implicit_count; } size_t ExplicitCount() const { return types().size() - implicit_count; }
const Type* return_type; const Type* return_type;
LabelDeclarationVector labels; LabelDeclarationVector labels;
bool transitioning = false;
bool HasSameTypesAs( bool HasSameTypesAs(
const Signature& other, const Signature& other,
ParameterMode mode = ParameterMode::kProcessImplicit) const; ParameterMode mode = ParameterMode::kProcessImplicit) const;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment