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

Side by Side Diff: runtime/vm/parser.cc

Issue 1589643002: Source positions for constructors and lots of async machinery (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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/parser.h" 5 #include "vm/parser.h"
6 #include "vm/flags.h" 6 #include "vm/flags.h"
7 7
8 #ifndef DART_PRECOMPILED 8 #ifndef DART_PRECOMPILED
9 9
10 #include "lib/invocation_mirror.h" 10 #include "lib/invocation_mirror.h"
(...skipping 1293 matching lines...) Expand 10 before | Expand all | Expand 10 after
1304 field_name = Field::NameFromGetter(field_name); 1304 field_name = Field::NameFromGetter(field_name);
1305 1305
1306 const Class& field_class = Class::Handle(Z, func.Owner()); 1306 const Class& field_class = Class::Handle(Z, func.Owner());
1307 const Field& field = 1307 const Field& field =
1308 Field::ZoneHandle(Z, field_class.LookupInstanceField(field_name)); 1308 Field::ZoneHandle(Z, field_class.LookupInstanceField(field_name));
1309 ASSERT(!field.IsNull()); 1309 ASSERT(!field.IsNull());
1310 1310
1311 LoadInstanceFieldNode* load_field = 1311 LoadInstanceFieldNode* load_field =
1312 new LoadInstanceFieldNode(ident_pos, load_receiver, field); 1312 new LoadInstanceFieldNode(ident_pos, load_receiver, field);
1313 1313
1314 ReturnNode* return_node = new ReturnNode(Scanner::kNoSourcePos, load_field); 1314 ReturnNode* return_node = new ReturnNode(ident_pos, load_field);
1315 current_block_->statements->Add(return_node); 1315 current_block_->statements->Add(return_node);
1316 return CloseBlock(); 1316 return CloseBlock();
1317 } 1317 }
1318 1318
1319 1319
1320 // Create AstNodes for an implicit instance setter method: 1320 // Create AstNodes for an implicit instance setter method:
1321 // LoadLocalNode 0 ('this') 1321 // LoadLocalNode 0 ('this')
1322 // LoadLocalNode 1 ('value') 1322 // LoadLocalNode 1 ('value')
1323 // SetInstanceField (field_name); 1323 // SetInstanceField (field_name);
1324 // ReturnNode (void); 1324 // ReturnNode (void);
(...skipping 23 matching lines...) Expand all
1348 1348
1349 LoadLocalNode* receiver = 1349 LoadLocalNode* receiver =
1350 new LoadLocalNode(ident_pos, current_block_->scope->VariableAt(0)); 1350 new LoadLocalNode(ident_pos, current_block_->scope->VariableAt(0));
1351 LoadLocalNode* value = 1351 LoadLocalNode* value =
1352 new LoadLocalNode(ident_pos, current_block_->scope->VariableAt(1)); 1352 new LoadLocalNode(ident_pos, current_block_->scope->VariableAt(1));
1353 1353
1354 EnsureExpressionTemp(); 1354 EnsureExpressionTemp();
1355 StoreInstanceFieldNode* store_field = 1355 StoreInstanceFieldNode* store_field =
1356 new StoreInstanceFieldNode(ident_pos, receiver, field, value); 1356 new StoreInstanceFieldNode(ident_pos, receiver, field, value);
1357 current_block_->statements->Add(store_field); 1357 current_block_->statements->Add(store_field);
1358 current_block_->statements->Add(new ReturnNode(Scanner::kNoSourcePos)); 1358 current_block_->statements->Add(new ReturnNode(ident_pos));
1359 return CloseBlock(); 1359 return CloseBlock();
1360 } 1360 }
1361 1361
1362 1362
1363 SequenceNode* Parser::ParseConstructorClosure(const Function& func) { 1363 SequenceNode* Parser::ParseConstructorClosure(const Function& func) {
1364 TRACE_PARSER("ParseConstructorClosure"); 1364 TRACE_PARSER("ParseConstructorClosure");
1365 const intptr_t token_pos = func.token_pos(); 1365 const intptr_t token_pos = func.token_pos();
1366 1366
1367 Function& constructor = Function::ZoneHandle(Z); 1367 Function& constructor = Function::ZoneHandle(Z);
1368 TypeArguments& type_args = TypeArguments::ZoneHandle(Z); 1368 TypeArguments& type_args = TypeArguments::ZoneHandle(Z);
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
1476 return CloseBlock(); 1476 return CloseBlock();
1477 } 1477 }
1478 1478
1479 1479
1480 SequenceNode* Parser::ParseMethodExtractor(const Function& func) { 1480 SequenceNode* Parser::ParseMethodExtractor(const Function& func) {
1481 TRACE_PARSER("ParseMethodExtractor"); 1481 TRACE_PARSER("ParseMethodExtractor");
1482 1482
1483 ParamList params; 1483 ParamList params;
1484 1484
1485 const intptr_t ident_pos = func.token_pos(); 1485 const intptr_t ident_pos = func.token_pos();
1486 ASSERT(func.token_pos() == 0); 1486 ASSERT(func.token_pos() == ClassifyingTokenPositions::kMethodExtractor);
1487 ASSERT(current_class().raw() == func.Owner()); 1487 ASSERT(current_class().raw() == func.Owner());
1488 params.AddReceiver(ReceiverType(current_class()), ident_pos); 1488 params.AddReceiver(ReceiverType(current_class()), ident_pos);
1489 ASSERT(func.num_fixed_parameters() == 1); // Receiver. 1489 ASSERT(func.num_fixed_parameters() == 1); // Receiver.
1490 ASSERT(!func.HasOptionalParameters()); 1490 ASSERT(!func.HasOptionalParameters());
1491 1491
1492 // Build local scope for function and populate with the formal parameters. 1492 // Build local scope for function and populate with the formal parameters.
1493 OpenFunctionBlock(func); 1493 OpenFunctionBlock(func);
1494 AddFormalParamsToScope(&params, current_block_->scope); 1494 AddFormalParamsToScope(&params, current_block_->scope);
1495 1495
1496 // Receiver is local 0. 1496 // Receiver is local 0.
1497 LocalVariable* receiver = current_block_->scope->VariableAt(0); 1497 LocalVariable* receiver = current_block_->scope->VariableAt(0);
1498 LoadLocalNode* load_receiver = new LoadLocalNode(ident_pos, receiver); 1498 LoadLocalNode* load_receiver = new LoadLocalNode(ident_pos, receiver);
1499 1499
1500 ClosureNode* closure = new ClosureNode( 1500 ClosureNode* closure = new ClosureNode(
1501 ident_pos, 1501 ident_pos,
1502 Function::ZoneHandle(Z, func.extracted_method_closure()), 1502 Function::ZoneHandle(Z, func.extracted_method_closure()),
1503 load_receiver, 1503 load_receiver,
1504 NULL); 1504 NULL);
1505 1505
1506 ReturnNode* return_node = new ReturnNode(Scanner::kNoSourcePos, closure); 1506 ReturnNode* return_node = new ReturnNode(ident_pos, closure);
1507 current_block_->statements->Add(return_node); 1507 current_block_->statements->Add(return_node);
1508 return CloseBlock(); 1508 return CloseBlock();
1509 } 1509 }
1510 1510
1511 1511
1512 void Parser::BuildDispatcherScope(const Function& func, 1512 void Parser::BuildDispatcherScope(const Function& func,
1513 const ArgumentsDescriptor& desc) { 1513 const ArgumentsDescriptor& desc) {
1514 ParamList params; 1514 ParamList params;
1515 // Receiver first. 1515 // Receiver first.
1516 intptr_t token_pos = func.token_pos(); 1516 intptr_t token_pos = func.token_pos();
(...skipping 1396 matching lines...) Expand 10 before | Expand all | Expand 10 after
2913 "forwarding to a super class constructor with optional " 2913 "forwarding to a super class constructor with optional "
2914 "parameters; add a constructor without optional parameters " 2914 "parameters; add a constructor without optional parameters "
2915 "to class '%s' that redirects to the constructor with " 2915 "to class '%s' that redirects to the constructor with "
2916 "optional parameters and invoke it via super from a " 2916 "optional parameters and invoke it via super from a "
2917 "constructor of the class extending the mixin application", 2917 "constructor of the class extending the mixin application",
2918 String::Handle(Z, super_class.Name()).ToCString()); 2918 String::Handle(Z, super_class.Name()).ToCString());
2919 } 2919 }
2920 2920
2921 // Prepare user-defined arguments to be forwarded to super call. 2921 // Prepare user-defined arguments to be forwarded to super call.
2922 // The first user-defined argument is at position 1. 2922 // The first user-defined argument is at position 1.
2923 forwarding_args = new ArgumentListNode(Scanner::kNoSourcePos); 2923 forwarding_args = new ArgumentListNode(ctor_pos);
2924 for (int i = 1; i < func.NumParameters(); i++) { 2924 for (int i = 1; i < func.NumParameters(); i++) {
2925 LocalVariable* param = new LocalVariable( 2925 LocalVariable* param = new LocalVariable(
2926 Scanner::kNoSourcePos, 2926 Scanner::kNoSourcePos,
2927 String::ZoneHandle(Z, func.ParameterNameAt(i)), 2927 String::ZoneHandle(Z, func.ParameterNameAt(i)),
2928 Object::dynamic_type()); 2928 Object::dynamic_type());
2929 current_block_->scope->InsertParameterAt(i, param); 2929 current_block_->scope->InsertParameterAt(i, param);
2930 forwarding_args->Add(new LoadLocalNode(Scanner::kNoSourcePos, param)); 2930 forwarding_args->Add(new LoadLocalNode(ctor_pos, param));
2931 } 2931 }
2932 } 2932 }
2933 2933
2934 AstNode* super_call = GenerateSuperConstructorCall( 2934 AstNode* super_call = GenerateSuperConstructorCall(
2935 current_class(), 2935 current_class(),
2936 Scanner::kNoSourcePos, 2936 ctor_pos,
2937 receiver, 2937 receiver,
2938 forwarding_args); 2938 forwarding_args);
2939 if (super_call != NULL) { 2939 if (super_call != NULL) {
2940 current_block_->statements->Add(super_call); 2940 current_block_->statements->Add(super_call);
2941 } 2941 }
2942 CheckFieldsInitialized(current_class()); 2942 CheckFieldsInitialized(current_class());
2943 2943
2944 // Empty constructor body. 2944 // Empty constructor body.
2945 current_block_->statements->Add(new ReturnNode(Scanner::kNoSourcePos)); 2945 current_block_->statements->Add(new ReturnNode(ctor_pos));
2946 SequenceNode* statements = CloseBlock(); 2946 SequenceNode* statements = CloseBlock();
2947 return statements; 2947 return statements;
2948 } 2948 }
2949 2949
2950 2950
2951 void Parser::CheckRecursiveInvocation() { 2951 void Parser::CheckRecursiveInvocation() {
2952 const GrowableObjectArray& pending_functions = 2952 const GrowableObjectArray& pending_functions =
2953 GrowableObjectArray::Handle(Z, T->pending_functions()); 2953 GrowableObjectArray::Handle(Z, T->pending_functions());
2954 for (int i = 0; i < pending_functions.Length(); i++) { 2954 for (int i = 0; i < pending_functions.Length(); i++) {
2955 if (pending_functions.At(i) == current_function().raw()) { 2955 if (pending_functions.At(i) == current_function().raw()) {
(...skipping 4121 matching lines...) Expand 10 before | Expand all | Expand 10 after
7077 const Function& completer_constructor = Function::ZoneHandle(Z, 7077 const Function& completer_constructor = Function::ZoneHandle(Z,
7078 completer.LookupFunction(Symbols::CompleterSyncConstructor())); 7078 completer.LookupFunction(Symbols::CompleterSyncConstructor()));
7079 ASSERT(!completer_constructor.IsNull()); 7079 ASSERT(!completer_constructor.IsNull());
7080 7080
7081 LocalVariable* async_completer = current_block_->scope->LookupVariable( 7081 LocalVariable* async_completer = current_block_->scope->LookupVariable(
7082 Symbols::AsyncCompleter(), false); 7082 Symbols::AsyncCompleter(), false);
7083 7083
7084 // Add to AST: 7084 // Add to AST:
7085 // :async_completer = new Completer.sync(); 7085 // :async_completer = new Completer.sync();
7086 ArgumentListNode* empty_args = 7086 ArgumentListNode* empty_args =
7087 new (Z) ArgumentListNode(Scanner::kNoSourcePos); 7087 new (Z) ArgumentListNode(closure_body->token_pos());
7088 ConstructorCallNode* completer_constructor_node = new (Z) ConstructorCallNode( 7088 ConstructorCallNode* completer_constructor_node = new (Z) ConstructorCallNode(
7089 Scanner::kNoSourcePos, 7089 closure_body->token_pos(),
7090 TypeArguments::ZoneHandle(Z), 7090 TypeArguments::ZoneHandle(Z),
7091 completer_constructor, 7091 completer_constructor,
7092 empty_args); 7092 empty_args);
7093 StoreLocalNode* store_completer = new (Z) StoreLocalNode( 7093 StoreLocalNode* store_completer = new (Z) StoreLocalNode(
7094 Scanner::kNoSourcePos, 7094 closure_body->token_pos(),
7095 async_completer, 7095 async_completer,
7096 completer_constructor_node); 7096 completer_constructor_node);
7097 current_block_->statements->Add(store_completer); 7097 current_block_->statements->Add(store_completer);
7098 7098
7099 // :await_jump_var = -1; 7099 // :await_jump_var = -1;
7100 LocalVariable* jump_var = 7100 LocalVariable* jump_var =
7101 current_block_->scope->LookupVariable(Symbols::AwaitJumpVar(), false); 7101 current_block_->scope->LookupVariable(Symbols::AwaitJumpVar(), false);
7102 LiteralNode* init_value = 7102 LiteralNode* init_value =
7103 new(Z) LiteralNode(Scanner::kNoSourcePos, Smi::ZoneHandle(Smi::New(-1))); 7103 new(Z) LiteralNode(closure_body->token_pos(),
7104 Smi::ZoneHandle(Smi::New(-1)));
7104 current_block_->statements->Add( 7105 current_block_->statements->Add(
7105 new(Z) StoreLocalNode(Scanner::kNoSourcePos, jump_var, init_value)); 7106 new(Z) StoreLocalNode(closure_body->token_pos(), jump_var, init_value));
7106 7107
7107 // Add to AST: 7108 // Add to AST:
7108 // :async_op = <closure>; (containing the original body) 7109 // :async_op = <closure>; (containing the original body)
7109 LocalVariable* async_op_var = current_block_->scope->LookupVariable( 7110 LocalVariable* async_op_var = current_block_->scope->LookupVariable(
7110 Symbols::AsyncOperation(), false); 7111 Symbols::AsyncOperation(), false);
7111 ClosureNode* cn = new(Z) ClosureNode( 7112 ClosureNode* cn = new(Z) ClosureNode(
7112 Scanner::kNoSourcePos, closure, NULL, closure_body->scope()); 7113 closure_body->token_pos(), closure, NULL, closure_body->scope());
7113 StoreLocalNode* store_async_op = new (Z) StoreLocalNode( 7114 StoreLocalNode* store_async_op = new (Z) StoreLocalNode(
7114 Scanner::kNoSourcePos, 7115 closure_body->token_pos(),
7115 async_op_var, 7116 async_op_var,
7116 cn); 7117 cn);
7117 current_block_->statements->Add(store_async_op); 7118 current_block_->statements->Add(store_async_op);
7118 7119
7119 const Library& async_lib = Library::Handle(Library::AsyncLibrary()); 7120 const Library& async_lib = Library::Handle(Library::AsyncLibrary());
7120 // :async_then_callback = _asyncThenWrapperHelper(:async_op) 7121 // :async_then_callback = _asyncThenWrapperHelper(:async_op)
7121 const Function& async_then_wrapper_helper = Function::ZoneHandle( 7122 const Function& async_then_wrapper_helper = Function::ZoneHandle(
7122 Z, async_lib.LookupFunctionAllowPrivate( 7123 Z, async_lib.LookupFunctionAllowPrivate(
7123 Symbols::AsyncThenWrapperHelper())); 7124 Symbols::AsyncThenWrapperHelper()));
7124 ASSERT(!async_then_wrapper_helper.IsNull()); 7125 ASSERT(!async_then_wrapper_helper.IsNull());
7125 ArgumentListNode* async_then_wrapper_helper_args = new (Z) ArgumentListNode( 7126 ArgumentListNode* async_then_wrapper_helper_args = new (Z) ArgumentListNode(
7126 Scanner::kNoSourcePos); 7127 closure_body->token_pos());
7127 async_then_wrapper_helper_args->Add( 7128 async_then_wrapper_helper_args->Add(
7128 new (Z) LoadLocalNode(Scanner::kNoSourcePos, async_op_var)); 7129 new (Z) LoadLocalNode(closure_body->token_pos(), async_op_var));
7129 StaticCallNode* then_wrapper_call = new (Z) StaticCallNode( 7130 StaticCallNode* then_wrapper_call = new (Z) StaticCallNode(
7130 Scanner::kNoSourcePos, 7131 closure_body->token_pos(),
7131 async_then_wrapper_helper, 7132 async_then_wrapper_helper,
7132 async_then_wrapper_helper_args); 7133 async_then_wrapper_helper_args);
7133 LocalVariable* async_then_callback_var = 7134 LocalVariable* async_then_callback_var =
7134 current_block_->scope->LookupVariable( 7135 current_block_->scope->LookupVariable(
7135 Symbols::AsyncThenCallback(), false); 7136 Symbols::AsyncThenCallback(), false);
7136 StoreLocalNode* store_async_then_callback = new (Z) StoreLocalNode( 7137 StoreLocalNode* store_async_then_callback = new (Z) StoreLocalNode(
7137 Scanner::kNoSourcePos, 7138 closure_body->token_pos(),
7138 async_then_callback_var, 7139 async_then_callback_var,
7139 then_wrapper_call); 7140 then_wrapper_call);
7140 7141
7141 current_block_->statements->Add(store_async_then_callback); 7142 current_block_->statements->Add(store_async_then_callback);
7142 7143
7143 // :async_catch_error_callback = _asyncErrorWrapperHelper(:async_op) 7144 // :async_catch_error_callback = _asyncErrorWrapperHelper(:async_op)
7144 7145
7145 const Function& async_error_wrapper_helper = Function::ZoneHandle( 7146 const Function& async_error_wrapper_helper = Function::ZoneHandle(
7146 Z, async_lib.LookupFunctionAllowPrivate( 7147 Z, async_lib.LookupFunctionAllowPrivate(
7147 Symbols::AsyncErrorWrapperHelper())); 7148 Symbols::AsyncErrorWrapperHelper()));
7148 ASSERT(!async_error_wrapper_helper.IsNull()); 7149 ASSERT(!async_error_wrapper_helper.IsNull());
7149 ArgumentListNode* async_error_wrapper_helper_args = new (Z) ArgumentListNode( 7150 ArgumentListNode* async_error_wrapper_helper_args = new (Z) ArgumentListNode(
7150 Scanner::kNoSourcePos); 7151 closure_body->token_pos());
7151 async_error_wrapper_helper_args->Add( 7152 async_error_wrapper_helper_args->Add(
7152 new (Z) LoadLocalNode(Scanner::kNoSourcePos, async_op_var)); 7153 new (Z) LoadLocalNode(closure_body->token_pos(), async_op_var));
7153 StaticCallNode* error_wrapper_call = new (Z) StaticCallNode( 7154 StaticCallNode* error_wrapper_call = new (Z) StaticCallNode(
7154 Scanner::kNoSourcePos, 7155 closure_body->token_pos(),
7155 async_error_wrapper_helper, 7156 async_error_wrapper_helper,
7156 async_error_wrapper_helper_args); 7157 async_error_wrapper_helper_args);
7157 LocalVariable* async_catch_error_callback_var = 7158 LocalVariable* async_catch_error_callback_var =
7158 current_block_->scope->LookupVariable( 7159 current_block_->scope->LookupVariable(
7159 Symbols::AsyncCatchErrorCallback(), false); 7160 Symbols::AsyncCatchErrorCallback(), false);
7160 StoreLocalNode* store_async_catch_error_callback = new (Z) StoreLocalNode( 7161 StoreLocalNode* store_async_catch_error_callback = new (Z) StoreLocalNode(
7161 Scanner::kNoSourcePos, 7162 closure_body->token_pos(),
7162 async_catch_error_callback_var, 7163 async_catch_error_callback_var,
7163 error_wrapper_call); 7164 error_wrapper_call);
7164 7165
7165 current_block_->statements->Add(store_async_catch_error_callback); 7166 current_block_->statements->Add(store_async_catch_error_callback);
7166 7167
7167 // Add to AST: 7168 // Add to AST:
7168 // new Future.microtask(:async_op); 7169 // new Future.microtask(:async_op);
7169 ArgumentListNode* arguments = new (Z) ArgumentListNode(Scanner::kNoSourcePos); 7170 ArgumentListNode* arguments =
7171 new (Z) ArgumentListNode(closure_body->token_pos());
7170 arguments->Add(new (Z) LoadLocalNode( 7172 arguments->Add(new (Z) LoadLocalNode(
7171 Scanner::kNoSourcePos, async_op_var)); 7173 closure_body->token_pos(), async_op_var));
7172 ConstructorCallNode* future_node = new (Z) ConstructorCallNode( 7174 ConstructorCallNode* future_node = new (Z) ConstructorCallNode(
7173 Scanner::kNoSourcePos, TypeArguments::ZoneHandle(Z), constructor, 7175 closure_body->token_pos(), TypeArguments::ZoneHandle(Z), constructor,
7174 arguments); 7176 arguments);
7175 current_block_->statements->Add(future_node); 7177 current_block_->statements->Add(future_node);
7176 7178
7177 // Add to AST: 7179 // Add to AST:
7178 // return :async_completer.future; 7180 // return :async_completer.future;
7179 ReturnNode* return_node = new (Z) ReturnNode( 7181 ReturnNode* return_node = new (Z) ReturnNode(
7180 Scanner::kNoSourcePos, 7182 closure_body->token_pos(),
7181 new (Z) InstanceGetterNode( 7183 new (Z) InstanceGetterNode(
7182 Scanner::kNoSourcePos, 7184 closure_body->token_pos(),
7183 new (Z) LoadLocalNode( 7185 new (Z) LoadLocalNode(
7184 Scanner::kNoSourcePos, 7186 closure_body->token_pos(),
7185 async_completer), 7187 async_completer),
7186 Symbols::CompleterFuture())); 7188 Symbols::CompleterFuture()));
7187 current_block_->statements->Add(return_node); 7189 current_block_->statements->Add(return_node);
7188 return CloseBlock(); 7190 return CloseBlock();
7189 } 7191 }
7190 7192
7191 7193
7192 SequenceNode* Parser::CloseAsyncClosure(SequenceNode* body) { 7194 SequenceNode* Parser::CloseAsyncClosure(SequenceNode* body) {
7193 // We need a temporary expression to store intermediate return values. 7195 // We need a temporary expression to store intermediate return values.
7194 parsed_function()->EnsureExpressionTemp(); 7196 parsed_function()->EnsureExpressionTemp();
(...skipping 7201 matching lines...) Expand 10 before | Expand all | Expand 10 after
14396 const ArgumentListNode& function_args, 14398 const ArgumentListNode& function_args,
14397 const LocalVariable* temp_for_last_arg, 14399 const LocalVariable* temp_for_last_arg,
14398 bool is_super_invocation) { 14400 bool is_super_invocation) {
14399 UNREACHABLE(); 14401 UNREACHABLE();
14400 return NULL; 14402 return NULL;
14401 } 14403 }
14402 14404
14403 } // namespace dart 14405 } // namespace dart
14404 14406
14405 #endif // DART_PRECOMPILED 14407 #endif // DART_PRECOMPILED
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698