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