Commit 7b3f609b authored by Tobias Tebbi's avatar Tobias Tebbi Committed by Commit Bot

[torque] allow qualified access to structs

Bug: v8:7793
Change-Id: I4ce0008f56976102bad952ef2389f40845dcc15b
Reviewed-on: https://chromium-review.googlesource.com/c/1340255Reviewed-by: 's avatarDaniel Clifford <danno@chromium.org>
Commit-Queue: Tobias Tebbi <tebbi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#57605}
parent b1468242
...@@ -1253,16 +1253,6 @@ extern macro TryIntPtrAdd(intptr, intptr): intptr ...@@ -1253,16 +1253,6 @@ extern macro TryIntPtrAdd(intptr, intptr): intptr
extern builtin ObjectToString(Context, Object): Object; extern builtin ObjectToString(Context, Object): Object;
extern builtin StringRepeat(Context, String, Number): String; extern builtin StringRepeat(Context, String, Number): String;
// Returned from IteratorBuiltinsAssembler::GetIterator(). Struct is declared
// here to simplify use in other generated builtins.
struct IteratorRecord {
// iteratorRecord.[[Iterator]]
object: JSReceiver;
// iteratorRecord.[[NextMethod]]
next: Object;
}
struct KeyValuePair { struct KeyValuePair {
key: Object; key: Object;
value: Object; value: Object;
......
...@@ -18,6 +18,7 @@ namespace v8 { ...@@ -18,6 +18,7 @@ namespace v8 {
namespace internal { namespace internal {
using Node = compiler::Node; using Node = compiler::Node;
using IteratorRecord = IteratorBuiltinsFromDSLAssembler::IteratorRecord;
ArrayBuiltinsAssembler::ArrayBuiltinsAssembler( ArrayBuiltinsAssembler::ArrayBuiltinsAssembler(
compiler::CodeAssemblerState* state) compiler::CodeAssemblerState* state)
......
...@@ -312,7 +312,7 @@ void BaseCollectionsAssembler::AddConstructorEntriesFromIterable( ...@@ -312,7 +312,7 @@ void BaseCollectionsAssembler::AddConstructorEntriesFromIterable(
TNode<Object> add_func = GetAddFunction(variant, context, collection); TNode<Object> add_func = GetAddFunction(variant, context, collection);
IteratorBuiltinsAssembler iterator_assembler(this->state()); IteratorBuiltinsAssembler iterator_assembler(this->state());
BaseBuiltinsFromDSLAssembler::IteratorRecord iterator = IteratorBuiltinsFromDSLAssembler::IteratorRecord iterator =
iterator_assembler.GetIterator(context, iterable); iterator_assembler.GetIterator(context, iterable);
CSA_ASSERT(this, Word32BinaryNot(IsUndefined(iterator.object))); CSA_ASSERT(this, Word32BinaryNot(IsUndefined(iterator.object)));
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
namespace v8 { namespace v8 {
namespace internal { namespace internal {
typedef BaseBuiltinsFromDSLAssembler::IteratorRecord IteratorRecord; typedef IteratorBuiltinsFromDSLAssembler::IteratorRecord IteratorRecord;
using compiler::Node; using compiler::Node;
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "src/code-stub-assembler.h" #include "src/code-stub-assembler.h"
#include "torque-generated/builtins-base-from-dsl-gen.h" #include "torque-generated/builtins-base-from-dsl-gen.h"
#include "torque-generated/builtins-iterator-from-dsl-gen.h"
namespace v8 { namespace v8 {
namespace internal { namespace internal {
...@@ -23,10 +24,10 @@ class IteratorBuiltinsAssembler : public CodeStubAssembler { ...@@ -23,10 +24,10 @@ class IteratorBuiltinsAssembler : public CodeStubAssembler {
// https://tc39.github.io/ecma262/#sec-getiterator --- never used for // https://tc39.github.io/ecma262/#sec-getiterator --- never used for
// @@asyncIterator. // @@asyncIterator.
BaseBuiltinsFromDSLAssembler::IteratorRecord GetIterator( IteratorBuiltinsFromDSLAssembler::IteratorRecord GetIterator(
Node* context, Node* object, Label* if_exception = nullptr, Node* context, Node* object, Label* if_exception = nullptr,
Variable* exception = nullptr); Variable* exception = nullptr);
BaseBuiltinsFromDSLAssembler::IteratorRecord GetIterator( IteratorBuiltinsFromDSLAssembler::IteratorRecord GetIterator(
Node* context, Node* object, Node* method, Label* if_exception = nullptr, Node* context, Node* object, Node* method, Label* if_exception = nullptr,
Variable* exception = nullptr); Variable* exception = nullptr);
...@@ -37,13 +38,13 @@ class IteratorBuiltinsAssembler : public CodeStubAssembler { ...@@ -37,13 +38,13 @@ class IteratorBuiltinsAssembler : public CodeStubAssembler {
// object, loaded from the native context. // object, loaded from the native context.
TNode<Object> IteratorStep( TNode<Object> IteratorStep(
Node* context, Node* context,
const BaseBuiltinsFromDSLAssembler::IteratorRecord& iterator, const IteratorBuiltinsFromDSLAssembler::IteratorRecord& iterator,
Label* if_done, Node* fast_iterator_result_map = nullptr, Label* if_done, Node* fast_iterator_result_map = nullptr,
Label* if_exception = nullptr, Variable* exception = nullptr); Label* if_exception = nullptr, Variable* exception = nullptr);
TNode<Object> IteratorStep( TNode<Object> IteratorStep(
Node* context, Node* context,
const BaseBuiltinsFromDSLAssembler::IteratorRecord& iterator, const IteratorBuiltinsFromDSLAssembler::IteratorRecord& iterator,
Node* fast_iterator_result_map, Label* if_done) { Node* fast_iterator_result_map, Label* if_done) {
return IteratorStep(context, iterator, if_done, fast_iterator_result_map); return IteratorStep(context, iterator, if_done, fast_iterator_result_map);
} }
...@@ -60,11 +61,11 @@ class IteratorBuiltinsAssembler : public CodeStubAssembler { ...@@ -60,11 +61,11 @@ class IteratorBuiltinsAssembler : public CodeStubAssembler {
// https://tc39.github.io/ecma262/#sec-iteratorclose // https://tc39.github.io/ecma262/#sec-iteratorclose
void IteratorCloseOnException( void IteratorCloseOnException(
Node* context, Node* context,
const BaseBuiltinsFromDSLAssembler::IteratorRecord& iterator, const IteratorBuiltinsFromDSLAssembler::IteratorRecord& iterator,
Label* if_exception, Variable* exception); Label* if_exception, Variable* exception);
void IteratorCloseOnException( void IteratorCloseOnException(
Node* context, Node* context,
const BaseBuiltinsFromDSLAssembler::IteratorRecord& iterator, const IteratorBuiltinsFromDSLAssembler::IteratorRecord& iterator,
TNode<Object> exception); TNode<Object> exception);
// #sec-iterabletolist // #sec-iterabletolist
......
...@@ -18,7 +18,7 @@ namespace v8 { ...@@ -18,7 +18,7 @@ namespace v8 {
namespace internal { namespace internal {
using compiler::Node; using compiler::Node;
using IteratorRecord = BaseBuiltinsFromDSLAssembler::IteratorRecord; using IteratorRecord = IteratorBuiltinsFromDSLAssembler::IteratorRecord;
Node* PromiseBuiltinsAssembler::AllocateJSPromise(Node* context) { Node* PromiseBuiltinsAssembler::AllocateJSPromise(Node* context) {
Node* const native_context = LoadNativeContext(context); Node* const native_context = LoadNativeContext(context);
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "src/contexts.h" #include "src/contexts.h"
#include "src/objects/promise.h" #include "src/objects/promise.h"
#include "torque-generated/builtins-base-from-dsl-gen.h" #include "torque-generated/builtins-base-from-dsl-gen.h"
#include "torque-generated/builtins-iterator-from-dsl-gen.h"
namespace v8 { namespace v8 {
namespace internal { namespace internal {
...@@ -183,7 +184,7 @@ class PromiseBuiltinsAssembler : public CodeStubAssembler { ...@@ -183,7 +184,7 @@ class PromiseBuiltinsAssembler : public CodeStubAssembler {
Node* PerformPromiseAll( Node* PerformPromiseAll(
Node* context, Node* constructor, Node* capability, Node* context, Node* constructor, Node* capability,
const BaseBuiltinsFromDSLAssembler::IteratorRecord& record, const IteratorBuiltinsFromDSLAssembler::IteratorRecord& record,
Label* if_exception, Variable* var_exception); Label* if_exception, Variable* var_exception);
void SetForwardingHandlerIfTrue(Node* context, Node* condition, void SetForwardingHandlerIfTrue(Node* context, Node* condition,
......
...@@ -3,6 +3,15 @@ ...@@ -3,6 +3,15 @@
// found in the LICENSE file. // found in the LICENSE file.
namespace iterator { namespace iterator {
// Returned from IteratorBuiltinsAssembler::GetIterator().
struct IteratorRecord {
// iteratorRecord.[[Iterator]]
object: JSReceiver;
// iteratorRecord.[[NextMethod]]
next: Object;
}
extern macro IteratorBuiltinsAssembler::GetIteratorMethod( extern macro IteratorBuiltinsAssembler::GetIteratorMethod(
implicit context: Context)(Object): Object; implicit context: Context)(Object): Object;
extern macro IteratorBuiltinsAssembler::GetIterator( extern macro IteratorBuiltinsAssembler::GetIterator(
......
...@@ -217,11 +217,14 @@ struct CallExpression : Expression { ...@@ -217,11 +217,14 @@ struct CallExpression : Expression {
struct StructExpression : Expression { struct StructExpression : Expression {
DEFINE_AST_NODE_LEAF_BOILERPLATE(StructExpression) DEFINE_AST_NODE_LEAF_BOILERPLATE(StructExpression)
StructExpression(SourcePosition pos, std::string name, StructExpression(SourcePosition pos,
std::vector<Expression*> expressions) std::vector<std::string> namespace_qualification,
std::string name, std::vector<Expression*> expressions)
: Expression(kKind, pos), : Expression(kKind, pos),
namespace_qualification(std::move(namespace_qualification)),
name(std::move(name)), name(std::move(name)),
expressions(std::move(expressions)) {} expressions(std::move(expressions)) {}
std::vector<std::string> namespace_qualification;
std::string name; std::string name;
std::vector<Expression*> expressions; std::vector<Expression*> expressions;
}; };
...@@ -350,10 +353,14 @@ struct ParameterList { ...@@ -350,10 +353,14 @@ struct ParameterList {
struct BasicTypeExpression : TypeExpression { struct BasicTypeExpression : TypeExpression {
DEFINE_AST_NODE_LEAF_BOILERPLATE(BasicTypeExpression) DEFINE_AST_NODE_LEAF_BOILERPLATE(BasicTypeExpression)
BasicTypeExpression(SourcePosition pos, bool is_constexpr, std::string name) BasicTypeExpression(SourcePosition pos,
std::vector<std::string> namespace_qualification,
bool is_constexpr, std::string name)
: TypeExpression(kKind, pos), : TypeExpression(kKind, pos),
namespace_qualification(std::move(namespace_qualification)),
is_constexpr(is_constexpr), is_constexpr(is_constexpr),
name(std::move(name)) {} name(std::move(name)) {}
std::vector<std::string> namespace_qualification;
bool is_constexpr; bool is_constexpr;
std::string name; std::string name;
}; };
......
...@@ -74,7 +74,8 @@ base::Optional<const Type*> Generic::InferTypeArgument( ...@@ -74,7 +74,8 @@ base::Optional<const Type*> Generic::InferTypeArgument(
for (size_t i = 0; i < arguments.size() && i < parameters.size(); ++i) { for (size_t i = 0; i < arguments.size() && i < parameters.size(); ++i) {
BasicTypeExpression* basic = BasicTypeExpression* basic =
BasicTypeExpression::DynamicCast(parameters[i]); BasicTypeExpression::DynamicCast(parameters[i]);
if (basic && !basic->is_constexpr && basic->name == type_name) { if (basic && basic->namespace_qualification.empty() &&
!basic->is_constexpr && basic->name == type_name) {
return arguments[i]; return arguments[i];
} }
} }
......
...@@ -59,12 +59,16 @@ std::vector<Declarable*> Declarations::LookupGlobalScope( ...@@ -59,12 +59,16 @@ std::vector<Declarable*> Declarations::LookupGlobalScope(
return d; return d;
} }
const Type* Declarations::LookupType(const std::string& name) { const Type* Declarations::LookupType(const QualifiedName& name) {
TypeAlias* declaration = EnsureUnique( TypeAlias* declaration =
FilterDeclarables<TypeAlias>(Lookup(QualifiedName(name))), name, "type"); EnsureUnique(FilterDeclarables<TypeAlias>(Lookup(name)), name, "type");
return declaration->type(); return declaration->type();
} }
const Type* Declarations::LookupType(std::string name) {
return LookupType(QualifiedName(std::move(name)));
}
const Type* Declarations::LookupGlobalType(const std::string& name) { const Type* Declarations::LookupGlobalType(const std::string& name) {
TypeAlias* declaration = EnsureUnique( TypeAlias* declaration = EnsureUnique(
FilterDeclarables<TypeAlias>(LookupGlobalScope(name)), name, "type"); FilterDeclarables<TypeAlias>(LookupGlobalScope(name)), name, "type");
...@@ -75,7 +79,7 @@ const Type* Declarations::GetType(TypeExpression* type_expression) { ...@@ -75,7 +79,7 @@ const Type* Declarations::GetType(TypeExpression* type_expression) {
if (auto* basic = BasicTypeExpression::DynamicCast(type_expression)) { if (auto* basic = BasicTypeExpression::DynamicCast(type_expression)) {
std::string name = std::string name =
(basic->is_constexpr ? CONSTEXPR_TYPE_PREFIX : "") + basic->name; (basic->is_constexpr ? CONSTEXPR_TYPE_PREFIX : "") + basic->name;
return LookupType(name); return LookupType(QualifiedName{basic->namespace_qualification, name});
} else if (auto* union_type = UnionTypeExpression::cast(type_expression)) { } else if (auto* union_type = UnionTypeExpression::cast(type_expression)) {
return TypeOracle::GetUnionType(GetType(union_type->a), return TypeOracle::GetUnionType(GetType(union_type->a),
GetType(union_type->b)); GetType(union_type->b));
...@@ -149,7 +153,7 @@ const AbstractType* Declarations::DeclareAbstractType( ...@@ -149,7 +153,7 @@ const AbstractType* Declarations::DeclareAbstractType(
CheckAlreadyDeclared<TypeAlias>(name, "type"); CheckAlreadyDeclared<TypeAlias>(name, "type");
const Type* parent_type = nullptr; const Type* parent_type = nullptr;
if (parent) { if (parent) {
parent_type = LookupType(*parent); parent_type = LookupType(QualifiedName{*parent});
} }
const AbstractType* type = TypeOracle::GetAbstractType( const AbstractType* type = TypeOracle::GetAbstractType(
parent_type, name, transient, generated, non_constexpr_version); parent_type, name, transient, generated, non_constexpr_version);
......
...@@ -56,7 +56,8 @@ class Declarations { ...@@ -56,7 +56,8 @@ class Declarations {
static std::vector<Declarable*> LookupGlobalScope(const std::string& name); static std::vector<Declarable*> LookupGlobalScope(const std::string& name);
static const Type* LookupType(const std::string& name); static const Type* LookupType(const QualifiedName& name);
static const Type* LookupType(std::string name);
static const Type* LookupGlobalType(const std::string& name); static const Type* LookupGlobalType(const std::string& name);
static const Type* GetType(TypeExpression* type_expression); static const Type* GetType(TypeExpression* type_expression);
......
...@@ -1423,7 +1423,8 @@ VisitResult ImplementationVisitor::GenerateCopy(const VisitResult& to_copy) { ...@@ -1423,7 +1423,8 @@ VisitResult ImplementationVisitor::GenerateCopy(const VisitResult& to_copy) {
} }
VisitResult ImplementationVisitor::Visit(StructExpression* decl) { VisitResult ImplementationVisitor::Visit(StructExpression* decl) {
const Type* raw_type = Declarations::LookupType(decl->name); const Type* raw_type = Declarations::LookupType(
QualifiedName(decl->namespace_qualification, decl->name));
if (!raw_type->IsStructType()) { if (!raw_type->IsStructType()) {
std::stringstream s; std::stringstream s;
s << decl->name << " is not a struct but used like one "; s << decl->name << " is not a struct but used like one ";
......
...@@ -351,7 +351,8 @@ base::Optional<ParseResult> MakeDebugStatement( ...@@ -351,7 +351,8 @@ base::Optional<ParseResult> MakeDebugStatement(
} }
base::Optional<ParseResult> MakeVoidType(ParseResultIterator* child_results) { base::Optional<ParseResult> MakeVoidType(ParseResultIterator* child_results) {
TypeExpression* result = MakeNode<BasicTypeExpression>(false, "void"); TypeExpression* result =
MakeNode<BasicTypeExpression>(std::vector<std::string>{}, false, "void");
return ParseResult{result}; return ParseResult{result};
} }
...@@ -563,10 +564,12 @@ base::Optional<ParseResult> StringLiteralUnquoteAction( ...@@ -563,10 +564,12 @@ base::Optional<ParseResult> StringLiteralUnquoteAction(
base::Optional<ParseResult> MakeBasicTypeExpression( base::Optional<ParseResult> MakeBasicTypeExpression(
ParseResultIterator* child_results) { ParseResultIterator* child_results) {
auto namespace_qualification =
child_results->NextAs<std::vector<std::string>>();
auto is_constexpr = child_results->NextAs<bool>(); auto is_constexpr = child_results->NextAs<bool>();
auto name = child_results->NextAs<std::string>(); auto name = child_results->NextAs<std::string>();
TypeExpression* result = TypeExpression* result = MakeNode<BasicTypeExpression>(
MakeNode<BasicTypeExpression>(is_constexpr, std::move(name)); std::move(namespace_qualification), is_constexpr, std::move(name));
return ParseResult{result}; return ParseResult{result};
} }
...@@ -845,7 +848,8 @@ base::Optional<ParseResult> MakeCatchBlock(ParseResultIterator* child_results) { ...@@ -845,7 +848,8 @@ base::Optional<ParseResult> MakeCatchBlock(ParseResultIterator* child_results) {
} }
ParameterList parameters; ParameterList parameters;
parameters.names.push_back(variable); parameters.names.push_back(variable);
parameters.types.push_back(MakeNode<BasicTypeExpression>(false, "Object")); parameters.types.push_back(MakeNode<BasicTypeExpression>(
std::vector<std::string>{}, false, "Object"));
parameters.has_varargs = false; parameters.has_varargs = false;
LabelBlock* result = LabelBlock* result =
MakeNode<LabelBlock>("_catch", std::move(parameters), body); MakeNode<LabelBlock>("_catch", std::move(parameters), body);
...@@ -899,10 +903,13 @@ base::Optional<ParseResult> MakeElementAccessExpression( ...@@ -899,10 +903,13 @@ base::Optional<ParseResult> MakeElementAccessExpression(
base::Optional<ParseResult> MakeStructExpression( base::Optional<ParseResult> MakeStructExpression(
ParseResultIterator* child_results) { ParseResultIterator* child_results) {
auto namespace_qualification =
child_results->NextAs<std::vector<std::string>>();
auto name = child_results->NextAs<std::string>(); auto name = child_results->NextAs<std::string>();
auto expressions = child_results->NextAs<std::vector<Expression*>>(); auto expressions = child_results->NextAs<std::vector<Expression*>>();
Expression* result = Expression* result =
MakeNode<StructExpression>(std::move(name), std::move(expressions)); MakeNode<StructExpression>(std::move(namespace_qualification),
std::move(name), std::move(expressions));
return ParseResult{result}; return ParseResult{result};
} }
...@@ -1099,7 +1106,9 @@ struct TorqueGrammar : Grammar { ...@@ -1099,7 +1106,9 @@ struct TorqueGrammar : Grammar {
// Result: TypeExpression* // Result: TypeExpression*
Symbol simpleType = { Symbol simpleType = {
Rule({Token("("), &type, Token(")")}), Rule({Token("("), &type, Token(")")}),
Rule({CheckIf(Token("constexpr")), &identifier}, MakeBasicTypeExpression), Rule({List<std::string>(Sequence({&identifier, Token("::")})),
CheckIf(Token("constexpr")), &identifier},
MakeBasicTypeExpression),
Rule({Token("builtin"), Token("("), typeList, Token(")"), Token("=>"), Rule({Token("builtin"), Token("("), typeList, Token(")"), Token("=>"),
&simpleType}, &simpleType},
MakeFunctionTypeExpression)}; MakeFunctionTypeExpression)};
...@@ -1235,9 +1244,10 @@ struct TorqueGrammar : Grammar { ...@@ -1235,9 +1244,10 @@ struct TorqueGrammar : Grammar {
CastParseResult<LocationExpression*, Expression*>), CastParseResult<LocationExpression*, Expression*>),
Rule({&decimalLiteral}, MakeNumberLiteralExpression), Rule({&decimalLiteral}, MakeNumberLiteralExpression),
Rule({&stringLiteral}, MakeStringLiteralExpression), Rule({&stringLiteral}, MakeStringLiteralExpression),
Rule({&identifier, Token("{"), List<Expression*>(expression, Token(",")), Rule(
Token("}")}, {List<std::string>(Sequence({&identifier, Token("::")})), &identifier,
MakeStructExpression), Token("{"), List<Expression*>(expression, Token(",")), Token("}")},
MakeStructExpression),
Rule({Token("("), expression, Token(")")})}; Rule({Token("("), expression, Token(")")})};
// Result: Expression* // Result: Expression*
......
...@@ -654,7 +654,7 @@ namespace test { ...@@ -654,7 +654,7 @@ namespace test {
macro TestIterator(implicit context: Context)(o: Object, map: Map) { macro TestIterator(implicit context: Context)(o: Object, map: Map) {
try { try {
const t1: Object = iterator::GetIteratorMethod(o); const t1: Object = iterator::GetIteratorMethod(o);
const t2: IteratorRecord = iterator::GetIterator(o); const t2: iterator::IteratorRecord = iterator::GetIterator(o);
const t3: Object = iterator::IteratorStep(t2) otherwise Fail; const t3: Object = iterator::IteratorStep(t2) otherwise Fail;
const t4: Object = iterator::IteratorStep(t2, map) otherwise Fail; const t4: Object = iterator::IteratorStep(t2, map) otherwise Fail;
......
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