| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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(¶ms, current_block_->scope); | 1494 AddFormalParamsToScope(¶ms, 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |