Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(427)

Unified Diff: runtime/vm/parser.cc

Issue 2979763002: [VM generic function types] Properly set the scope function after parsing a (Closed)
Patch Set: work in progress Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/vm/parser.cc
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index bd6eec9734317bf05ff31c53df9acc3f6d5f20bc..af71b1a57d697001f9989b8c1e636820f67747a5 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -2270,6 +2270,9 @@ void Parser::ParseFormalParameter(bool allow_explicit_default_value,
&func_params);
signature_function.set_result_type(result_type);
+ // The result type may refer to the signature function's type parameters,
+ // but was not parsed in the scope of the signature function. Adjust.
+ result_type.SetScopeFunction(signature_function);
AddFormalParamsToFunction(&func_params, signature_function);
ASSERT(innermost_function().raw() == signature_function.raw());
@@ -3675,7 +3678,7 @@ SequenceNode* Parser::ParseFunc(const Function& func, bool check_semicolon) {
if (func.parameter_types() == Object::empty_array().raw()) {
AddFormalParamsToFunction(&params, func);
}
- ResolveSignature(func);
+ ResolveSignatureTypeParameters(func);
if (!is_top_level_) {
ClassFinalizer::FinalizeSignature(Class::Handle(Z, func.origin()), func);
}
@@ -4272,7 +4275,11 @@ void Parser::ParseMethodOrConstructor(ClassDesc* members, MemberDesc* method) {
func.set_name(*method->name);
func.set_is_abstract(method->has_abstract);
func.set_is_native(method->has_native);
- func.set_result_type(*method->type); // May set parent_function in type.
+ func.set_result_type(*method->type);
+ // The result type may refer to func's type parameters,
+ // but was not parsed in the scope of func. Adjust.
+ method->type->SetScopeFunction(func);
+
func.set_end_token_pos(method_end_pos);
func.set_is_redirecting(is_redirecting);
func.set_modifier(async_modifier);
@@ -4305,7 +4312,7 @@ void Parser::ParseMethodOrConstructor(ClassDesc* members, MemberDesc* method) {
AddFormalParamsToFunction(&method->params, func);
ASSERT(innermost_function().raw() == func.raw());
innermost_function_ = Function::null();
- ResolveSignature(func);
+ ResolveSignatureTypeParameters(func);
members->AddFunction(func);
}
@@ -4445,7 +4452,7 @@ void Parser::ParseFieldDefinition(ClassDesc* members, MemberDesc* field) {
getter.set_result_type(*field->type);
getter.set_is_debuggable(false);
AddFormalParamsToFunction(&params, getter);
- ResolveSignature(getter);
+ ResolveSignatureTypeParameters(getter);
members->AddFunction(getter);
if (!field->has_final) {
// Build a setter accessor for non-const fields.
@@ -4467,7 +4474,7 @@ void Parser::ParseFieldDefinition(ClassDesc* members, MemberDesc* field) {
setter.set_is_reflectable(false);
}
AddFormalParamsToFunction(&params, setter);
- ResolveSignature(setter);
+ ResolveSignatureTypeParameters(setter);
members->AddFunction(setter);
}
}
@@ -4728,7 +4735,7 @@ void Parser::ParseClassMemberDefinition(ClassDesc* members,
}
if (!member.type->IsResolved()) {
AbstractType& type = AbstractType::ZoneHandle(Z, member.type->raw());
- ResolveType(&type);
+ ResolveTypeParameters(&type);
member.type = &type;
}
ParseFieldDefinition(members, &member);
@@ -5084,7 +5091,7 @@ void Parser::ParseEnumDefinition(const Class& cls) {
ParamList params;
params.AddReceiver(&Object::dynamic_type(), cls.token_pos());
AddFormalParamsToFunction(&params, getter);
- ResolveSignature(getter);
+ ResolveSignatureTypeParameters(getter);
enum_members.AddFunction(getter);
ASSERT(IsIdentifier());
@@ -5212,7 +5219,7 @@ void Parser::ParseEnumDefinition(const Class& cls) {
ParamList name_params;
name_params.AddReceiver(&Object::dynamic_type(), cls.token_pos());
AddFormalParamsToFunction(&name_params, name_getter);
- ResolveSignature(name_getter);
+ ResolveSignatureTypeParameters(name_getter);
enum_members.AddFunction(name_getter);
// Clone the toString() function from the helper class.
@@ -5263,7 +5270,7 @@ void Parser::AddImplicitConstructor(const Class& cls) {
AddFormalParamsToFunction(&params, ctor);
ctor.set_result_type(Object::dynamic_type());
- ResolveSignature(ctor);
+ ResolveSignatureTypeParameters(ctor);
// The body of the constructor cannot modify the type of the constructed
// instance, which is passed in as the receiver.
ctor.set_result_type(*receiver_type);
@@ -5514,6 +5521,9 @@ void Parser::ParseTypedef(const GrowableObjectArray& pending_classes,
result_type = Type::DynamicType();
}
signature_function.set_result_type(result_type);
+ // The result type may refer to the signature function's type parameters,
+ // but was not parsed in the scope of the signature function. Adjust.
+ result_type.SetScopeFunction(signature_function);
AddFormalParamsToFunction(&params, signature_function);
ASSERT(innermost_function().raw() == signature_function.raw());
innermost_function_ = Function::null();
@@ -5528,7 +5538,7 @@ void Parser::ParseTypedef(const GrowableObjectArray& pending_classes,
AbstractType& function_type =
Type::Handle(Z, signature_function.SignatureType());
ASSERT(current_class().raw() == function_type_alias.raw());
- ResolveType(&function_type);
+ ResolveTypeParameters(&function_type);
// Resolving does not replace type or signature.
ASSERT(function_type_alias.signature_function() ==
Type::Cast(function_type).signature());
@@ -5741,7 +5751,7 @@ void Parser::ParseTypeParameters(bool parameterizing_class) {
for (intptr_t i = 0; i < num_types; i++) {
type_parameter ^= type_parameters.TypeAt(i);
type_parameter_bound = type_parameter.bound();
- ResolveType(&type_parameter_bound);
+ ResolveTypeParameters(&type_parameter_bound);
type_parameter.set_bound(type_parameter_bound);
}
}
@@ -6057,6 +6067,9 @@ void Parser::ParseTopLevelFunction(TopLevel* top_level,
ReportError("function block expected");
}
func.set_result_type(result_type);
+ // The result type may refer to func's type parameters,
+ // but was not parsed in the scope of func. Adjust.
+ result_type.SetScopeFunction(func);
func.set_end_token_pos(function_end_pos);
func.set_modifier(func_modifier);
if (library_.is_dart_scheme() && library_.IsPrivate(func_name)) {
@@ -6068,7 +6081,7 @@ void Parser::ParseTopLevelFunction(TopLevel* top_level,
AddFormalParamsToFunction(&params, func);
ASSERT(innermost_function().raw() == func.raw());
innermost_function_ = Function::null();
- ResolveSignature(func);
+ ResolveSignatureTypeParameters(func);
top_level->AddFunction(func);
if (!is_patch) {
library_.AddObject(func, func_name);
@@ -6213,6 +6226,9 @@ void Parser::ParseTopLevelAccessor(TopLevel* top_level,
/* is_abstract = */ false, is_external, is_native, owner,
decl_begin_pos));
func.set_result_type(result_type);
+ // The result type may refer to func's type parameters,
+ // but was not parsed in the scope of func. Adjust.
+ result_type.SetScopeFunction(func);
func.set_end_token_pos(accessor_end_pos);
func.set_modifier(func_modifier);
if (is_native) {
@@ -6223,7 +6239,7 @@ void Parser::ParseTopLevelAccessor(TopLevel* top_level,
func.set_is_reflectable(false);
}
AddFormalParamsToFunction(&params, func);
- ResolveSignature(func);
+ ResolveSignatureTypeParameters(func);
top_level->AddFunction(func);
if (!is_patch) {
library_.AddObject(func, accessor_name);
@@ -7077,7 +7093,7 @@ RawFunction* Parser::OpenSyncGeneratorFunction(TokenPosition func_pos) {
if (is_new_closure) {
// Add the parameters to the newly created closure.
AddFormalParamsToFunction(&closure_params, body);
- ResolveSignature(body);
+ ResolveSignatureTypeParameters(body);
// Finalize function type.
Type& signature_type = Type::Handle(Z, body.SignatureType());
signature_type ^= CanonicalizeType(signature_type);
@@ -7205,7 +7221,7 @@ RawFunction* Parser::OpenAsyncFunction(TokenPosition async_func_pos) {
if (is_new_closure) {
// Add the parameters to the newly created closure.
AddFormalParamsToFunction(&closure_params, closure);
- ResolveSignature(closure);
+ ResolveSignatureTypeParameters(closure);
// Finalize function type.
Type& signature_type = Type::Handle(Z, closure.SignatureType());
@@ -7343,7 +7359,7 @@ RawFunction* Parser::OpenAsyncGeneratorFunction(TokenPosition async_func_pos) {
if (is_new_closure) {
// Add the parameters to the newly created closure.
AddFormalParamsToFunction(&closure_params, closure);
- ResolveSignature(closure);
+ ResolveSignatureTypeParameters(closure);
// Finalize function type.
Type& signature_type = Type::Handle(Z, closure.SignatureType());
@@ -7784,7 +7800,7 @@ void Parser::FinalizeFormalParameterTypes(const ParamList* params) {
for (int i = 0; i < num_parameters; i++) {
ParamDesc& param_desc = (*params->parameters)[i];
type = param_desc.type->raw();
- ResolveType(&type);
+ ResolveTypeParameters(&type);
type = CanonicalizeType(type);
if (type.raw() != param_desc.type->raw()) {
param_desc.type = &AbstractType::ZoneHandle(Z, type.raw());
@@ -8166,6 +8182,9 @@ AstNode* Parser::ParseFunctionStatement(bool is_literal) {
function = Function::NewClosureFunction(*function_name,
innermost_function(), function_pos);
function.set_result_type(result_type);
+ // The result type may refer to the function's type parameters,
+ // but was not parsed in the scope of the function. Adjust.
+ result_type.SetScopeFunction(function);
if (FLAG_enable_mirrors && metadata_pos.IsReal()) {
library_.AddFunctionMetadata(function, metadata_pos);
}
@@ -8231,8 +8250,9 @@ AstNode* Parser::ParseFunctionStatement(bool is_literal) {
// variables of this function's scope that are referenced by the local
// function (and its inner nested functions) will be marked as captured.
- ResolveType(&result_type); // Parameter types are resolved in ParseFunc.
- function.set_result_type(result_type);
+ ResolveTypeParameters(&result_type);
+ function.set_result_type(result_type); // Update type without scope change.
+ // Type parameters appearing in parameter types are resolved in ParseFunc.
statements = Parser::ParseFunc(function, !is_literal);
INC_STAT(thread(), num_functions_parsed, 1);
@@ -12556,7 +12576,7 @@ AstNode* Parser::ParsePostfixExpr() {
// Resolve the type parameters that may appear in the given signature from the
// signature function and current class.
// Unresolved type classes get resolved later by the class finalizer.
-void Parser::ResolveSignature(const Function& signature) {
+void Parser::ResolveSignatureTypeParameters(const Function& signature) {
const Function& saved_innermost_function =
Function::Handle(Z, innermost_function().raw());
innermost_function_ = signature.raw();
@@ -12570,19 +12590,19 @@ void Parser::ResolveSignature(const Function& signature) {
for (intptr_t i = 0; i < num_type_params; i++) {
type_param ^= type_params.TypeAt(i);
type = type_param.bound();
- ResolveType(&type);
+ ResolveTypeParameters(&type);
type_param.set_bound(type);
}
}
// Resolve result type.
type = signature.result_type();
- ResolveType(&type);
- signature.set_result_type(type);
+ ResolveTypeParameters(&type);
+ signature.set_result_type(type); // Update type without scope change.
// Resolve formal parameter types.
const intptr_t num_parameters = signature.NumParameters();
for (intptr_t i = 0; i < num_parameters; i++) {
type = signature.ParameterTypeAt(i);
- ResolveType(&type);
+ ResolveTypeParameters(&type);
signature.SetParameterTypeAt(i, type);
}
innermost_function_ = saved_innermost_function.raw();
@@ -12592,7 +12612,7 @@ void Parser::ResolveSignature(const Function& signature) {
// Resolve the type parameters that may appear in the given type and in its type
// arguments from the current function and current class.
// Unresolved type classes get resolved later by the class finalizer.
-void Parser::ResolveType(AbstractType* type) {
+void Parser::ResolveTypeParameters(AbstractType* type) {
ASSERT(type != NULL);
if (type->IsResolved()) {
// Some types are resolved by definition, such as a TypeParameter.
@@ -12671,7 +12691,7 @@ void Parser::ResolveType(AbstractType* type) {
AbstractType& type_argument = AbstractType::Handle(Z);
for (intptr_t i = 0; i < num_arguments; i++) {
type_argument = arguments.TypeAt(i);
- ResolveType(&type_argument);
+ ResolveTypeParameters(&type_argument);
arguments.SetTypeAt(i, type_argument);
}
}
@@ -12681,9 +12701,9 @@ void Parser::ResolveType(AbstractType* type) {
Function::Handle(Z, Type::Cast(*type).signature());
Type& signature_type = Type::Handle(Z, signature.SignatureType());
if (signature_type.raw() != type->raw()) {
- ResolveType(&signature_type);
+ ResolveTypeParameters(&signature_type);
} else {
- ResolveSignature(signature);
+ ResolveSignatureTypeParameters(signature);
}
}
}
@@ -13345,7 +13365,7 @@ RawAbstractType* Parser::ParseTypeOrFunctionType(
return Type::DynamicType();
}
if (finalization >= ClassFinalizer::kResolveTypeParameters) {
- ResolveType(&type);
+ ResolveTypeParameters(&type);
if (finalization >= ClassFinalizer::kCanonicalize) {
type ^= CanonicalizeType(type);
}
@@ -13384,6 +13404,9 @@ RawType* Parser::ParseFunctionType(
TokenPosition::kNoSource));
innermost_function_ = signature_function.raw();
signature_function.set_result_type(type);
+ // The result type may refer to the signature function's type parameters,
+ // but was not parsed in the scope of the signature function. Adjust.
+ type.SetScopeFunction(signature_function);
// Parse optional type parameters.
if (CurrentToken() == Token::kLT) {
if (!FLAG_generic_method_syntax) {
@@ -13422,7 +13445,7 @@ RawType* Parser::ParseFunctionType(
return Type::DynamicType();
}
if (finalization >= ClassFinalizer::kResolveTypeParameters) {
- ResolveType(&type);
+ ResolveTypeParameters(&type);
if (finalization >= ClassFinalizer::kCanonicalize) {
type ^= CanonicalizeType(type);
}
@@ -13538,7 +13561,7 @@ RawAbstractType* Parser::ParseType(
AbstractType& type = AbstractType::Handle(
Z, Type::New(type_class, type_arguments, ident_pos, Heap::kOld));
if (finalization >= ClassFinalizer::kResolveTypeParameters) {
- ResolveType(&type);
+ ResolveTypeParameters(&type);
if (finalization >= ClassFinalizer::kCanonicalize) {
type ^= CanonicalizeType(type);
}
@@ -14093,7 +14116,7 @@ RawFunction* Parser::BuildConstructorClosureFunction(const Function& ctr,
// TODO(regis): Verify that the closure cannot be generic.
closure.set_result_type(Object::dynamic_type());
AddFormalParamsToFunction(&params, closure);
- ResolveSignature(closure);
+ ResolveSignatureTypeParameters(closure);
// Finalize function type.
Type& signature_type = Type::Handle(Z, closure.SignatureType());

Powered by Google App Engine
This is Rietveld 408576698