| 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_RUNTIME | 8 #ifndef DART_PRECOMPILED_RUNTIME | 
| 9 | 9 | 
| 10 #include "lib/invocation_mirror.h" | 10 #include "lib/invocation_mirror.h" | 
| (...skipping 8701 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 8712       new(Z) LoadLocalNode(await_for_pos, exception_var), | 8712       new(Z) LoadLocalNode(await_for_pos, exception_var), | 
| 8713       new(Z) LoadLocalNode(await_for_pos, stack_trace_var))); | 8713       new(Z) LoadLocalNode(await_for_pos, stack_trace_var))); | 
| 8714 | 8714 | 
| 8715   TryStack* try_statement = PopTry(); | 8715   TryStack* try_statement = PopTry(); | 
| 8716   const intptr_t try_index = try_statement->try_index(); | 8716   const intptr_t try_index = try_statement->try_index(); | 
| 8717   TryStack* outer_try = try_stack_; | 8717   TryStack* outer_try = try_stack_; | 
| 8718   const intptr_t outer_try_index = (outer_try != NULL) ? | 8718   const intptr_t outer_try_index = (outer_try != NULL) ? | 
| 8719       outer_try->try_index() : CatchClauseNode::kInvalidTryIndex; | 8719       outer_try->try_index() : CatchClauseNode::kInvalidTryIndex; | 
| 8720 | 8720 | 
| 8721   // The finally block contains a call to cancel the stream. | 8721   // The finally block contains a call to cancel the stream. | 
| 8722   // :for-in-iter.cancel() | 8722   // :for-in-iter.cancel(); | 
| 8723 | 8723 | 
| 8724   // Inline the finally block to the exit points in the try block. | 8724   // Inline the finally block to the exit points in the try block. | 
| 8725   intptr_t node_index = 0; | 8725   intptr_t node_index = 0; | 
| 8726   SequenceNode* finally_clause = NULL; | 8726   SequenceNode* finally_clause = NULL; | 
| 8727   if (try_stack_ != NULL) { | 8727   if (try_stack_ != NULL) { | 
| 8728     try_stack_->enter_finally(); | 8728     try_stack_->enter_finally(); | 
| 8729   } | 8729   } | 
| 8730   do { | 8730   do { | 
| 8731     OpenBlock(); | 8731     OpenBlock(); | 
|  | 8732 | 
|  | 8733     // Restore the saved try context of the enclosing try block if one | 
|  | 8734     // exists. | 
|  | 8735     if (outer_saved_try_ctx != NULL) { | 
|  | 8736       current_block_->statements->Add(new (Z) StoreLocalNode( | 
|  | 8737           TokenPosition::kNoSource, | 
|  | 8738           outer_saved_try_ctx, | 
|  | 8739           new (Z) LoadLocalNode(TokenPosition::kNoSource, | 
|  | 8740                                 outer_async_saved_try_ctx))); | 
|  | 8741     } | 
|  | 8742     // :for-in-iter.cancel(); | 
| 8732     ArgumentListNode* no_args = | 8743     ArgumentListNode* no_args = | 
| 8733         new(Z) ArgumentListNode(TokenPosition::kNoSource); | 8744         new(Z) ArgumentListNode(TokenPosition::kNoSource); | 
| 8734     current_block_->statements->Add( | 8745     current_block_->statements->Add( | 
| 8735         new(Z) InstanceCallNode(TokenPosition::kNoSource, | 8746         new(Z) InstanceCallNode(TokenPosition::kNoSource, | 
| 8736             new(Z) LoadLocalNode(TokenPosition::kNoSource, iterator_var), | 8747             new(Z) LoadLocalNode(TokenPosition::kNoSource, iterator_var), | 
| 8737             Symbols::Cancel(), | 8748             Symbols::Cancel(), | 
| 8738             no_args)); | 8749             no_args)); | 
| 8739     finally_clause = CloseBlock(); | 8750     finally_clause = CloseBlock(); | 
|  | 8751 | 
| 8740     AstNode* node_to_inline = try_statement->GetNodeToInlineFinally(node_index); | 8752     AstNode* node_to_inline = try_statement->GetNodeToInlineFinally(node_index); | 
| 8741     if (node_to_inline != NULL) { | 8753     if (node_to_inline != NULL) { | 
| 8742       InlinedFinallyNode* node = | 8754       InlinedFinallyNode* node = | 
| 8743           new(Z) InlinedFinallyNode(TokenPosition::kNoSource, | 8755           new(Z) InlinedFinallyNode(TokenPosition::kNoSource, | 
| 8744                                     finally_clause, | 8756                                     finally_clause, | 
| 8745                                     context_var, | 8757                                     context_var, | 
| 8746                                     outer_try_index); | 8758                                     outer_try_index); | 
| 8747       finally_clause = NULL; | 8759       finally_clause = NULL; | 
| 8748       AddFinallyClauseToNode(true, node_to_inline, node); | 8760       AddFinallyClauseToNode(true, node_to_inline, node); | 
| 8749       node_index++; | 8761       node_index++; | 
| (...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 9120   TRACE_PARSER("EnsureFinallyClause"); | 9132   TRACE_PARSER("EnsureFinallyClause"); | 
| 9121   ASSERT(parse || (is_async && (try_stack_ != NULL))); | 9133   ASSERT(parse || (is_async && (try_stack_ != NULL))); | 
| 9122   OpenBlock(); | 9134   OpenBlock(); | 
| 9123   if (parse) { | 9135   if (parse) { | 
| 9124     ExpectToken(Token::kLBRACE); | 9136     ExpectToken(Token::kLBRACE); | 
| 9125   } | 9137   } | 
| 9126 | 9138 | 
| 9127   if (try_stack_ != NULL) { | 9139   if (try_stack_ != NULL) { | 
| 9128     try_stack_->enter_finally(); | 9140     try_stack_->enter_finally(); | 
| 9129   } | 9141   } | 
| 9130   // In case of async closures we need to restore the saved try index of an | 9142   // In case of async closures we need to restore the saved try context of an | 
| 9131   // outer try block (if it exists).  The current try block has already been | 9143   // outer try block (if it exists).  The current try block has already been | 
| 9132   // removed from the stack of try blocks. | 9144   // removed from the stack of try blocks. | 
| 9133   if (is_async) { | 9145   if (is_async) { | 
| 9134     if (try_stack_ != NULL) { | 9146     if (try_stack_ != NULL) { | 
| 9135       LocalScope* scope = try_stack_->try_block()->scope; | 9147       LocalScope* scope = try_stack_->try_block()->scope; | 
| 9136       if (scope->function_level() == current_block_->scope->function_level()) { | 9148       if (scope->function_level() == current_block_->scope->function_level()) { | 
| 9137         LocalVariable* saved_try_ctx = | 9149         LocalVariable* saved_try_ctx = | 
| 9138             LookupSavedTryContextVar(scope->parent()); | 9150             LookupSavedTryContextVar(scope->parent()); | 
| 9139         LocalVariable* async_saved_try_ctx = | 9151         LocalVariable* async_saved_try_ctx = | 
| 9140             LookupAsyncSavedTryContextVar(async_temp_scope_, | 9152             LookupAsyncSavedTryContextVar(async_temp_scope_, | 
| (...skipping 5255 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 14396     const ArgumentListNode& function_args, | 14408     const ArgumentListNode& function_args, | 
| 14397     const LocalVariable* temp_for_last_arg, | 14409     const LocalVariable* temp_for_last_arg, | 
| 14398     bool is_super_invocation) { | 14410     bool is_super_invocation) { | 
| 14399   UNREACHABLE(); | 14411   UNREACHABLE(); | 
| 14400   return NULL; | 14412   return NULL; | 
| 14401 } | 14413 } | 
| 14402 | 14414 | 
| 14403 }  // namespace dart | 14415 }  // namespace dart | 
| 14404 | 14416 | 
| 14405 #endif  // DART_PRECOMPILED_RUNTIME | 14417 #endif  // DART_PRECOMPILED_RUNTIME | 
| OLD | NEW | 
|---|