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

Unified Diff: runtime/vm/parser.cc

Issue 1569213003: Eliminate phase parameter in constructors (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 11 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/parser.h ('k') | runtime/vm/symbols.h » ('j') | 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 0c4a59e0fae235a1270207b21be9f7af6a4984dd..bf9b0842360994764ddef269e773e2a147b9af3a 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -48,7 +48,6 @@ DEFINE_FLAG(bool, load_deferred_eagerly, false,
DEFINE_FLAG(bool, trace_parser, false, "Trace parser operations.");
DEFINE_FLAG(bool, warn_mixin_typedef, true, "Warning on legacy mixin typedef.");
DEFINE_FLAG(bool, link_natives_lazily, false, "Link native calls lazily");
-DEFINE_FLAG(bool, move_super, true, "Move super initializer to end of list.");
DEFINE_FLAG(bool, conditional_directives, false,
"Enable conditional directives");
DEFINE_FLAG(bool, warn_super, false,
@@ -952,13 +951,11 @@ void Parser::ParseFunction(ParsedFunction* parsed_function) {
switch (func.kind()) {
case RawFunction::kClosureFunction:
if (func.IsImplicitClosureFunction()) {
- node_sequence =
- parser.ParseImplicitClosure(func);
+ node_sequence = parser.ParseImplicitClosure(func);
break;
}
if (func.IsConstructorClosureFunction()) {
- node_sequence =
- parser.ParseConstructorClosure(func);
+ node_sequence = parser.ParseConstructorClosure(func);
break;
}
// Fall-through: Handle non-implicit closures.
@@ -1371,8 +1368,8 @@ SequenceNode* Parser::ParseConstructorClosure(const Function& func) {
ASSERT(!constructor.IsNull());
ParamList params;
- // The first parameter of the closure function is the implicit closure
- // argument.
+ // The first parameter of the closure function is the
+ // implicit closure argument.
params.AddFinalParameter(token_pos,
&Symbols::ClosureParameter(),
&Object::dynamic_type());
@@ -2374,7 +2371,6 @@ StaticCallNode* Parser::GenerateSuperConstructorCall(
const Class& cls,
intptr_t supercall_pos,
LocalVariable* receiver,
- AstNode* phase_parameter,
ArgumentListNode* forwarding_args) {
const Class& super_class = Class::Handle(Z, cls.SuperClass());
// Omit the implicit super() if there is no super class (i.e.
@@ -2392,8 +2388,6 @@ StaticCallNode* Parser::GenerateSuperConstructorCall(
// Implicit 'this' parameter is the first argument.
AstNode* implicit_argument = new LoadLocalNode(supercall_pos, receiver);
arguments->Add(implicit_argument);
- // Implicit construction phase parameter is second argument.
- arguments->Add(phase_parameter);
// If this is a super call in a forwarding constructor, add the user-
// defined arguments to the super call and adjust the the super
@@ -2459,14 +2453,7 @@ StaticCallNode* Parser::ParseSuperInitializer(const Class& cls,
// 'this' parameter is the first argument to super class constructor.
AstNode* implicit_argument = new LoadLocalNode(supercall_pos, receiver);
arguments->Add(implicit_argument);
- // Second implicit parameter is the construction phase. We optimistically
- // assume that we can execute both the super initializer and the super
- // constructor body. We may later change this to only execute the
- // super initializer.
- AstNode* phase_parameter =
- new LiteralNode(supercall_pos,
- Smi::ZoneHandle(Z, Smi::New(Function::kCtorPhaseAll)));
- arguments->Add(phase_parameter);
+
// 'this' parameter must not be accessible to the other super call arguments.
receiver->set_invisible(true);
ParseActualParameters(arguments, kAllowConst);
@@ -2794,17 +2781,15 @@ void Parser::ParseInitializers(const Class& cls,
if (super_init_call == NULL) {
// Generate implicit super() if we haven't seen an explicit super call
// or constructor redirection.
- AstNode* phase_parameter = new LiteralNode(
- TokenPos(), Smi::ZoneHandle(Z, Smi::New(Function::kCtorPhaseAll)));
- super_init_call = GenerateSuperConstructorCall(
- cls, TokenPos(), receiver, phase_parameter, NULL);
+ super_init_call =
+ GenerateSuperConstructorCall(cls, TokenPos(), receiver, NULL);
if (super_init_call != NULL) {
super_init_index = current_block_->statements->length();
current_block_->statements->Add(super_init_call);
super_init_is_last = true;
}
}
- if (FLAG_move_super && (super_init_call != NULL) && !super_init_is_last) {
+ if ((super_init_call != NULL) && !super_init_is_last) {
// If the super initializer call is not at the end of the initializer
// list, implicitly move it to the end. The actual parameter values
// are evaluated at the original position in the list and preserved
@@ -2820,10 +2805,10 @@ void Parser::ParseInitializers(const Class& cls,
ASSERT(super_init_index >= 0);
ArgumentListNode* ctor_args = super_init_call->arguments();
LetNode* saved_args = new(Z) LetNode(super_init_call->token_pos());
- // The super initializer call has at least 2 arguments: the
- // implicit receiver, and the hidden construction phase.
- ASSERT(ctor_args->length() >= 2);
- for (int i = 2; i < ctor_args->length(); i++) {
+ // The super initializer call has at least 1 arguments: the
+ // implicit receiver.
+ ASSERT(ctor_args->length() >= 1);
+ for (int i = 1; i < ctor_args->length(); i++) {
AstNode* arg = ctor_args->NodeAt(i);
LocalVariable* temp = CreateTempConstVariable(arg->token_pos(), "sca");
AstNode* save_temp = new(Z) StoreLocalNode(arg->token_pos(), temp, arg);
@@ -2859,11 +2844,7 @@ void Parser::ParseConstructorRedirection(const Class& cls,
// 'this' parameter is the first argument to constructor.
AstNode* implicit_argument = new LoadLocalNode(call_pos, receiver);
arguments->Add(implicit_argument);
- // Construction phase parameter is second argument.
- LocalVariable* phase_param = LookupPhaseParameter();
- ASSERT(phase_param != NULL);
- AstNode* phase_argument = new LoadLocalNode(call_pos, phase_param);
- arguments->Add(phase_argument);
+
receiver->set_invisible(true);
ParseActualParameters(arguments, kAllowConst);
receiver->set_invisible(false);
@@ -2897,12 +2878,6 @@ SequenceNode* Parser::MakeImplicitConstructor(const Function& func) {
Scanner::kNoSourcePos, Symbols::This(), *ReceiverType(current_class()));
current_block_->scope->InsertParameterAt(0, receiver);
- LocalVariable* phase_parameter =
- new LocalVariable(Scanner::kNoSourcePos,
- Symbols::PhaseParameter(),
- Type::ZoneHandle(Z, Type::SmiType()));
- current_block_->scope->InsertParameterAt(1, phase_parameter);
-
// Parse expressions of instance fields that have an explicit
// initializer expression.
// The receiver must not be visible to field initializer expressions.
@@ -2942,9 +2917,9 @@ SequenceNode* Parser::MakeImplicitConstructor(const Function& func) {
}
// Prepare user-defined arguments to be forwarded to super call.
- // The first user-defined argument is at position 2.
+ // The first user-defined argument is at position 1.
forwarding_args = new ArgumentListNode(Scanner::kNoSourcePos);
- for (int i = 2; i < func.NumParameters(); i++) {
+ for (int i = 1; i < func.NumParameters(); i++) {
LocalVariable* param = new LocalVariable(
Scanner::kNoSourcePos,
String::ZoneHandle(Z, func.ParameterNameAt(i)),
@@ -2958,7 +2933,6 @@ SequenceNode* Parser::MakeImplicitConstructor(const Function& func) {
current_class(),
Scanner::kNoSourcePos,
receiver,
- new LoadLocalNode(Scanner::kNoSourcePos, phase_parameter),
forwarding_args);
if (super_call != NULL) {
current_block_->statements->Add(super_call);
@@ -3021,12 +2995,6 @@ SequenceNode* Parser::ParseConstructor(const Function& func) {
ASSERT(current_class().raw() == func.Owner());
params.AddReceiver(ReceiverType(current_class()), func.token_pos());
- // Add implicit parameter for construction phase.
- params.AddFinalParameter(
- TokenPos(),
- &Symbols::PhaseParameter(),
- &Type::ZoneHandle(Z, Type::SmiType()));
-
if (func.is_const()) {
params.SetImplicitlyFinal();
}
@@ -3066,9 +3034,9 @@ SequenceNode* Parser::ParseConstructor(const Function& func) {
// Turn formal field parameters into field initializers.
if (params.has_field_initializer) {
- // First two parameters are implicit receiver and phase.
- ASSERT(params.parameters->length() >= 2);
- for (int i = 2; i < params.parameters->length(); i++) {
+ // The first parameter is the implicit receiver.
+ ASSERT(params.parameters->length() >= 1);
+ for (int i = 1; i < params.parameters->length(); i++) {
ParamDesc& param = (*params.parameters)[i];
if (param.is_field_initializer) {
const String& field_name = *param.name;
@@ -3125,124 +3093,10 @@ SequenceNode* Parser::ParseConstructor(const Function& func) {
}
SequenceNode* init_statements = CloseBlock();
- if (FLAG_move_super) {
- // Ignore the phase parameter.
- current_block_->statements->Add(init_statements);
- } else if (is_redirecting_constructor) {
- // A redirecting super constructor simply passes the phase parameter on to
- // the target which executes the corresponding phase.
- current_block_->statements->Add(init_statements);
- } else if (init_statements->length() > 0) {
- // Generate guard around the initializer code.
- LocalVariable* phase_param = LookupPhaseParameter();
- AstNode* phase_value = new
- LoadLocalNode(Scanner::kNoSourcePos, phase_param);
- AstNode* phase_check = new BinaryOpNode(
- Scanner::kNoSourcePos, Token::kBIT_AND, phase_value,
- new LiteralNode(Scanner::kNoSourcePos,
- Smi::ZoneHandle(Z, Smi::New(Function::kCtorPhaseInit))));
- AstNode* comparison =
- new ComparisonNode(Scanner::kNoSourcePos,
- Token::kNE_STRICT,
- phase_check,
- new LiteralNode(TokenPos(),
- Smi::ZoneHandle(Z, Smi::New(0))));
- AstNode* guarded_init_statements =
- new IfNode(Scanner::kNoSourcePos,
- comparison,
- init_statements,
- NULL);
- current_block_->statements->Add(guarded_init_statements);
- }
-
- // Parsing of initializers done. Now we parse the constructor body
- // and add the implicit super call to the super constructor's body
- // if necessary.
- StaticCallNode* super_call = NULL;
- // Look for the super initializer call in the sequence of initializer
- // statements. If it exists and is not the last initializer statement,
- // we need to create an implicit super call to the super constructor's
- // body.
- // Thus, iterate over all but the last initializer to see whether
- // it's a super constructor call.
- for (int i = 0; i < init_statements->length() - 1; i++) {
- if (init_statements->NodeAt(i)->IsStaticCallNode()) {
- StaticCallNode* static_call =
- init_statements->NodeAt(i)->AsStaticCallNode();
- if (static_call->function().IsGenerativeConstructor()) {
- super_call = static_call;
- break;
- }
- }
- }
- if (super_call != NULL) {
- ASSERT(!FLAG_move_super);
- // Generate an implicit call to the super constructor's body.
- // We need to patch the super _initializer_ call so that it
- // saves the evaluated actual arguments in temporary variables.
- // The temporary variables are necessary so that the argument
- // expressions are not evaluated twice.
- // Note: we should never get here in the case of a redirecting
- // constructor. In that case, the call to the target constructor
- // is the "super call" and is implicitly at the end of the
- // initializer list.
- ASSERT(!is_redirecting_constructor);
- ArgumentListNode* ctor_args = super_call->arguments();
- // The super initializer call has at least 2 arguments: the
- // implicit receiver, and the hidden construction phase.
- ASSERT(ctor_args->length() >= 2);
- for (int i = 2; i < ctor_args->length(); i++) {
- AstNode* arg = ctor_args->NodeAt(i);
- if (!IsSimpleLocalOrLiteralNode(arg)) {
- LocalVariable* temp = CreateTempConstVariable(arg->token_pos(), "sca");
- AstNode* save_temp = new StoreLocalNode(arg->token_pos(), temp, arg);
- ctor_args->SetNodeAt(i, save_temp);
- }
- }
- }
- OpenBlock(); // Block to collect constructor body nodes.
- intptr_t body_pos = TokenPos();
-
- // Insert the implicit super call to the super constructor body.
- if (super_call != NULL) {
- ASSERT(!FLAG_move_super);
- ArgumentListNode* initializer_args = super_call->arguments();
- const Function& super_ctor = super_call->function();
- // Patch the initializer call so it only executes the super initializer.
- initializer_args->SetNodeAt(1, new LiteralNode(
- body_pos, Smi::ZoneHandle(Z, Smi::New(Function::kCtorPhaseInit))));
-
- ArgumentListNode* super_call_args = new ArgumentListNode(body_pos);
- // First argument is the receiver.
- super_call_args->Add(new LoadLocalNode(body_pos, receiver));
- // Second argument is the construction phase argument.
- AstNode* phase_parameter = new(Z) LiteralNode(
- body_pos, Smi::ZoneHandle(Z, Smi::New(Function::kCtorPhaseBody)));
- super_call_args->Add(phase_parameter);
- super_call_args->set_names(initializer_args->names());
- for (int i = 2; i < initializer_args->length(); i++) {
- AstNode* arg = initializer_args->NodeAt(i);
- if (arg->IsLiteralNode()) {
- LiteralNode* lit = arg->AsLiteralNode();
- super_call_args->Add(new LiteralNode(body_pos, lit->literal()));
- } else {
- ASSERT(arg->IsLoadLocalNode() || arg->IsStoreLocalNode());
- if (arg->IsLoadLocalNode()) {
- const LocalVariable& temp = arg->AsLoadLocalNode()->local();
- super_call_args->Add(new LoadLocalNode(body_pos, &temp));
- } else if (arg->IsStoreLocalNode()) {
- const LocalVariable& temp = arg->AsStoreLocalNode()->local();
- super_call_args->Add(new LoadLocalNode(body_pos, &temp));
- }
- }
- }
- ASSERT(super_ctor.AreValidArguments(super_call_args->length(),
- super_call_args->names(),
- NULL));
- current_block_->statements->Add(
- new StaticCallNode(body_pos, super_ctor, super_call_args));
- }
+ current_block_->statements->Add(init_statements);
+ // Parsing of initializers done. Now we parse the constructor body.
+ OpenBlock(); // Block to collect constructor body nodes.
if (CurrentToken() == Token::kLBRACE) {
// We checked in the top-level parse phase that a redirecting
// constructor does not have a body.
@@ -3275,29 +3129,7 @@ SequenceNode* Parser::ParseConstructor(const Function& func) {
SequenceNode* ctor_block = CloseBlock();
if (ctor_block->length() > 0) {
- if (FLAG_move_super) {
- // Ignore the phase parameter.
- current_block_->statements->Add(ctor_block);
- } else {
- // Generate guard around the constructor body code.
- LocalVariable* phase_param = LookupPhaseParameter();
- AstNode* phase_value =
- new LoadLocalNode(Scanner::kNoSourcePos, phase_param);
- AstNode* phase_check =
- new BinaryOpNode(Scanner::kNoSourcePos, Token::kBIT_AND,
- phase_value,
- new LiteralNode(Scanner::kNoSourcePos,
- Smi::ZoneHandle(Smi::New(Function::kCtorPhaseBody))));
- AstNode* comparison =
- new ComparisonNode(Scanner::kNoSourcePos,
- Token::kNE_STRICT,
- phase_check,
- new LiteralNode(body_pos,
- Smi::ZoneHandle(Smi::New(0))));
- AstNode* guarded_block_statements =
- new IfNode(Scanner::kNoSourcePos, comparison, ctor_block, NULL);
- current_block_->statements->Add(guarded_block_statements);
- }
+ current_block_->statements->Add(ctor_block);
}
current_block_->statements->Add(new ReturnNode(func.end_token_pos()));
SequenceNode* statements = CloseBlock();
@@ -3717,13 +3549,6 @@ void Parser::ParseMethodOrConstructor(ClassDesc* members, MemberDesc* method) {
&Symbols::TypeArgumentsParameter(),
&Object::dynamic_type());
}
- // Constructors have an implicit parameter for the construction phase.
- if (method->IsConstructor()) {
- method->params.AddFinalParameter(
- TokenPos(),
- &Symbols::PhaseParameter(),
- &Type::ZoneHandle(Z, Type::SmiType()));
- }
if (are_implicitly_final) {
method->params.SetImplicitlyFinal();
}
@@ -4960,10 +4785,6 @@ void Parser::AddImplicitConstructor(const Class& cls) {
// Add implicit 'this' parameter.
const AbstractType* receiver_type = ReceiverType(cls);
params.AddReceiver(receiver_type, cls.token_pos());
- // Add implicit parameter for construction phase.
- params.AddFinalParameter(cls.token_pos(),
- &Symbols::PhaseParameter(),
- &Type::ZoneHandle(Z, Type::SmiType()));
AddFormalParamsToFunction(&params, ctor);
// The body of the constructor cannot modify the type of the constructed
@@ -7490,13 +7311,6 @@ LocalVariable* Parser::LookupTypeArgumentsParameter(LocalScope* from_scope,
}
-LocalVariable* Parser::LookupPhaseParameter() {
- const bool kTestOnly = false;
- return current_block_->scope->LookupVariable(Symbols::PhaseParameter(),
- kTestOnly);
-}
-
-
void Parser::CaptureInstantiator() {
ASSERT(current_block_->scope->function_level() > 0);
const String* variable_name = current_function().IsInFactoryScope() ?
@@ -12258,8 +12072,8 @@ RawObject* Parser::EvaluateConstConstructorCall(
const Function& constructor,
ArgumentListNode* arguments) {
// Factories have one extra argument: the type arguments.
- // Constructors have 2 extra arguments: rcvr and construction phase.
- const int kNumExtraArgs = constructor.IsFactory() ? 1 : 2;
+ // Constructors have 1 extra arguments: receiver.
+ const int kNumExtraArgs = 1;
const int num_arguments = arguments->length() + kNumExtraArgs;
const Array& arg_values =
Array::Handle(Z, Array::New(num_arguments, Heap::kOld));
@@ -12274,7 +12088,6 @@ RawObject* Parser::EvaluateConstConstructorCall(
TypeArguments::Handle(Z, type_arguments.Canonicalize()));
}
arg_values.SetAt(0, instance);
- arg_values.SetAt(1, Smi::Handle(Z, Smi::New(Function::kCtorPhaseAll)));
} else {
// Prepend type_arguments to list of arguments to factory.
ASSERT(type_arguments.IsZoneHandle());
@@ -13506,8 +13319,7 @@ AstNode* Parser::ParseNewOperator(Token::Kind op_kind) {
// A constructor has an implicit 'this' parameter (instance to construct)
// and a factory has an implicit 'this' parameter (type_arguments).
- // A constructor has a second implicit 'phase' parameter.
- intptr_t arguments_length = arguments->length() + 2;
+ intptr_t arguments_length = arguments->length() + 1;
// An additional type check of the result of a redirecting factory may be
// required.
@@ -13605,10 +13417,6 @@ AstNode* Parser::ParseNewOperator(Token::Kind op_kind) {
constructor_name = constructor.name();
ASSERT(!constructor.IsNull());
}
- if (constructor.IsFactory()) {
- // A factory does not have the implicit 'phase' parameter.
- arguments_length -= 1;
- }
}
ASSERT(!constructor.IsNull());
« no previous file with comments | « runtime/vm/parser.h ('k') | runtime/vm/symbols.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698