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 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 String::Handle(function_.name()).ToCString(), | 223 String::Handle(function_.name()).ToCString(), |
224 reason); | 224 reason); |
225 UNREACHABLE(); | 225 UNREACHABLE(); |
226 } | 226 } |
227 | 227 |
228 | 228 |
229 LocalVariable* ParsedFunction::EnsureExpressionTemp() { | 229 LocalVariable* ParsedFunction::EnsureExpressionTemp() { |
230 if (!has_expression_temp_var()) { | 230 if (!has_expression_temp_var()) { |
231 LocalVariable* temp = | 231 LocalVariable* temp = |
232 new (Z) LocalVariable(function_.token_pos(), | 232 new (Z) LocalVariable(function_.token_pos(), |
| 233 function_.token_pos(), |
233 Symbols::ExprTemp(), | 234 Symbols::ExprTemp(), |
234 Object::dynamic_type()); | 235 Object::dynamic_type()); |
235 ASSERT(temp != NULL); | 236 ASSERT(temp != NULL); |
236 set_expression_temp_var(temp); | 237 set_expression_temp_var(temp); |
237 } | 238 } |
238 ASSERT(has_expression_temp_var()); | 239 ASSERT(has_expression_temp_var()); |
239 return expression_temp_var(); | 240 return expression_temp_var(); |
240 } | 241 } |
241 | 242 |
242 | 243 |
243 void ParsedFunction::EnsureFinallyReturnTemp(bool is_async) { | 244 void ParsedFunction::EnsureFinallyReturnTemp(bool is_async) { |
244 if (!has_finally_return_temp_var()) { | 245 if (!has_finally_return_temp_var()) { |
245 LocalVariable* temp = new(Z) LocalVariable( | 246 LocalVariable* temp = new(Z) LocalVariable( |
246 function_.token_pos(), | 247 function_.token_pos(), |
| 248 function_.token_pos(), |
247 Symbols::FinallyRetVal(), | 249 Symbols::FinallyRetVal(), |
248 Object::dynamic_type()); | 250 Object::dynamic_type()); |
249 ASSERT(temp != NULL); | 251 ASSERT(temp != NULL); |
250 temp->set_is_final(); | 252 temp->set_is_final(); |
251 if (is_async) { | 253 if (is_async) { |
252 temp->set_is_captured(); | 254 temp->set_is_captured(); |
253 } | 255 } |
254 set_finally_return_temp_var(temp); | 256 set_finally_return_temp_var(temp); |
255 } | 257 } |
256 ASSERT(has_finally_return_temp_var()); | 258 ASSERT(has_finally_return_temp_var()); |
(...skipping 2857 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3114 | 3116 |
3115 | 3117 |
3116 SequenceNode* Parser::MakeImplicitConstructor(const Function& func) { | 3118 SequenceNode* Parser::MakeImplicitConstructor(const Function& func) { |
3117 ASSERT(func.IsGenerativeConstructor()); | 3119 ASSERT(func.IsGenerativeConstructor()); |
3118 ASSERT(func.Owner() == current_class().raw()); | 3120 ASSERT(func.Owner() == current_class().raw()); |
3119 const TokenPosition ctor_pos = TokenPos(); | 3121 const TokenPosition ctor_pos = TokenPos(); |
3120 OpenFunctionBlock(func); | 3122 OpenFunctionBlock(func); |
3121 | 3123 |
3122 LocalVariable* receiver = new LocalVariable( | 3124 LocalVariable* receiver = new LocalVariable( |
3123 TokenPosition::kNoSource, | 3125 TokenPosition::kNoSource, |
| 3126 TokenPosition::kNoSource, |
3124 Symbols::This(), | 3127 Symbols::This(), |
3125 *ReceiverType(current_class())); | 3128 *ReceiverType(current_class())); |
3126 current_block_->scope->InsertParameterAt(0, receiver); | 3129 current_block_->scope->InsertParameterAt(0, receiver); |
3127 | 3130 |
3128 // Parse expressions of instance fields that have an explicit | 3131 // Parse expressions of instance fields that have an explicit |
3129 // initializer expression. | 3132 // initializer expression. |
3130 // The receiver must not be visible to field initializer expressions. | 3133 // The receiver must not be visible to field initializer expressions. |
3131 receiver->set_invisible(true); | 3134 receiver->set_invisible(true); |
3132 GrowableArray<Field*> initialized_fields; | 3135 GrowableArray<Field*> initialized_fields; |
3133 ParseInitializedInstanceFields( | 3136 ParseInitializedInstanceFields( |
(...skipping 28 matching lines...) Expand all Loading... |
3162 "constructor of the class extending the mixin application", | 3165 "constructor of the class extending the mixin application", |
3163 String::Handle(Z, super_class.Name()).ToCString()); | 3166 String::Handle(Z, super_class.Name()).ToCString()); |
3164 } | 3167 } |
3165 | 3168 |
3166 // Prepare user-defined arguments to be forwarded to super call. | 3169 // Prepare user-defined arguments to be forwarded to super call. |
3167 // The first user-defined argument is at position 1. | 3170 // The first user-defined argument is at position 1. |
3168 forwarding_args = new ArgumentListNode(ST(ctor_pos)); | 3171 forwarding_args = new ArgumentListNode(ST(ctor_pos)); |
3169 for (int i = 1; i < func.NumParameters(); i++) { | 3172 for (int i = 1; i < func.NumParameters(); i++) { |
3170 LocalVariable* param = new LocalVariable( | 3173 LocalVariable* param = new LocalVariable( |
3171 TokenPosition::kNoSource, | 3174 TokenPosition::kNoSource, |
| 3175 TokenPosition::kNoSource, |
3172 String::ZoneHandle(Z, func.ParameterNameAt(i)), | 3176 String::ZoneHandle(Z, func.ParameterNameAt(i)), |
3173 Object::dynamic_type()); | 3177 Object::dynamic_type()); |
3174 current_block_->scope->InsertParameterAt(i, param); | 3178 current_block_->scope->InsertParameterAt(i, param); |
3175 forwarding_args->Add(new LoadLocalNode(ST(ctor_pos), param)); | 3179 forwarding_args->Add(new LoadLocalNode(ST(ctor_pos), param)); |
3176 } | 3180 } |
3177 } | 3181 } |
3178 | 3182 |
3179 AstNode* super_call = GenerateSuperConstructorCall( | 3183 AstNode* super_call = GenerateSuperConstructorCall( |
3180 current_class(), | 3184 current_class(), |
3181 ctor_pos, | 3185 ctor_pos, |
(...skipping 3896 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7078 return closure.raw(); | 7082 return closure.raw(); |
7079 } | 7083 } |
7080 | 7084 |
7081 | 7085 |
7082 void Parser::AddContinuationVariables() { | 7086 void Parser::AddContinuationVariables() { |
7083 // Add to current block's scope: | 7087 // Add to current block's scope: |
7084 // var :await_jump_var; | 7088 // var :await_jump_var; |
7085 // var :await_ctx_var; | 7089 // var :await_ctx_var; |
7086 LocalVariable* await_jump_var = new (Z) LocalVariable( | 7090 LocalVariable* await_jump_var = new (Z) LocalVariable( |
7087 TokenPosition::kNoSource, | 7091 TokenPosition::kNoSource, |
| 7092 TokenPosition::kNoSource, |
7088 Symbols::AwaitJumpVar(), | 7093 Symbols::AwaitJumpVar(), |
7089 Object::dynamic_type()); | 7094 Object::dynamic_type()); |
7090 current_block_->scope->AddVariable(await_jump_var); | 7095 current_block_->scope->AddVariable(await_jump_var); |
7091 LocalVariable* await_ctx_var = new (Z) LocalVariable( | 7096 LocalVariable* await_ctx_var = new (Z) LocalVariable( |
7092 TokenPosition::kNoSource, | 7097 TokenPosition::kNoSource, |
| 7098 TokenPosition::kNoSource, |
7093 Symbols::AwaitContextVar(), | 7099 Symbols::AwaitContextVar(), |
7094 Object::dynamic_type()); | 7100 Object::dynamic_type()); |
7095 current_block_->scope->AddVariable(await_ctx_var); | 7101 current_block_->scope->AddVariable(await_ctx_var); |
7096 } | 7102 } |
7097 | 7103 |
7098 | 7104 |
7099 void Parser::AddAsyncClosureVariables() { | 7105 void Parser::AddAsyncClosureVariables() { |
7100 // Add to current block's scope: | 7106 // Add to current block's scope: |
7101 // var :async_op; | 7107 // var :async_op; |
7102 // var :async_then_callback; | 7108 // var :async_then_callback; |
7103 // var :async_catch_error_callback; | 7109 // var :async_catch_error_callback; |
7104 // var :async_completer; | 7110 // var :async_completer; |
7105 LocalVariable* async_op_var = new(Z) LocalVariable( | 7111 LocalVariable* async_op_var = new(Z) LocalVariable( |
7106 TokenPosition::kNoSource, | 7112 TokenPosition::kNoSource, |
| 7113 TokenPosition::kNoSource, |
7107 Symbols::AsyncOperation(), | 7114 Symbols::AsyncOperation(), |
7108 Object::dynamic_type()); | 7115 Object::dynamic_type()); |
7109 current_block_->scope->AddVariable(async_op_var); | 7116 current_block_->scope->AddVariable(async_op_var); |
7110 LocalVariable* async_then_callback_var = new(Z) LocalVariable( | 7117 LocalVariable* async_then_callback_var = new(Z) LocalVariable( |
7111 TokenPosition::kNoSource, | 7118 TokenPosition::kNoSource, |
| 7119 TokenPosition::kNoSource, |
7112 Symbols::AsyncThenCallback(), | 7120 Symbols::AsyncThenCallback(), |
7113 Object::dynamic_type()); | 7121 Object::dynamic_type()); |
7114 current_block_->scope->AddVariable(async_then_callback_var); | 7122 current_block_->scope->AddVariable(async_then_callback_var); |
7115 LocalVariable* async_catch_error_callback_var = new(Z) LocalVariable( | 7123 LocalVariable* async_catch_error_callback_var = new(Z) LocalVariable( |
7116 TokenPosition::kNoSource, | 7124 TokenPosition::kNoSource, |
| 7125 TokenPosition::kNoSource, |
7117 Symbols::AsyncCatchErrorCallback(), | 7126 Symbols::AsyncCatchErrorCallback(), |
7118 Object::dynamic_type()); | 7127 Object::dynamic_type()); |
7119 current_block_->scope->AddVariable(async_catch_error_callback_var); | 7128 current_block_->scope->AddVariable(async_catch_error_callback_var); |
7120 LocalVariable* async_completer = new(Z) LocalVariable( | 7129 LocalVariable* async_completer = new(Z) LocalVariable( |
7121 TokenPosition::kNoSource, | 7130 TokenPosition::kNoSource, |
| 7131 TokenPosition::kNoSource, |
7122 Symbols::AsyncCompleter(), | 7132 Symbols::AsyncCompleter(), |
7123 Object::dynamic_type()); | 7133 Object::dynamic_type()); |
7124 current_block_->scope->AddVariable(async_completer); | 7134 current_block_->scope->AddVariable(async_completer); |
7125 } | 7135 } |
7126 | 7136 |
7127 | 7137 |
7128 void Parser::AddAsyncGeneratorVariables() { | 7138 void Parser::AddAsyncGeneratorVariables() { |
7129 // Add to current block's scope: | 7139 // Add to current block's scope: |
7130 // var :controller; | 7140 // var :controller; |
7131 // The :controller variable is used by the async generator closure to | 7141 // The :controller variable is used by the async generator closure to |
7132 // store the StreamController object to which the yielded expressions | 7142 // store the StreamController object to which the yielded expressions |
7133 // are added. | 7143 // are added. |
7134 // var :async_op; | 7144 // var :async_op; |
7135 // var :async_then_callback; | 7145 // var :async_then_callback; |
7136 // var :async_catch_error_callback; | 7146 // var :async_catch_error_callback; |
7137 // These variables are used to store the async generator closure containing | 7147 // These variables are used to store the async generator closure containing |
7138 // the body of the async* function. They are used by the await operator. | 7148 // the body of the async* function. They are used by the await operator. |
7139 LocalVariable* controller_var = new(Z) LocalVariable( | 7149 LocalVariable* controller_var = new(Z) LocalVariable( |
7140 TokenPosition::kNoSource, | 7150 TokenPosition::kNoSource, |
| 7151 TokenPosition::kNoSource, |
7141 Symbols::Controller(), | 7152 Symbols::Controller(), |
7142 Object::dynamic_type()); | 7153 Object::dynamic_type()); |
7143 current_block_->scope->AddVariable(controller_var); | 7154 current_block_->scope->AddVariable(controller_var); |
7144 LocalVariable* async_op_var = new(Z) LocalVariable( | 7155 LocalVariable* async_op_var = new(Z) LocalVariable( |
7145 TokenPosition::kNoSource, | 7156 TokenPosition::kNoSource, |
| 7157 TokenPosition::kNoSource, |
7146 Symbols::AsyncOperation(), | 7158 Symbols::AsyncOperation(), |
7147 Object::dynamic_type()); | 7159 Object::dynamic_type()); |
7148 current_block_->scope->AddVariable(async_op_var); | 7160 current_block_->scope->AddVariable(async_op_var); |
7149 LocalVariable* async_then_callback_var = new(Z) LocalVariable( | 7161 LocalVariable* async_then_callback_var = new(Z) LocalVariable( |
7150 TokenPosition::kNoSource, | 7162 TokenPosition::kNoSource, |
| 7163 TokenPosition::kNoSource, |
7151 Symbols::AsyncThenCallback(), | 7164 Symbols::AsyncThenCallback(), |
7152 Object::dynamic_type()); | 7165 Object::dynamic_type()); |
7153 current_block_->scope->AddVariable(async_then_callback_var); | 7166 current_block_->scope->AddVariable(async_then_callback_var); |
7154 LocalVariable* async_catch_error_callback_var = new(Z) LocalVariable( | 7167 LocalVariable* async_catch_error_callback_var = new(Z) LocalVariable( |
7155 TokenPosition::kNoSource, | 7168 TokenPosition::kNoSource, |
| 7169 TokenPosition::kNoSource, |
7156 Symbols::AsyncCatchErrorCallback(), | 7170 Symbols::AsyncCatchErrorCallback(), |
7157 Object::dynamic_type()); | 7171 Object::dynamic_type()); |
7158 current_block_->scope->AddVariable(async_catch_error_callback_var); | 7172 current_block_->scope->AddVariable(async_catch_error_callback_var); |
7159 } | 7173 } |
7160 | 7174 |
7161 | 7175 |
7162 RawFunction* Parser::OpenAsyncGeneratorFunction( | 7176 RawFunction* Parser::OpenAsyncGeneratorFunction( |
7163 TokenPosition async_func_pos) { | 7177 TokenPosition async_func_pos) { |
7164 TRACE_PARSER("OpenAsyncGeneratorFunction"); | 7178 TRACE_PARSER("OpenAsyncGeneratorFunction"); |
7165 AddContinuationVariables(); | 7179 AddContinuationVariables(); |
(...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7634 void Parser::AddFormalParamsToScope(const ParamList* params, | 7648 void Parser::AddFormalParamsToScope(const ParamList* params, |
7635 LocalScope* scope) { | 7649 LocalScope* scope) { |
7636 ASSERT((params != NULL) && (params->parameters != NULL)); | 7650 ASSERT((params != NULL) && (params->parameters != NULL)); |
7637 ASSERT(scope != NULL); | 7651 ASSERT(scope != NULL); |
7638 const int num_parameters = params->parameters->length(); | 7652 const int num_parameters = params->parameters->length(); |
7639 for (int i = 0; i < num_parameters; i++) { | 7653 for (int i = 0; i < num_parameters; i++) { |
7640 ParamDesc& param_desc = (*params->parameters)[i]; | 7654 ParamDesc& param_desc = (*params->parameters)[i]; |
7641 ASSERT(!is_top_level_ || param_desc.type->IsResolved()); | 7655 ASSERT(!is_top_level_ || param_desc.type->IsResolved()); |
7642 const String* name = param_desc.name; | 7656 const String* name = param_desc.name; |
7643 LocalVariable* parameter = new(Z) LocalVariable( | 7657 LocalVariable* parameter = new(Z) LocalVariable( |
7644 param_desc.name_pos, *name, *param_desc.type); | 7658 param_desc.name_pos, |
| 7659 param_desc.name_pos, |
| 7660 *name, |
| 7661 *param_desc.type); |
7645 if (!scope->InsertParameterAt(i, parameter)) { | 7662 if (!scope->InsertParameterAt(i, parameter)) { |
7646 ReportError(param_desc.name_pos, | 7663 ReportError(param_desc.name_pos, |
7647 "name '%s' already exists in scope", | 7664 "name '%s' already exists in scope", |
7648 param_desc.name->ToCString()); | 7665 param_desc.name->ToCString()); |
7649 } | 7666 } |
7650 param_desc.var = parameter; | 7667 param_desc.var = parameter; |
7651 if (param_desc.is_final) { | 7668 if (param_desc.is_final) { |
7652 parameter->set_is_final(); | 7669 parameter->set_is_final(); |
7653 } | 7670 } |
7654 if (FLAG_initializing_formal_access) { | 7671 if (FLAG_initializing_formal_access) { |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7746 const TokenPosition assign_pos = TokenPos(); | 7763 const TokenPosition assign_pos = TokenPos(); |
7747 AstNode* initialization = NULL; | 7764 AstNode* initialization = NULL; |
7748 LocalVariable* variable = NULL; | 7765 LocalVariable* variable = NULL; |
7749 if (CurrentToken() == Token::kASSIGN) { | 7766 if (CurrentToken() == Token::kASSIGN) { |
7750 // Variable initialization. | 7767 // Variable initialization. |
7751 ConsumeToken(); | 7768 ConsumeToken(); |
7752 AstNode* expr = ParseAwaitableExpr( | 7769 AstNode* expr = ParseAwaitableExpr( |
7753 is_const, kConsumeCascades, await_preamble); | 7770 is_const, kConsumeCascades, await_preamble); |
7754 const TokenPosition expr_end_pos = TokenPos(); | 7771 const TokenPosition expr_end_pos = TokenPos(); |
7755 variable = new(Z) LocalVariable( | 7772 variable = new(Z) LocalVariable( |
7756 expr_end_pos, ident, type); | 7773 ident_pos, |
| 7774 expr_end_pos, |
| 7775 ident, |
| 7776 type); |
7757 initialization = new(Z) StoreLocalNode( | 7777 initialization = new(Z) StoreLocalNode( |
7758 assign_pos, variable, expr); | 7778 assign_pos, variable, expr); |
7759 if (is_const) { | 7779 if (is_const) { |
7760 ASSERT(expr->IsLiteralNode()); | 7780 ASSERT(expr->IsLiteralNode()); |
7761 variable->SetConstValue(expr->AsLiteralNode()->literal()); | 7781 variable->SetConstValue(expr->AsLiteralNode()->literal()); |
7762 } | 7782 } |
7763 } else if (is_final || is_const) { | 7783 } else if (is_final || is_const) { |
7764 ReportError(ident_pos, | 7784 ReportError(ident_pos, |
7765 "missing initialization of 'final' or 'const' variable"); | 7785 "missing initialization of 'final' or 'const' variable"); |
7766 } else { | 7786 } else { |
7767 // Initialize variable with null. | 7787 // Initialize variable with null. |
7768 variable = new(Z) LocalVariable( | 7788 variable = new(Z) LocalVariable( |
7769 assign_pos, ident, type); | 7789 ident_pos, |
| 7790 assign_pos, |
| 7791 ident, |
| 7792 type); |
7770 AstNode* null_expr = new(Z) LiteralNode(ident_pos, Object::null_instance()); | 7793 AstNode* null_expr = new(Z) LiteralNode(ident_pos, Object::null_instance()); |
7771 initialization = new(Z) StoreLocalNode( | 7794 initialization = new(Z) StoreLocalNode( |
7772 ident_pos, variable, null_expr); | 7795 ident_pos, variable, null_expr); |
7773 } | 7796 } |
7774 | 7797 |
7775 ASSERT(current_block_ != NULL); | 7798 ASSERT(current_block_ != NULL); |
7776 const TokenPosition previous_pos = | 7799 const TokenPosition previous_pos = |
7777 current_block_->scope->PreviousReferencePos(ident); | 7800 current_block_->scope->PreviousReferencePos(ident); |
7778 if (previous_pos.IsReal()) { | 7801 if (previous_pos.IsReal()) { |
7779 ASSERT(!script_.IsNull()); | 7802 ASSERT(!script_.IsNull()); |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7896 | 7919 |
7897 AstNode* Parser::ParseFunctionStatement(bool is_literal) { | 7920 AstNode* Parser::ParseFunctionStatement(bool is_literal) { |
7898 TRACE_PARSER("ParseFunctionStatement"); | 7921 TRACE_PARSER("ParseFunctionStatement"); |
7899 AbstractType& result_type = AbstractType::Handle(Z); | 7922 AbstractType& result_type = AbstractType::Handle(Z); |
7900 const String* variable_name = NULL; | 7923 const String* variable_name = NULL; |
7901 const String* function_name = NULL; | 7924 const String* function_name = NULL; |
7902 | 7925 |
7903 result_type = Type::DynamicType(); | 7926 result_type = Type::DynamicType(); |
7904 | 7927 |
7905 const TokenPosition function_pos = TokenPos(); | 7928 const TokenPosition function_pos = TokenPos(); |
| 7929 TokenPosition function_name_pos = TokenPosition::kNoSource; |
7906 TokenPosition metadata_pos = TokenPosition::kNoSource; | 7930 TokenPosition metadata_pos = TokenPosition::kNoSource; |
7907 if (is_literal) { | 7931 if (is_literal) { |
7908 ASSERT(CurrentToken() == Token::kLPAREN || CurrentToken() == Token::kLT); | 7932 ASSERT(CurrentToken() == Token::kLPAREN || CurrentToken() == Token::kLT); |
7909 function_name = &Symbols::AnonymousClosure(); | 7933 function_name = &Symbols::AnonymousClosure(); |
7910 } else { | 7934 } else { |
7911 metadata_pos = SkipMetadata(); | 7935 metadata_pos = SkipMetadata(); |
7912 if (CurrentToken() == Token::kVOID) { | 7936 if (CurrentToken() == Token::kVOID) { |
7913 ConsumeToken(); | 7937 ConsumeToken(); |
7914 result_type = Type::VoidType(); | 7938 result_type = Type::VoidType(); |
7915 } else if (IsFunctionReturnType()) { | 7939 } else if (IsFunctionReturnType()) { |
7916 // It is too early to resolve the type here, since it can be a result type | 7940 // It is too early to resolve the type here, since it can be a result type |
7917 // referring to a not yet declared function type parameter. | 7941 // referring to a not yet declared function type parameter. |
7918 result_type = ParseType(ClassFinalizer::kDoNotResolve); | 7942 result_type = ParseType(ClassFinalizer::kDoNotResolve); |
7919 } | 7943 } |
7920 const TokenPosition name_pos = TokenPos(); | 7944 function_name_pos = TokenPos(); |
7921 variable_name = ExpectIdentifier("function name expected"); | 7945 variable_name = ExpectIdentifier("function name expected"); |
7922 function_name = variable_name; | 7946 function_name = variable_name; |
7923 | 7947 |
7924 // Check that the function name has not been referenced | 7948 // Check that the function name has not been referenced |
7925 // before this declaration. | 7949 // before this declaration. |
7926 ASSERT(current_block_ != NULL); | 7950 ASSERT(current_block_ != NULL); |
7927 const TokenPosition previous_pos = | 7951 const TokenPosition previous_pos = |
7928 current_block_->scope->PreviousReferencePos(*function_name); | 7952 current_block_->scope->PreviousReferencePos(*function_name); |
7929 if (previous_pos.IsReal()) { | 7953 if (previous_pos.IsReal()) { |
7930 ASSERT(!script_.IsNull()); | 7954 ASSERT(!script_.IsNull()); |
7931 intptr_t line_number; | 7955 intptr_t line_number; |
7932 script_.GetTokenLocation(previous_pos, &line_number, NULL); | 7956 script_.GetTokenLocation(previous_pos, &line_number, NULL); |
7933 ReportError(name_pos, | 7957 ReportError(function_name_pos, |
7934 "identifier '%s' previously used in line %" Pd "", | 7958 "identifier '%s' previously used in line %" Pd "", |
7935 function_name->ToCString(), | 7959 function_name->ToCString(), |
7936 line_number); | 7960 line_number); |
7937 } | 7961 } |
7938 } | 7962 } |
7939 | 7963 |
7940 // Check whether we have parsed this closure function before, in a previous | 7964 // Check whether we have parsed this closure function before, in a previous |
7941 // compilation. If so, reuse the function object, else create a new one | 7965 // compilation. If so, reuse the function object, else create a new one |
7942 // and register it in the current class. | 7966 // and register it in the current class. |
7943 // Note that we cannot share the same closure function between the closurized | 7967 // Note that we cannot share the same closure function between the closurized |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8002 const Class& unknown_scope_class = Class::Handle(Z, | 8026 const Class& unknown_scope_class = Class::Handle(Z, |
8003 I->object_store()->closure_class()); | 8027 I->object_store()->closure_class()); |
8004 function_type = Type::New(unknown_scope_class, | 8028 function_type = Type::New(unknown_scope_class, |
8005 TypeArguments::Handle(Z), | 8029 TypeArguments::Handle(Z), |
8006 function_pos); | 8030 function_pos); |
8007 function_type.set_signature(function); | 8031 function_type.set_signature(function); |
8008 function_type.SetIsFinalized(); // No finalization needed. | 8032 function_type.SetIsFinalized(); // No finalization needed. |
8009 | 8033 |
8010 // Add the function variable to the scope before parsing the function in | 8034 // Add the function variable to the scope before parsing the function in |
8011 // order to allow self reference from inside the function. | 8035 // order to allow self reference from inside the function. |
8012 function_variable = new(Z) LocalVariable(function_pos, | 8036 function_variable = new(Z) LocalVariable(function_name_pos, |
| 8037 function_pos, |
8013 *variable_name, | 8038 *variable_name, |
8014 function_type); | 8039 function_type); |
8015 function_variable->set_is_final(); | 8040 function_variable->set_is_final(); |
8016 ASSERT(current_block_ != NULL); | 8041 ASSERT(current_block_ != NULL); |
8017 ASSERT(current_block_->scope != NULL); | 8042 ASSERT(current_block_->scope != NULL); |
8018 if (!current_block_->scope->AddVariable(function_variable)) { | 8043 if (!current_block_->scope->AddVariable(function_variable)) { |
8019 LocalVariable* existing_var = | 8044 LocalVariable* existing_var = |
8020 current_block_->scope->LookupVariable(function_variable->name(), | 8045 current_block_->scope->LookupVariable(function_variable->name(), |
8021 true); | 8046 true); |
8022 ASSERT(existing_var != NULL); | 8047 ASSERT(existing_var != NULL); |
(...skipping 791 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8814 // variable is set to dynamic. It will later be patched to match the | 8839 // variable is set to dynamic. It will later be patched to match the |
8815 // type of the case clause expressions. Therefore, we have to allocate | 8840 // type of the case clause expressions. Therefore, we have to allocate |
8816 // a new type representing dynamic and can't reuse the canonical | 8841 // a new type representing dynamic and can't reuse the canonical |
8817 // type object for dynamic. | 8842 // type object for dynamic. |
8818 const Type& temp_var_type = Type::ZoneHandle(Z, | 8843 const Type& temp_var_type = Type::ZoneHandle(Z, |
8819 Type::New(Class::Handle(Z, Object::dynamic_class()), | 8844 Type::New(Class::Handle(Z, Object::dynamic_class()), |
8820 TypeArguments::Handle(Z), | 8845 TypeArguments::Handle(Z), |
8821 expr_pos)); | 8846 expr_pos)); |
8822 temp_var_type.SetIsFinalized(); | 8847 temp_var_type.SetIsFinalized(); |
8823 LocalVariable* temp_variable = new(Z) LocalVariable( | 8848 LocalVariable* temp_variable = new(Z) LocalVariable( |
8824 expr_pos, Symbols::SwitchExpr(), temp_var_type); | 8849 expr_pos, expr_pos, Symbols::SwitchExpr(), temp_var_type); |
8825 current_block_->scope->AddVariable(temp_variable); | 8850 current_block_->scope->AddVariable(temp_variable); |
8826 AstNode* save_switch_expr = new(Z) StoreLocalNode( | 8851 AstNode* save_switch_expr = new(Z) StoreLocalNode( |
8827 expr_pos, temp_variable, switch_expr); | 8852 expr_pos, temp_variable, switch_expr); |
8828 current_block_->statements->Add(save_switch_expr); | 8853 current_block_->statements->Add(save_switch_expr); |
8829 | 8854 |
8830 // Parse case clauses | 8855 // Parse case clauses |
8831 bool default_seen = false; | 8856 bool default_seen = false; |
8832 GrowableArray<LiteralNode*> case_expr_values; | 8857 GrowableArray<LiteralNode*> case_expr_values; |
8833 while (true) { | 8858 while (true) { |
8834 // Check for statement label | 8859 // Check for statement label |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9104 ASSERT(!iterator_ctor.IsNull()); | 9129 ASSERT(!iterator_ctor.IsNull()); |
9105 ArgumentListNode* ctor_args = new (Z) ArgumentListNode(stream_expr_pos); | 9130 ArgumentListNode* ctor_args = new (Z) ArgumentListNode(stream_expr_pos); |
9106 ctor_args->Add(stream_expr); | 9131 ctor_args->Add(stream_expr); |
9107 ConstructorCallNode* ctor_call = | 9132 ConstructorCallNode* ctor_call = |
9108 new (Z) ConstructorCallNode(stream_expr_pos, | 9133 new (Z) ConstructorCallNode(stream_expr_pos, |
9109 TypeArguments::ZoneHandle(Z), | 9134 TypeArguments::ZoneHandle(Z), |
9110 iterator_ctor, | 9135 iterator_ctor, |
9111 ctor_args); | 9136 ctor_args); |
9112 const AbstractType& iterator_type = Object::dynamic_type(); | 9137 const AbstractType& iterator_type = Object::dynamic_type(); |
9113 LocalVariable* iterator_var = new(Z) LocalVariable( | 9138 LocalVariable* iterator_var = new(Z) LocalVariable( |
9114 stream_expr_pos, Symbols::ForInIter(), iterator_type); | 9139 stream_expr_pos, stream_expr_pos, Symbols::ForInIter(), iterator_type); |
9115 current_block_->scope->AddVariable(iterator_var); | 9140 current_block_->scope->AddVariable(iterator_var); |
9116 AstNode* iterator_init = | 9141 AstNode* iterator_init = |
9117 new(Z) StoreLocalNode(stream_expr_pos, iterator_var, ctor_call); | 9142 new(Z) StoreLocalNode(stream_expr_pos, iterator_var, ctor_call); |
9118 current_block_->statements->Add(iterator_init); | 9143 current_block_->statements->Add(iterator_init); |
9119 | 9144 |
9120 // We need to ensure that the stream is cancelled after the loop. | 9145 // We need to ensure that the stream is cancelled after the loop. |
9121 // Thus, wrap the loop in a try-finally that calls :for-in-iter.close() | 9146 // Thus, wrap the loop in a try-finally that calls :for-in-iter.close() |
9122 // in the finally clause. It is harmless to call close() if the stream | 9147 // in the finally clause. It is harmless to call close() if the stream |
9123 // is already cancelled (when moveNext() returns false). | 9148 // is already cancelled (when moveNext() returns false). |
9124 // Note: even though this is async code, we do not need to set up | 9149 // Note: even though this is async code, we do not need to set up |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9189 | 9214 |
9190 // Generate assignment of next iterator value to loop variable. | 9215 // Generate assignment of next iterator value to loop variable. |
9191 AstNode* loop_var_assignment = NULL; | 9216 AstNode* loop_var_assignment = NULL; |
9192 if (new_loop_var) { | 9217 if (new_loop_var) { |
9193 // The for loop variable is new for each iteration. | 9218 // The for loop variable is new for each iteration. |
9194 // Create a variable and add it to the loop body scope. | 9219 // Create a variable and add it to the loop body scope. |
9195 // Note that the variable token position needs to be inside the | 9220 // Note that the variable token position needs to be inside the |
9196 // loop block, so it gets put in the loop context level. | 9221 // loop block, so it gets put in the loop context level. |
9197 LocalVariable* loop_var = | 9222 LocalVariable* loop_var = |
9198 new(Z) LocalVariable(loop_var_assignment_pos, | 9223 new(Z) LocalVariable(loop_var_assignment_pos, |
| 9224 loop_var_assignment_pos, |
9199 *loop_var_name, | 9225 *loop_var_name, |
9200 loop_var_type);; | 9226 loop_var_type);; |
9201 if (loop_var_is_final) { | 9227 if (loop_var_is_final) { |
9202 loop_var->set_is_final(); | 9228 loop_var->set_is_final(); |
9203 } | 9229 } |
9204 current_block_->scope->AddVariable(loop_var); | 9230 current_block_->scope->AddVariable(loop_var); |
9205 loop_var_assignment = new(Z) StoreLocalNode( | 9231 loop_var_assignment = new(Z) StoreLocalNode( |
9206 loop_var_assignment_pos, loop_var, iterator_current); | 9232 loop_var_assignment_pos, loop_var, iterator_current); |
9207 } else { | 9233 } else { |
9208 AstNode* loop_var_primary = | 9234 AstNode* loop_var_primary = |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9364 loop_var_pos = TokenPos(); | 9390 loop_var_pos = TokenPos(); |
9365 loop_var_name = ExpectIdentifier("variable name expected"); | 9391 loop_var_name = ExpectIdentifier("variable name expected"); |
9366 } else { | 9392 } else { |
9367 // The case without a type is handled above, so require a type here. | 9393 // The case without a type is handled above, so require a type here. |
9368 // Delay creation of the local variable until we know its actual | 9394 // Delay creation of the local variable until we know its actual |
9369 // position, which is inside the loop body. | 9395 // position, which is inside the loop body. |
9370 new_loop_var = true; | 9396 new_loop_var = true; |
9371 loop_var_type = ParseConstFinalVarOrType( | 9397 loop_var_type = ParseConstFinalVarOrType( |
9372 I->type_checks() ? ClassFinalizer::kCanonicalize : | 9398 I->type_checks() ? ClassFinalizer::kCanonicalize : |
9373 ClassFinalizer::kIgnore); | 9399 ClassFinalizer::kIgnore); |
| 9400 loop_var_pos = TokenPos(); |
9374 loop_var_name = ExpectIdentifier("variable name expected"); | 9401 loop_var_name = ExpectIdentifier("variable name expected"); |
9375 } | 9402 } |
9376 ExpectToken(Token::kIN); | 9403 ExpectToken(Token::kIN); |
9377 | 9404 |
9378 // Ensure that the block token range contains the call to moveNext and it | 9405 // Ensure that the block token range contains the call to moveNext and it |
9379 // also starts the block at a different token position than the following | 9406 // also starts the block at a different token position than the following |
9380 // loop block. Both blocks can allocate contexts and if they have a matching | 9407 // loop block. Both blocks can allocate contexts and if they have a matching |
9381 // token position range, it can be an issue (cf. bug 26941). | 9408 // token position range, it can be an issue (cf. bug 26941). |
9382 OpenBlock(); // Implicit block around while loop. | 9409 OpenBlock(); // Implicit block around while loop. |
9383 | 9410 |
9384 const TokenPosition collection_pos = TokenPos(); | 9411 const TokenPosition collection_pos = TokenPos(); |
9385 AstNode* collection_expr = | 9412 AstNode* collection_expr = |
9386 ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL); | 9413 ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL); |
9387 ExpectToken(Token::kRPAREN); | 9414 ExpectToken(Token::kRPAREN); |
9388 | 9415 |
9389 // Generate implicit iterator variable and add to scope. | 9416 // Generate implicit iterator variable and add to scope. |
9390 // We could set the type of the implicit iterator variable to Iterator<T> | 9417 // We could set the type of the implicit iterator variable to Iterator<T> |
9391 // where T is the type of the for loop variable. However, the type error | 9418 // where T is the type of the for loop variable. However, the type error |
9392 // would refer to the compiler generated iterator and could confuse the user. | 9419 // would refer to the compiler generated iterator and could confuse the user. |
9393 // It is better to leave the iterator untyped and postpone the type error | 9420 // It is better to leave the iterator untyped and postpone the type error |
9394 // until the loop variable is assigned to. | 9421 // until the loop variable is assigned to. |
9395 const AbstractType& iterator_type = Object::dynamic_type(); | 9422 const AbstractType& iterator_type = Object::dynamic_type(); |
9396 LocalVariable* iterator_var = new(Z) LocalVariable( | 9423 LocalVariable* iterator_var = new(Z) LocalVariable( |
| 9424 collection_pos, |
9397 collection_pos, Symbols::ForInIter(), iterator_type); | 9425 collection_pos, Symbols::ForInIter(), iterator_type); |
9398 current_block_->scope->AddVariable(iterator_var); | 9426 current_block_->scope->AddVariable(iterator_var); |
9399 | 9427 |
9400 // Generate initialization of iterator variable. | 9428 // Generate initialization of iterator variable. |
9401 ArgumentListNode* no_args = new(Z) ArgumentListNode(collection_pos); | 9429 ArgumentListNode* no_args = new(Z) ArgumentListNode(collection_pos); |
9402 AstNode* get_iterator = new(Z) InstanceGetterNode( | 9430 AstNode* get_iterator = new(Z) InstanceGetterNode( |
9403 collection_pos, collection_expr, Symbols::Iterator()); | 9431 collection_pos, collection_expr, Symbols::Iterator()); |
9404 AstNode* iterator_init = | 9432 AstNode* iterator_init = |
9405 new(Z) StoreLocalNode(collection_pos, iterator_var, get_iterator); | 9433 new(Z) StoreLocalNode(collection_pos, iterator_var, get_iterator); |
9406 current_block_->statements->Add(iterator_init); | 9434 current_block_->statements->Add(iterator_init); |
(...skipping 17 matching lines...) Expand all Loading... |
9424 loop_var_assignment_pos, | 9452 loop_var_assignment_pos, |
9425 new(Z) LoadLocalNode(loop_var_assignment_pos, iterator_var), | 9453 new(Z) LoadLocalNode(loop_var_assignment_pos, iterator_var), |
9426 Symbols::Current()); | 9454 Symbols::Current()); |
9427 | 9455 |
9428 // Generate assignment of next iterator value to loop variable. | 9456 // Generate assignment of next iterator value to loop variable. |
9429 AstNode* loop_var_assignment = NULL; | 9457 AstNode* loop_var_assignment = NULL; |
9430 if (new_loop_var) { | 9458 if (new_loop_var) { |
9431 // The for loop variable is new for each iteration. | 9459 // The for loop variable is new for each iteration. |
9432 // Create a variable and add it to the loop body scope. | 9460 // Create a variable and add it to the loop body scope. |
9433 LocalVariable* loop_var = | 9461 LocalVariable* loop_var = |
9434 new(Z) LocalVariable(loop_var_assignment_pos, | 9462 new(Z) LocalVariable(loop_var_pos, |
| 9463 loop_var_assignment_pos, |
9435 *loop_var_name, | 9464 *loop_var_name, |
9436 loop_var_type);; | 9465 loop_var_type);; |
9437 if (loop_var_is_final) { | 9466 if (loop_var_is_final) { |
9438 loop_var->set_is_final(); | 9467 loop_var->set_is_final(); |
9439 } | 9468 } |
9440 current_block_->scope->AddVariable(loop_var); | 9469 current_block_->scope->AddVariable(loop_var); |
9441 loop_var_assignment = new(Z) StoreLocalNode( | 9470 loop_var_assignment = new(Z) StoreLocalNode( |
9442 loop_var_assignment_pos, loop_var, iterator_current); | 9471 loop_var_assignment_pos, loop_var, iterator_current); |
9443 } else { | 9472 } else { |
9444 AstNode* loop_var_primary = | 9473 AstNode* loop_var_primary = |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9591 } | 9620 } |
9592 | 9621 |
9593 | 9622 |
9594 // Populate local scope of the catch block with the catch parameters. | 9623 // Populate local scope of the catch block with the catch parameters. |
9595 void Parser::AddCatchParamsToScope(CatchParamDesc* exception_param, | 9624 void Parser::AddCatchParamsToScope(CatchParamDesc* exception_param, |
9596 CatchParamDesc* stack_trace_param, | 9625 CatchParamDesc* stack_trace_param, |
9597 LocalScope* scope) { | 9626 LocalScope* scope) { |
9598 if (exception_param->name != NULL) { | 9627 if (exception_param->name != NULL) { |
9599 LocalVariable* var = new(Z) LocalVariable( | 9628 LocalVariable* var = new(Z) LocalVariable( |
9600 exception_param->token_pos, | 9629 exception_param->token_pos, |
| 9630 exception_param->token_pos, |
9601 *exception_param->name, | 9631 *exception_param->name, |
9602 *exception_param->type); | 9632 *exception_param->type); |
9603 var->set_is_final(); | 9633 var->set_is_final(); |
9604 bool added_to_scope = scope->AddVariable(var); | 9634 bool added_to_scope = scope->AddVariable(var); |
9605 ASSERT(added_to_scope); | 9635 ASSERT(added_to_scope); |
9606 exception_param->var = var; | 9636 exception_param->var = var; |
9607 } | 9637 } |
9608 if (stack_trace_param->name != NULL) { | 9638 if (stack_trace_param->name != NULL) { |
9609 LocalVariable* var = new(Z) LocalVariable( | 9639 LocalVariable* var = new(Z) LocalVariable( |
9610 stack_trace_param->token_pos, | 9640 stack_trace_param->token_pos, |
| 9641 stack_trace_param->token_pos, |
9611 *stack_trace_param->name, | 9642 *stack_trace_param->name, |
9612 *stack_trace_param->type); | 9643 *stack_trace_param->type); |
9613 var->set_is_final(); | 9644 var->set_is_final(); |
9614 bool added_to_scope = scope->AddVariable(var); | 9645 bool added_to_scope = scope->AddVariable(var); |
9615 if (!added_to_scope) { | 9646 if (!added_to_scope) { |
9616 // The name of the exception param is reused for the stack trace param. | 9647 // The name of the exception param is reused for the stack trace param. |
9617 ReportError(stack_trace_param->token_pos, | 9648 ReportError(stack_trace_param->token_pos, |
9618 "name '%s' already exists in scope", | 9649 "name '%s' already exists in scope", |
9619 stack_trace_param->name->ToCString()); | 9650 stack_trace_param->name->ToCString()); |
9620 } | 9651 } |
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10010 | 10041 |
10011 | 10042 |
10012 void Parser::SetupSavedTryContext(LocalVariable* saved_try_context) { | 10043 void Parser::SetupSavedTryContext(LocalVariable* saved_try_context) { |
10013 const String& async_saved_try_ctx_name = String::ZoneHandle(Z, | 10044 const String& async_saved_try_ctx_name = String::ZoneHandle(Z, |
10014 Symbols::NewFormatted(T, | 10045 Symbols::NewFormatted(T, |
10015 "%s%d", | 10046 "%s%d", |
10016 Symbols::AsyncSavedTryCtxVarPrefix().ToCString(), | 10047 Symbols::AsyncSavedTryCtxVarPrefix().ToCString(), |
10017 last_used_try_index_ - 1)); | 10048 last_used_try_index_ - 1)); |
10018 LocalVariable* async_saved_try_ctx = new (Z) LocalVariable( | 10049 LocalVariable* async_saved_try_ctx = new (Z) LocalVariable( |
10019 TokenPosition::kNoSource, | 10050 TokenPosition::kNoSource, |
| 10051 TokenPosition::kNoSource, |
10020 async_saved_try_ctx_name, | 10052 async_saved_try_ctx_name, |
10021 Object::dynamic_type()); | 10053 Object::dynamic_type()); |
10022 ASSERT(async_temp_scope_ != NULL); | 10054 ASSERT(async_temp_scope_ != NULL); |
10023 async_temp_scope_->AddVariable(async_saved_try_ctx); | 10055 async_temp_scope_->AddVariable(async_saved_try_ctx); |
10024 ASSERT(saved_try_context != NULL); | 10056 ASSERT(saved_try_context != NULL); |
10025 current_block_->statements->Add(new(Z) StoreLocalNode( | 10057 current_block_->statements->Add(new(Z) StoreLocalNode( |
10026 TokenPosition::kNoSource, | 10058 TokenPosition::kNoSource, |
10027 async_saved_try_ctx, | 10059 async_saved_try_ctx, |
10028 new(Z) LoadLocalNode(TokenPosition::kNoSource, saved_try_context))); | 10060 new(Z) LoadLocalNode(TokenPosition::kNoSource, saved_try_context))); |
10029 } | 10061 } |
(...skipping 21 matching lines...) Expand all Loading... |
10051 LocalVariable** context_var, | 10083 LocalVariable** context_var, |
10052 LocalVariable** exception_var, | 10084 LocalVariable** exception_var, |
10053 LocalVariable** stack_trace_var, | 10085 LocalVariable** stack_trace_var, |
10054 LocalVariable** saved_exception_var, | 10086 LocalVariable** saved_exception_var, |
10055 LocalVariable** saved_stack_trace_var) { | 10087 LocalVariable** saved_stack_trace_var) { |
10056 // Consecutive try statements share the same set of variables. | 10088 // Consecutive try statements share the same set of variables. |
10057 *context_var = try_scope->LocalLookupVariable(Symbols::SavedTryContextVar()); | 10089 *context_var = try_scope->LocalLookupVariable(Symbols::SavedTryContextVar()); |
10058 if (*context_var == NULL) { | 10090 if (*context_var == NULL) { |
10059 *context_var = new(Z) LocalVariable( | 10091 *context_var = new(Z) LocalVariable( |
10060 TokenPos(), | 10092 TokenPos(), |
| 10093 TokenPos(), |
10061 Symbols::SavedTryContextVar(), | 10094 Symbols::SavedTryContextVar(), |
10062 Object::dynamic_type()); | 10095 Object::dynamic_type()); |
10063 try_scope->AddVariable(*context_var); | 10096 try_scope->AddVariable(*context_var); |
10064 } | 10097 } |
10065 *exception_var = try_scope->LocalLookupVariable(Symbols::ExceptionVar()); | 10098 *exception_var = try_scope->LocalLookupVariable(Symbols::ExceptionVar()); |
10066 if (*exception_var == NULL) { | 10099 if (*exception_var == NULL) { |
10067 *exception_var = new(Z) LocalVariable( | 10100 *exception_var = new(Z) LocalVariable( |
10068 TokenPos(), | 10101 TokenPos(), |
| 10102 TokenPos(), |
10069 Symbols::ExceptionVar(), | 10103 Symbols::ExceptionVar(), |
10070 Object::dynamic_type()); | 10104 Object::dynamic_type()); |
10071 try_scope->AddVariable(*exception_var); | 10105 try_scope->AddVariable(*exception_var); |
10072 } | 10106 } |
10073 *stack_trace_var = try_scope->LocalLookupVariable(Symbols::StackTraceVar()); | 10107 *stack_trace_var = try_scope->LocalLookupVariable(Symbols::StackTraceVar()); |
10074 if (*stack_trace_var == NULL) { | 10108 if (*stack_trace_var == NULL) { |
10075 *stack_trace_var = new(Z) LocalVariable( | 10109 *stack_trace_var = new(Z) LocalVariable( |
10076 TokenPos(), | 10110 TokenPos(), |
| 10111 TokenPos(), |
10077 Symbols::StackTraceVar(), | 10112 Symbols::StackTraceVar(), |
10078 Object::dynamic_type()); | 10113 Object::dynamic_type()); |
10079 try_scope->AddVariable(*stack_trace_var); | 10114 try_scope->AddVariable(*stack_trace_var); |
10080 } | 10115 } |
10081 if (is_async) { | 10116 if (is_async) { |
10082 *saved_exception_var = try_scope->LocalLookupVariable( | 10117 *saved_exception_var = try_scope->LocalLookupVariable( |
10083 Symbols::SavedExceptionVar()); | 10118 Symbols::SavedExceptionVar()); |
10084 if (*saved_exception_var == NULL) { | 10119 if (*saved_exception_var == NULL) { |
10085 *saved_exception_var = new(Z) LocalVariable( | 10120 *saved_exception_var = new(Z) LocalVariable( |
10086 TokenPos(), | 10121 TokenPos(), |
| 10122 TokenPos(), |
10087 Symbols::SavedExceptionVar(), | 10123 Symbols::SavedExceptionVar(), |
10088 Object::dynamic_type()); | 10124 Object::dynamic_type()); |
10089 try_scope->AddVariable(*saved_exception_var); | 10125 try_scope->AddVariable(*saved_exception_var); |
10090 } | 10126 } |
10091 *saved_stack_trace_var = try_scope->LocalLookupVariable( | 10127 *saved_stack_trace_var = try_scope->LocalLookupVariable( |
10092 Symbols::SavedStackTraceVar()); | 10128 Symbols::SavedStackTraceVar()); |
10093 if (*saved_stack_trace_var == NULL) { | 10129 if (*saved_stack_trace_var == NULL) { |
10094 *saved_stack_trace_var = new(Z) LocalVariable( | 10130 *saved_stack_trace_var = new(Z) LocalVariable( |
10095 TokenPos(), | 10131 TokenPos(), |
| 10132 TokenPos(), |
10096 Symbols::SavedStackTraceVar(), | 10133 Symbols::SavedStackTraceVar(), |
10097 Object::dynamic_type()); | 10134 Object::dynamic_type()); |
10098 try_scope->AddVariable(*saved_stack_trace_var); | 10135 try_scope->AddVariable(*saved_stack_trace_var); |
10099 } | 10136 } |
10100 } | 10137 } |
10101 } | 10138 } |
10102 | 10139 |
10103 | 10140 |
10104 AstNode* Parser::ParseTryStatement(String* label_name) { | 10141 AstNode* Parser::ParseTryStatement(String* label_name) { |
10105 TRACE_PARSER("ParseTryStatement"); | 10142 TRACE_PARSER("ParseTryStatement"); |
(...skipping 960 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11066 parsed_function()->EnsureExpressionTemp(); | 11103 parsed_function()->EnsureExpressionTemp(); |
11067 } | 11104 } |
11068 | 11105 |
11069 | 11106 |
11070 LocalVariable* Parser::CreateTempConstVariable(TokenPosition token_pos, | 11107 LocalVariable* Parser::CreateTempConstVariable(TokenPosition token_pos, |
11071 const char* s) { | 11108 const char* s) { |
11072 char name[64]; | 11109 char name[64]; |
11073 OS::SNPrint(name, 64, ":%s%" Pd "", s, token_pos.value()); | 11110 OS::SNPrint(name, 64, ":%s%" Pd "", s, token_pos.value()); |
11074 LocalVariable* temp = new(Z) LocalVariable( | 11111 LocalVariable* temp = new(Z) LocalVariable( |
11075 token_pos, | 11112 token_pos, |
| 11113 token_pos, |
11076 String::ZoneHandle(Z, Symbols::New(T, name)), | 11114 String::ZoneHandle(Z, Symbols::New(T, name)), |
11077 Object::dynamic_type()); | 11115 Object::dynamic_type()); |
11078 temp->set_is_final(); | 11116 temp->set_is_final(); |
11079 current_block_->scope->AddVariable(temp); | 11117 current_block_->scope->AddVariable(temp); |
11080 return temp; | 11118 return temp; |
11081 } | 11119 } |
11082 | 11120 |
11083 | 11121 |
11084 AstNode* Parser::OptimizeBinaryOpNode(TokenPosition op_pos, | 11122 AstNode* Parser::OptimizeBinaryOpNode(TokenPosition op_pos, |
11085 Token::Kind binary_op, | 11123 Token::Kind binary_op, |
(...skipping 3999 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15085 const ArgumentListNode& function_args, | 15123 const ArgumentListNode& function_args, |
15086 const LocalVariable* temp_for_last_arg, | 15124 const LocalVariable* temp_for_last_arg, |
15087 bool is_super_invocation) { | 15125 bool is_super_invocation) { |
15088 UNREACHABLE(); | 15126 UNREACHABLE(); |
15089 return NULL; | 15127 return NULL; |
15090 } | 15128 } |
15091 | 15129 |
15092 } // namespace dart | 15130 } // namespace dart |
15093 | 15131 |
15094 #endif // DART_PRECOMPILED_RUNTIME | 15132 #endif // DART_PRECOMPILED_RUNTIME |
OLD | NEW |