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

Unified Diff: runtime/vm/parser.cc

Issue 2966583002: Mark class as typedef class before parsing its function type when using the new (Closed)
Patch Set: work in progress Created 3 years, 6 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
« no previous file with comments | « runtime/vm/object.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/parser.cc
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 32c3ff7bb5d4f2cf6d787db2a26e9aa2310f4611..0ab4794097cc27b1c13f368ede8b8f774cffaa8e 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -5471,24 +5471,27 @@ void Parser::ParseTypedef(const GrowableObjectArray& pending_classes,
function_type_alias.set_is_synthesized_class();
function_type_alias.set_is_abstract();
function_type_alias.set_is_prefinalized();
+ // Make sure the function type alias can be recognized as a typedef class by
+ // setting its signature function. When use_function_type_syntax is true, this
+ // temporary signature function is replaced while parsing the function type.
+ Function& signature_function = Function::Handle(
+ Z, Function::NewSignatureFunction(function_type_alias,
+ Function::Handle(Z), alias_name_pos));
+ function_type_alias.set_signature_function(signature_function);
library_.AddClass(function_type_alias);
+ ASSERT(function_type_alias.IsTypedefClass());
ASSERT(current_class().IsTopLevel());
set_current_class(function_type_alias);
// Parse the type parameters of the typedef class.
ParseTypeParameters(true); // Parameterizing current class.
- Function& signature_function = Function::Handle(Z);
ASSERT(innermost_function().IsNull());
if (use_function_type_syntax) {
ExpectToken(Token::kASSIGN);
ASSERT(result_type.IsNull()); // Not parsed yet.
- // Do not resolve types before the function type alias can be recognized as
- // a typedef class, so that correct promotion of function types can occur.
const Type& function_type = Type::Handle(
Z, ParseFunctionType(result_type, ClassFinalizer::kDoNotResolve));
signature_function = function_type.signature();
} else {
- signature_function = Function::NewSignatureFunction(
- function_type_alias, Function::Handle(Z), alias_name_pos);
innermost_function_ = signature_function.raw();
ParamList params;
// Parse the formal parameters of the function type.
@@ -5511,9 +5514,7 @@ void Parser::ParseTypedef(const GrowableObjectArray& pending_classes,
}
ExpectSemicolon();
ASSERT(innermost_function().IsNull());
-
- // Set the signature function in the function type alias class.
- function_type_alias.set_signature_function(signature_function);
+ ASSERT(function_type_alias.signature_function() == signature_function.raw());
// At this point, all function type parameters have been parsed and the class
// function_type_alias is recognized as a typedef, so we can resolve all type
@@ -13402,6 +13403,12 @@ RawType* Parser::ParseFunctionType(
&params);
AddFormalParamsToFunction(&params, signature_function);
innermost_function_ = innermost_function_.parent_function();
+ if (innermost_function().IsNull() && current_class().IsTypedefClass() &&
+ !IsFunctionTypeSymbol()) {
+ // The last parsed signature function is the typedef signature function.
+ // Set it in the typedef class before building the signature type.
+ current_class().set_signature_function(signature_function);
+ }
type = signature_function.SignatureType();
} while (IsFunctionTypeSymbol());
// At this point, all type parameters have been parsed, resolve the type.
« no previous file with comments | « runtime/vm/object.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698