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

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

Issue 1314993002: Use correct scope to lookup saved async context variable. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 3 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
« no previous file with comments | « no previous file | runtime/vm/scopes.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 6
7 #include "lib/invocation_mirror.h" 7 #include "lib/invocation_mirror.h"
8 #include "platform/utils.h" 8 #include "platform/utils.h"
9 #include "vm/ast_transformer.h" 9 #include "vm/ast_transformer.h"
10 #include "vm/bootstrap.h" 10 #include "vm/bootstrap.h"
(...skipping 6577 matching lines...) Expand 10 before | Expand all | Expand 10 after
6588 async_temp_scope_ = current_block_->scope; 6588 async_temp_scope_ = current_block_->scope;
6589 return body.raw(); 6589 return body.raw();
6590 } 6590 }
6591 6591
6592 SequenceNode* Parser::CloseSyncGenFunction(const Function& closure, 6592 SequenceNode* Parser::CloseSyncGenFunction(const Function& closure,
6593 SequenceNode* closure_body) { 6593 SequenceNode* closure_body) {
6594 // The block for the closure body has already been closed. Close the 6594 // The block for the closure body has already been closed. Close the
6595 // corresponding function block. 6595 // corresponding function block.
6596 CloseBlock(); 6596 CloseBlock();
6597 6597
6598 closure_body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false); 6598 LocalVariable* existing_var =
6599 closure_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false); 6599 closure_body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false);
6600 ASSERT((existing_var != NULL) && existing_var->is_captured());
6601 existing_var =
6602 closure_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false);
6603 ASSERT((existing_var != NULL) && existing_var->is_captured());
6600 6604
6601 // :await_jump_var = -1; 6605 // :await_jump_var = -1;
6602 LocalVariable* jump_var = 6606 LocalVariable* jump_var =
6603 current_block_->scope->LookupVariable(Symbols::AwaitJumpVar(), false); 6607 current_block_->scope->LookupVariable(Symbols::AwaitJumpVar(), false);
6604 LiteralNode* init_value = 6608 LiteralNode* init_value =
6605 new(Z) LiteralNode(Scanner::kNoSourcePos, Smi::ZoneHandle(Smi::New(-1))); 6609 new(Z) LiteralNode(Scanner::kNoSourcePos, Smi::ZoneHandle(Smi::New(-1)));
6606 current_block_->statements->Add( 6610 current_block_->statements->Add(
6607 new(Z) StoreLocalNode(Scanner::kNoSourcePos, jump_var, init_value)); 6611 new(Z) StoreLocalNode(Scanner::kNoSourcePos, jump_var, init_value));
6608 6612
6609 // return new SyncIterable(body_closure); 6613 // return new SyncIterable(body_closure);
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
6891 TRACE_PARSER("CloseAsyncGeneratorFunction"); 6895 TRACE_PARSER("CloseAsyncGeneratorFunction");
6892 ASSERT(!closure_func.IsNull()); 6896 ASSERT(!closure_func.IsNull());
6893 ASSERT(closure_body != NULL); 6897 ASSERT(closure_body != NULL);
6894 6898
6895 // The block for the async closure body has already been closed. Close the 6899 // The block for the async closure body has already been closed. Close the
6896 // corresponding function block. 6900 // corresponding function block.
6897 CloseBlock(); 6901 CloseBlock();
6898 6902
6899 // Make sure the implicit variables of the async generator function 6903 // Make sure the implicit variables of the async generator function
6900 // are captured. 6904 // are captured.
6901 closure_body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false); 6905 LocalVariable* existing_var = closure_body->scope()->LookupVariable(
6902 closure_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false); 6906 Symbols::AwaitJumpVar(), false);
6903 closure_body->scope()->LookupVariable(Symbols::Controller(), false); 6907 ASSERT((existing_var != NULL) && existing_var->is_captured());
6904 closure_body->scope()->LookupVariable(Symbols::AsyncOperation(), false); 6908 existing_var = closure_body->scope()->LookupVariable(
6905 closure_body->scope()->LookupVariable(Symbols::AsyncThenCallback(), false); 6909 Symbols::AwaitContextVar(), false);
6906 closure_body->scope()->LookupVariable( 6910 ASSERT((existing_var != NULL) && existing_var->is_captured());
6911 existing_var = closure_body->scope()->LookupVariable(
6912 Symbols::Controller(), false);
6913 ASSERT((existing_var != NULL) && existing_var->is_captured());
6914 existing_var = closure_body->scope()->LookupVariable(
6915 Symbols::AsyncOperation(), false);
6916 ASSERT((existing_var != NULL) && existing_var->is_captured());
6917 existing_var = closure_body->scope()->LookupVariable(
6918 Symbols::AsyncThenCallback(), false);
6919 ASSERT((existing_var != NULL) && existing_var->is_captured());
6920 existing_var = closure_body->scope()->LookupVariable(
6907 Symbols::AsyncCatchErrorCallback(), false); 6921 Symbols::AsyncCatchErrorCallback(), false);
6922 ASSERT((existing_var != NULL) && existing_var->is_captured());
6908 6923
6909 const Library& async_lib = Library::Handle(Library::AsyncLibrary()); 6924 const Library& async_lib = Library::Handle(Library::AsyncLibrary());
6910 6925
6911 const Class& controller_class = Class::Handle(Z, 6926 const Class& controller_class = Class::Handle(Z,
6912 async_lib.LookupClassAllowPrivate( 6927 async_lib.LookupClassAllowPrivate(
6913 Symbols::_AsyncStarStreamController())); 6928 Symbols::_AsyncStarStreamController()));
6914 ASSERT(!controller_class.IsNull()); 6929 ASSERT(!controller_class.IsNull());
6915 const Function& controller_constructor = Function::ZoneHandle(Z, 6930 const Function& controller_constructor = Function::ZoneHandle(Z,
6916 controller_class.LookupConstructorAllowPrivate( 6931 controller_class.LookupConstructorAllowPrivate(
6917 Symbols::_AsyncStarStreamControllerConstructor())); 6932 Symbols::_AsyncStarStreamControllerConstructor()));
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
7021 // We need a temporary expression to store intermediate return values. 7036 // We need a temporary expression to store intermediate return values.
7022 parsed_function()->EnsureExpressionTemp(); 7037 parsed_function()->EnsureExpressionTemp();
7023 7038
7024 SequenceNode* new_body = CloseAsyncGeneratorTryBlock(body); 7039 SequenceNode* new_body = CloseAsyncGeneratorTryBlock(body);
7025 ASSERT(new_body != NULL); 7040 ASSERT(new_body != NULL);
7026 ASSERT(new_body->scope() != NULL); 7041 ASSERT(new_body->scope() != NULL);
7027 7042
7028 // Implicitly mark those variables below as captured. We currently mark all 7043 // Implicitly mark those variables below as captured. We currently mark all
7029 // variables of all scopes as captured, but as soon as we do something 7044 // variables of all scopes as captured, but as soon as we do something
7030 // smarter we rely on these internal variables to be available. 7045 // smarter we rely on these internal variables to be available.
7031 new_body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false); 7046 LocalVariable* existing_var = new_body->scope()->LookupVariable(
7032 new_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false); 7047 Symbols::AwaitJumpVar(), false);
7033 new_body->scope()->LookupVariable(Symbols::Controller(), false); 7048 ASSERT((existing_var != NULL) && existing_var->is_captured());
7034 new_body->scope()->LookupVariable(Symbols::AsyncOperationParam(), false); 7049 existing_var = new_body->scope()->LookupVariable(
7035 new_body->scope()->LookupVariable(Symbols::AsyncOperationErrorParam(), false); 7050 Symbols::AwaitContextVar(), false);
7036 new_body->scope()->LookupVariable( 7051 ASSERT((existing_var != NULL) && existing_var->is_captured());
7052 existing_var = new_body->scope()->LookupVariable(
7053 Symbols::Controller(), false);
7054 ASSERT((existing_var != NULL) && existing_var->is_captured());
7055 existing_var = new_body->scope()->LookupVariable(
7056 Symbols::AsyncOperationParam(), false);
7057 ASSERT(existing_var != NULL);
7058 existing_var = new_body->scope()->LookupVariable(
7059 Symbols::AsyncOperationErrorParam(), false);
7060 ASSERT(existing_var != NULL);
7061 existing_var = new_body->scope()->LookupVariable(
7037 Symbols::AsyncOperationStackTraceParam(), false); 7062 Symbols::AsyncOperationStackTraceParam(), false);
7063 ASSERT(existing_var != NULL);
7038 new_body->scope()->RecursivelyCaptureAllVariables(); 7064 new_body->scope()->RecursivelyCaptureAllVariables();
7039 return new_body; 7065 return new_body;
7040 } 7066 }
7041 7067
7042 7068
7043 // Add a return node to the sequence if necessary. 7069 // Add a return node to the sequence if necessary.
7044 void Parser::EnsureHasReturnStatement(SequenceNode* seq, intptr_t return_pos) { 7070 void Parser::EnsureHasReturnStatement(SequenceNode* seq, intptr_t return_pos) {
7045 if ((seq->length() == 0) || 7071 if ((seq->length() == 0) ||
7046 !seq->NodeAt(seq->length() - 1)->IsReturnNode()) { 7072 !seq->NodeAt(seq->length() - 1)->IsReturnNode()) {
7047 const Function& func = innermost_function(); 7073 const Function& func = innermost_function();
(...skipping 24 matching lines...) Expand all
7072 SequenceNode* Parser::CloseAsyncFunction(const Function& closure, 7098 SequenceNode* Parser::CloseAsyncFunction(const Function& closure,
7073 SequenceNode* closure_body) { 7099 SequenceNode* closure_body) {
7074 TRACE_PARSER("CloseAsyncFunction"); 7100 TRACE_PARSER("CloseAsyncFunction");
7075 ASSERT(!closure.IsNull()); 7101 ASSERT(!closure.IsNull());
7076 ASSERT(closure_body != NULL); 7102 ASSERT(closure_body != NULL);
7077 7103
7078 // The block for the async closure body has already been closed. Close the 7104 // The block for the async closure body has already been closed. Close the
7079 // corresponding function block. 7105 // corresponding function block.
7080 CloseBlock(); 7106 CloseBlock();
7081 7107
7082 closure_body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false); 7108 LocalVariable* existing_var =
7083 closure_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false); 7109 closure_body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false);
7084 closure_body->scope()->CaptureVariable(Symbols::AsyncCompleter()); 7110 ASSERT((existing_var != NULL) && existing_var->is_captured());
7111 existing_var =
7112 closure_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false);
7113 ASSERT((existing_var != NULL) && existing_var->is_captured());
7114 existing_var =
7115 closure_body->scope()->LookupVariable(Symbols::AsyncCompleter(), false);
7116 ASSERT((existing_var != NULL) && existing_var->is_captured());
7085 7117
7086 // Create and return a new future that executes a closure with the current 7118 // Create and return a new future that executes a closure with the current
7087 // body. 7119 // body.
7088 7120
7089 // No need to capture parameters or other variables, since they have already 7121 // No need to capture parameters or other variables, since they have already
7090 // been captured in the corresponding scope as the body has been parsed within 7122 // been captured in the corresponding scope as the body has been parsed within
7091 // a nested block (contained in the async funtion's block). 7123 // a nested block (contained in the async funtion's block).
7092 const Class& future = 7124 const Class& future =
7093 Class::ZoneHandle(Z, I->object_store()->future_class()); 7125 Class::ZoneHandle(Z, I->object_store()->future_class());
7094 ASSERT(!future.IsNull()); 7126 ASSERT(!future.IsNull());
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
7215 7247
7216 SequenceNode* Parser::CloseAsyncClosure(SequenceNode* body) { 7248 SequenceNode* Parser::CloseAsyncClosure(SequenceNode* body) {
7217 // We need a temporary expression to store intermediate return values. 7249 // We need a temporary expression to store intermediate return values.
7218 parsed_function()->EnsureExpressionTemp(); 7250 parsed_function()->EnsureExpressionTemp();
7219 // Implicitly mark those variables below as captured. We currently mark all 7251 // Implicitly mark those variables below as captured. We currently mark all
7220 // variables of all scopes as captured (below), but as soon as we do something 7252 // variables of all scopes as captured (below), but as soon as we do something
7221 // smarter we rely on these internal variables to be available. 7253 // smarter we rely on these internal variables to be available.
7222 SequenceNode* new_body = CloseAsyncTryBlock(body); 7254 SequenceNode* new_body = CloseAsyncTryBlock(body);
7223 ASSERT(new_body != NULL); 7255 ASSERT(new_body != NULL);
7224 ASSERT(new_body->scope() != NULL); 7256 ASSERT(new_body->scope() != NULL);
7225 new_body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false); 7257 LocalVariable* existing_var =
7226 new_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false); 7258 new_body->scope()->LookupVariable(Symbols::AwaitJumpVar(), false);
7227 new_body->scope()->LookupVariable(Symbols::AsyncCompleter(), false); 7259 ASSERT((existing_var != NULL) && existing_var->is_captured());
7260 existing_var =
7261 new_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false);
7262 ASSERT((existing_var != NULL) && existing_var->is_captured());
7263 existing_var =
7264 new_body->scope()->LookupVariable(Symbols::AsyncCompleter(), false);
7265 ASSERT((existing_var != NULL) && existing_var->is_captured());
7228 new_body->scope()->RecursivelyCaptureAllVariables(); 7266 new_body->scope()->RecursivelyCaptureAllVariables();
7229 return new_body; 7267 return new_body;
7230 } 7268 }
7231 7269
7232 7270
7233 // Set up default values for all optional parameters to the function. 7271 // Set up default values for all optional parameters to the function.
7234 void Parser::SetupDefaultsForOptionalParams( 7272 void Parser::SetupDefaultsForOptionalParams(
7235 const ParamList& params, 7273 const ParamList& params,
7236 ZoneGrowableArray<const Instance*>* default_values) { 7274 ZoneGrowableArray<const Instance*>* default_values) {
7237 if (params.num_optional_parameters > 0) { 7275 if (params.num_optional_parameters > 0) {
(...skipping 1270 matching lines...) Expand 10 before | Expand all | Expand 10 after
8508 8546
8509 static LocalVariable* LookupAsyncSavedTryContextVar(LocalScope* scope, 8547 static LocalVariable* LookupAsyncSavedTryContextVar(LocalScope* scope,
8510 uint16_t try_index) { 8548 uint16_t try_index) {
8511 const String& async_saved_try_ctx_name = 8549 const String& async_saved_try_ctx_name =
8512 String::ZoneHandle(Symbols::New(String::Handle( 8550 String::ZoneHandle(Symbols::New(String::Handle(
8513 String::NewFormatted( 8551 String::NewFormatted(
8514 "%s%d", 8552 "%s%d",
8515 Symbols::AsyncSavedTryCtxVarPrefix().ToCString(), 8553 Symbols::AsyncSavedTryCtxVarPrefix().ToCString(),
8516 try_index)))); 8554 try_index))));
8517 LocalVariable* var = scope->LocalLookupVariable(async_saved_try_ctx_name); 8555 LocalVariable* var = scope->LocalLookupVariable(async_saved_try_ctx_name);
8518 ASSERT((var != NULL) && var->is_captured());\ 8556 ASSERT((var != NULL) && var->is_captured());
8519 return var; 8557 return var;
8520 } 8558 }
8521 8559
8522 8560
8523 // If the await or yield being parsed is in a try block, the continuation code 8561 // If the await or yield being parsed is in a try block, the continuation code
8524 // needs to restore the corresponding stack-based variable :saved_try_ctx_var, 8562 // needs to restore the corresponding stack-based variable :saved_try_ctx_var,
8525 // and the stack-based variable :saved_try_ctx_var of the outer try block. 8563 // and the stack-based variable :saved_try_ctx_var of the outer try block.
8526 // The inner :saved_try_ctx_var is used by a finally clause handling an 8564 // The inner :saved_try_ctx_var is used by a finally clause handling an
8527 // exception thrown by the continuation code in a try block or catch block. 8565 // exception thrown by the continuation code in a try block or catch block.
8528 // If no finally clause exists, the catch or finally clause of the outer try 8566 // If no finally clause exists, the catch or finally clause of the outer try
(...skipping 15 matching lines...) Expand all
8544 *outer_saved_try_ctx = NULL; 8582 *outer_saved_try_ctx = NULL;
8545 *outer_async_saved_try_ctx = NULL; 8583 *outer_async_saved_try_ctx = NULL;
8546 if (try_stack_ != NULL) { 8584 if (try_stack_ != NULL) {
8547 LocalScope* scope = try_stack_->try_block()->scope; 8585 LocalScope* scope = try_stack_->try_block()->scope;
8548 uint16_t try_index = try_stack_->try_index(); 8586 uint16_t try_index = try_stack_->try_index();
8549 const int current_function_level = current_block_->scope->function_level(); 8587 const int current_function_level = current_block_->scope->function_level();
8550 if (scope->function_level() == current_function_level) { 8588 if (scope->function_level() == current_function_level) {
8551 // The block declaring :saved_try_ctx_var variable is the parent of the 8589 // The block declaring :saved_try_ctx_var variable is the parent of the
8552 // pushed try block. 8590 // pushed try block.
8553 *saved_try_ctx = LookupSavedTryContextVar(scope->parent()); 8591 *saved_try_ctx = LookupSavedTryContextVar(scope->parent());
8554 *async_saved_try_ctx = LookupAsyncSavedTryContextVar(scope, try_index); 8592 *async_saved_try_ctx = LookupAsyncSavedTryContextVar(async_temp_scope_,
8593 try_index);
8555 if ((try_stack_->outer_try() != NULL) && !try_stack_->inside_finally()) { 8594 if ((try_stack_->outer_try() != NULL) && !try_stack_->inside_finally()) {
8556 // Collecting the outer try scope is not necessary if we 8595 // Collecting the outer try scope is not necessary if we
8557 // are in a finally block. 8596 // are in a finally block.
8558 scope = try_stack_->outer_try()->try_block()->scope; 8597 scope = try_stack_->outer_try()->try_block()->scope;
8559 try_index = try_stack_->outer_try()->try_index(); 8598 try_index = try_stack_->outer_try()->try_index();
8560 if (scope->function_level() == current_function_level) { 8599 if (scope->function_level() == current_function_level) {
8561 *outer_saved_try_ctx = LookupSavedTryContextVar(scope->parent()); 8600 *outer_saved_try_ctx = LookupSavedTryContextVar(scope->parent());
8562 *outer_async_saved_try_ctx = 8601 *outer_async_saved_try_ctx =
8563 LookupAsyncSavedTryContextVar(scope, try_index); 8602 LookupAsyncSavedTryContextVar(async_temp_scope_, try_index);
8564 } 8603 }
8565 } 8604 }
8566 } 8605 }
8567 } 8606 }
8568 // An async or async* has an implicitly created try-catch around the 8607 // An async or async* has an implicitly created try-catch around the
8569 // function body, so the await or yield inside the async closure should always 8608 // function body, so the await or yield inside the async closure should always
8570 // be created with a try scope. 8609 // be created with a try scope.
8571 ASSERT((*saved_try_ctx != NULL) || 8610 ASSERT((*saved_try_ctx != NULL) ||
8572 innermost_function().IsAsyncFunction() || 8611 innermost_function().IsAsyncFunction() ||
8573 innermost_function().IsAsyncGenerator() || 8612 innermost_function().IsAsyncGenerator() ||
(...skipping 651 matching lines...) Expand 10 before | Expand all | Expand 10 after
9225 // In case of async closures we need to restore the saved try index of an 9264 // In case of async closures we need to restore the saved try index of an
9226 // outer try block (if it exists). The current try block has already been 9265 // outer try block (if it exists). The current try block has already been
9227 // removed from the stack of try blocks. 9266 // removed from the stack of try blocks.
9228 if (is_async) { 9267 if (is_async) {
9229 if (try_stack_ != NULL) { 9268 if (try_stack_ != NULL) {
9230 LocalScope* scope = try_stack_->try_block()->scope; 9269 LocalScope* scope = try_stack_->try_block()->scope;
9231 if (scope->function_level() == current_block_->scope->function_level()) { 9270 if (scope->function_level() == current_block_->scope->function_level()) {
9232 LocalVariable* saved_try_ctx = 9271 LocalVariable* saved_try_ctx =
9233 LookupSavedTryContextVar(scope->parent()); 9272 LookupSavedTryContextVar(scope->parent());
9234 LocalVariable* async_saved_try_ctx = 9273 LocalVariable* async_saved_try_ctx =
9235 LookupAsyncSavedTryContextVar(scope->parent(), 9274 LookupAsyncSavedTryContextVar(async_temp_scope_,
9236 try_stack_->try_index()); 9275 try_stack_->try_index());
9237 current_block_->statements->Add( 9276 current_block_->statements->Add(
9238 new (Z) StoreLocalNode( 9277 new (Z) StoreLocalNode(
9239 Scanner::kNoSourcePos, 9278 Scanner::kNoSourcePos,
9240 saved_try_ctx, 9279 saved_try_ctx,
9241 new (Z) LoadLocalNode(Scanner::kNoSourcePos, 9280 new (Z) LoadLocalNode(Scanner::kNoSourcePos,
9242 async_saved_try_ctx))); 9281 async_saved_try_ctx)));
9243 } 9282 }
9244 } 9283 }
9245 // We need to save the exception variables as in catch clauses, whether 9284 // We need to save the exception variables as in catch clauses, whether
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
9499 if (is_async && (current != NULL)) { 9538 if (is_async && (current != NULL)) {
9500 ASSERT(try_stack_ != NULL); 9539 ASSERT(try_stack_ != NULL);
9501 SequenceNode* async_code = new(Z) SequenceNode(handler_pos, NULL); 9540 SequenceNode* async_code = new(Z) SequenceNode(handler_pos, NULL);
9502 const TryStack* try_block = try_stack_->outer_try(); 9541 const TryStack* try_block = try_stack_->outer_try();
9503 if (try_block != NULL) { 9542 if (try_block != NULL) {
9504 LocalScope* scope = try_block->try_block()->scope; 9543 LocalScope* scope = try_block->try_block()->scope;
9505 if (scope->function_level() == current_block_->scope->function_level()) { 9544 if (scope->function_level() == current_block_->scope->function_level()) {
9506 LocalVariable* saved_try_ctx = 9545 LocalVariable* saved_try_ctx =
9507 LookupSavedTryContextVar(scope->parent()); 9546 LookupSavedTryContextVar(scope->parent());
9508 LocalVariable* async_saved_try_ctx = 9547 LocalVariable* async_saved_try_ctx =
9509 LookupAsyncSavedTryContextVar(scope->parent(), 9548 LookupAsyncSavedTryContextVar(async_temp_scope_,
9510 try_block->try_index()); 9549 try_block->try_index());
9511 async_code->Add( 9550 async_code->Add(
9512 new (Z) StoreLocalNode( 9551 new (Z) StoreLocalNode(
9513 Scanner::kNoSourcePos, 9552 Scanner::kNoSourcePos,
9514 saved_try_ctx, 9553 saved_try_ctx,
9515 new (Z) LoadLocalNode(Scanner::kNoSourcePos, 9554 new (Z) LoadLocalNode(Scanner::kNoSourcePos,
9516 async_saved_try_ctx))); 9555 async_saved_try_ctx)));
9517 } 9556 }
9518 } 9557 }
9519 SaveExceptionAndStacktrace(async_code, 9558 SaveExceptionAndStacktrace(async_code,
(...skipping 4660 matching lines...) Expand 10 before | Expand all | Expand 10 after
14180 void Parser::SkipQualIdent() { 14219 void Parser::SkipQualIdent() {
14181 ASSERT(IsIdentifier()); 14220 ASSERT(IsIdentifier());
14182 ConsumeToken(); 14221 ConsumeToken();
14183 if (CurrentToken() == Token::kPERIOD) { 14222 if (CurrentToken() == Token::kPERIOD) {
14184 ConsumeToken(); // Consume the kPERIOD token. 14223 ConsumeToken(); // Consume the kPERIOD token.
14185 ExpectIdentifier("identifier expected after '.'"); 14224 ExpectIdentifier("identifier expected after '.'");
14186 } 14225 }
14187 } 14226 }
14188 14227
14189 } // namespace dart 14228 } // namespace dart
OLDNEW
« no previous file with comments | « no previous file | runtime/vm/scopes.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698