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 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 kernel_scopes_ = builder.BuildScopes(); | 237 kernel_scopes_ = builder.BuildScopes(); |
238 } | 238 } |
239 return kernel_scopes_; | 239 return kernel_scopes_; |
240 } | 240 } |
241 | 241 |
242 | 242 |
243 LocalVariable* ParsedFunction::EnsureExpressionTemp() { | 243 LocalVariable* ParsedFunction::EnsureExpressionTemp() { |
244 if (!has_expression_temp_var()) { | 244 if (!has_expression_temp_var()) { |
245 LocalVariable* temp = | 245 LocalVariable* temp = |
246 new (Z) LocalVariable(function_.token_pos(), | 246 new (Z) LocalVariable(function_.token_pos(), |
| 247 function_.token_pos(), |
247 Symbols::ExprTemp(), | 248 Symbols::ExprTemp(), |
248 Object::dynamic_type()); | 249 Object::dynamic_type()); |
249 ASSERT(temp != NULL); | 250 ASSERT(temp != NULL); |
250 set_expression_temp_var(temp); | 251 set_expression_temp_var(temp); |
251 } | 252 } |
252 ASSERT(has_expression_temp_var()); | 253 ASSERT(has_expression_temp_var()); |
253 return expression_temp_var(); | 254 return expression_temp_var(); |
254 } | 255 } |
255 | 256 |
256 | 257 |
257 void ParsedFunction::EnsureFinallyReturnTemp(bool is_async) { | 258 void ParsedFunction::EnsureFinallyReturnTemp(bool is_async) { |
258 if (!has_finally_return_temp_var()) { | 259 if (!has_finally_return_temp_var()) { |
259 LocalVariable* temp = new(Z) LocalVariable( | 260 LocalVariable* temp = new(Z) LocalVariable( |
260 function_.token_pos(), | 261 function_.token_pos(), |
| 262 function_.token_pos(), |
261 Symbols::FinallyRetVal(), | 263 Symbols::FinallyRetVal(), |
262 Object::dynamic_type()); | 264 Object::dynamic_type()); |
263 ASSERT(temp != NULL); | 265 ASSERT(temp != NULL); |
264 temp->set_is_final(); | 266 temp->set_is_final(); |
265 if (is_async) { | 267 if (is_async) { |
266 temp->set_is_captured(); | 268 temp->set_is_captured(); |
267 } | 269 } |
268 set_finally_return_temp_var(temp); | 270 set_finally_return_temp_var(temp); |
269 } | 271 } |
270 ASSERT(has_finally_return_temp_var()); | 272 ASSERT(has_finally_return_temp_var()); |
(...skipping 2860 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3131 | 3133 |
3132 | 3134 |
3133 SequenceNode* Parser::MakeImplicitConstructor(const Function& func) { | 3135 SequenceNode* Parser::MakeImplicitConstructor(const Function& func) { |
3134 ASSERT(func.IsGenerativeConstructor()); | 3136 ASSERT(func.IsGenerativeConstructor()); |
3135 ASSERT(func.Owner() == current_class().raw()); | 3137 ASSERT(func.Owner() == current_class().raw()); |
3136 const TokenPosition ctor_pos = TokenPos(); | 3138 const TokenPosition ctor_pos = TokenPos(); |
3137 OpenFunctionBlock(func); | 3139 OpenFunctionBlock(func); |
3138 | 3140 |
3139 LocalVariable* receiver = new LocalVariable( | 3141 LocalVariable* receiver = new LocalVariable( |
3140 TokenPosition::kNoSource, | 3142 TokenPosition::kNoSource, |
| 3143 TokenPosition::kNoSource, |
3141 Symbols::This(), | 3144 Symbols::This(), |
3142 *ReceiverType(current_class())); | 3145 *ReceiverType(current_class())); |
3143 current_block_->scope->InsertParameterAt(0, receiver); | 3146 current_block_->scope->InsertParameterAt(0, receiver); |
3144 | 3147 |
3145 // Parse expressions of instance fields that have an explicit | 3148 // Parse expressions of instance fields that have an explicit |
3146 // initializer expression. | 3149 // initializer expression. |
3147 // The receiver must not be visible to field initializer expressions. | 3150 // The receiver must not be visible to field initializer expressions. |
3148 receiver->set_invisible(true); | 3151 receiver->set_invisible(true); |
3149 GrowableArray<Field*> initialized_fields; | 3152 GrowableArray<Field*> initialized_fields; |
3150 ParseInitializedInstanceFields( | 3153 ParseInitializedInstanceFields( |
(...skipping 28 matching lines...) Expand all Loading... |
3179 "constructor of the class extending the mixin application", | 3182 "constructor of the class extending the mixin application", |
3180 String::Handle(Z, super_class.Name()).ToCString()); | 3183 String::Handle(Z, super_class.Name()).ToCString()); |
3181 } | 3184 } |
3182 | 3185 |
3183 // Prepare user-defined arguments to be forwarded to super call. | 3186 // Prepare user-defined arguments to be forwarded to super call. |
3184 // The first user-defined argument is at position 1. | 3187 // The first user-defined argument is at position 1. |
3185 forwarding_args = new ArgumentListNode(ST(ctor_pos)); | 3188 forwarding_args = new ArgumentListNode(ST(ctor_pos)); |
3186 for (int i = 1; i < func.NumParameters(); i++) { | 3189 for (int i = 1; i < func.NumParameters(); i++) { |
3187 LocalVariable* param = new LocalVariable( | 3190 LocalVariable* param = new LocalVariable( |
3188 TokenPosition::kNoSource, | 3191 TokenPosition::kNoSource, |
| 3192 TokenPosition::kNoSource, |
3189 String::ZoneHandle(Z, func.ParameterNameAt(i)), | 3193 String::ZoneHandle(Z, func.ParameterNameAt(i)), |
3190 Object::dynamic_type()); | 3194 Object::dynamic_type()); |
3191 current_block_->scope->InsertParameterAt(i, param); | 3195 current_block_->scope->InsertParameterAt(i, param); |
3192 forwarding_args->Add(new LoadLocalNode(ST(ctor_pos), param)); | 3196 forwarding_args->Add(new LoadLocalNode(ST(ctor_pos), param)); |
3193 } | 3197 } |
3194 } | 3198 } |
3195 | 3199 |
3196 AstNode* super_call = GenerateSuperConstructorCall( | 3200 AstNode* super_call = GenerateSuperConstructorCall( |
3197 current_class(), | 3201 current_class(), |
3198 ctor_pos, | 3202 ctor_pos, |
(...skipping 3896 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7095 return closure.raw(); | 7099 return closure.raw(); |
7096 } | 7100 } |
7097 | 7101 |
7098 | 7102 |
7099 void Parser::AddContinuationVariables() { | 7103 void Parser::AddContinuationVariables() { |
7100 // Add to current block's scope: | 7104 // Add to current block's scope: |
7101 // var :await_jump_var; | 7105 // var :await_jump_var; |
7102 // var :await_ctx_var; | 7106 // var :await_ctx_var; |
7103 LocalVariable* await_jump_var = new (Z) LocalVariable( | 7107 LocalVariable* await_jump_var = new (Z) LocalVariable( |
7104 TokenPosition::kNoSource, | 7108 TokenPosition::kNoSource, |
| 7109 TokenPosition::kNoSource, |
7105 Symbols::AwaitJumpVar(), | 7110 Symbols::AwaitJumpVar(), |
7106 Object::dynamic_type()); | 7111 Object::dynamic_type()); |
7107 current_block_->scope->AddVariable(await_jump_var); | 7112 current_block_->scope->AddVariable(await_jump_var); |
7108 LocalVariable* await_ctx_var = new (Z) LocalVariable( | 7113 LocalVariable* await_ctx_var = new (Z) LocalVariable( |
7109 TokenPosition::kNoSource, | 7114 TokenPosition::kNoSource, |
| 7115 TokenPosition::kNoSource, |
7110 Symbols::AwaitContextVar(), | 7116 Symbols::AwaitContextVar(), |
7111 Object::dynamic_type()); | 7117 Object::dynamic_type()); |
7112 current_block_->scope->AddVariable(await_ctx_var); | 7118 current_block_->scope->AddVariable(await_ctx_var); |
7113 } | 7119 } |
7114 | 7120 |
7115 | 7121 |
7116 void Parser::AddAsyncClosureVariables() { | 7122 void Parser::AddAsyncClosureVariables() { |
7117 // Add to current block's scope: | 7123 // Add to current block's scope: |
7118 // var :async_op; | 7124 // var :async_op; |
7119 // var :async_then_callback; | 7125 // var :async_then_callback; |
7120 // var :async_catch_error_callback; | 7126 // var :async_catch_error_callback; |
7121 // var :async_completer; | 7127 // var :async_completer; |
7122 LocalVariable* async_op_var = new(Z) LocalVariable( | 7128 LocalVariable* async_op_var = new(Z) LocalVariable( |
7123 TokenPosition::kNoSource, | 7129 TokenPosition::kNoSource, |
| 7130 TokenPosition::kNoSource, |
7124 Symbols::AsyncOperation(), | 7131 Symbols::AsyncOperation(), |
7125 Object::dynamic_type()); | 7132 Object::dynamic_type()); |
7126 current_block_->scope->AddVariable(async_op_var); | 7133 current_block_->scope->AddVariable(async_op_var); |
7127 LocalVariable* async_then_callback_var = new(Z) LocalVariable( | 7134 LocalVariable* async_then_callback_var = new(Z) LocalVariable( |
7128 TokenPosition::kNoSource, | 7135 TokenPosition::kNoSource, |
| 7136 TokenPosition::kNoSource, |
7129 Symbols::AsyncThenCallback(), | 7137 Symbols::AsyncThenCallback(), |
7130 Object::dynamic_type()); | 7138 Object::dynamic_type()); |
7131 current_block_->scope->AddVariable(async_then_callback_var); | 7139 current_block_->scope->AddVariable(async_then_callback_var); |
7132 LocalVariable* async_catch_error_callback_var = new(Z) LocalVariable( | 7140 LocalVariable* async_catch_error_callback_var = new(Z) LocalVariable( |
7133 TokenPosition::kNoSource, | 7141 TokenPosition::kNoSource, |
| 7142 TokenPosition::kNoSource, |
7134 Symbols::AsyncCatchErrorCallback(), | 7143 Symbols::AsyncCatchErrorCallback(), |
7135 Object::dynamic_type()); | 7144 Object::dynamic_type()); |
7136 current_block_->scope->AddVariable(async_catch_error_callback_var); | 7145 current_block_->scope->AddVariable(async_catch_error_callback_var); |
7137 LocalVariable* async_completer = new(Z) LocalVariable( | 7146 LocalVariable* async_completer = new(Z) LocalVariable( |
7138 TokenPosition::kNoSource, | 7147 TokenPosition::kNoSource, |
| 7148 TokenPosition::kNoSource, |
7139 Symbols::AsyncCompleter(), | 7149 Symbols::AsyncCompleter(), |
7140 Object::dynamic_type()); | 7150 Object::dynamic_type()); |
7141 current_block_->scope->AddVariable(async_completer); | 7151 current_block_->scope->AddVariable(async_completer); |
7142 } | 7152 } |
7143 | 7153 |
7144 | 7154 |
7145 void Parser::AddAsyncGeneratorVariables() { | 7155 void Parser::AddAsyncGeneratorVariables() { |
7146 // Add to current block's scope: | 7156 // Add to current block's scope: |
7147 // var :controller; | 7157 // var :controller; |
7148 // The :controller variable is used by the async generator closure to | 7158 // The :controller variable is used by the async generator closure to |
7149 // store the StreamController object to which the yielded expressions | 7159 // store the StreamController object to which the yielded expressions |
7150 // are added. | 7160 // are added. |
7151 // var :async_op; | 7161 // var :async_op; |
7152 // var :async_then_callback; | 7162 // var :async_then_callback; |
7153 // var :async_catch_error_callback; | 7163 // var :async_catch_error_callback; |
7154 // These variables are used to store the async generator closure containing | 7164 // These variables are used to store the async generator closure containing |
7155 // the body of the async* function. They are used by the await operator. | 7165 // the body of the async* function. They are used by the await operator. |
7156 LocalVariable* controller_var = new(Z) LocalVariable( | 7166 LocalVariable* controller_var = new(Z) LocalVariable( |
7157 TokenPosition::kNoSource, | 7167 TokenPosition::kNoSource, |
| 7168 TokenPosition::kNoSource, |
7158 Symbols::Controller(), | 7169 Symbols::Controller(), |
7159 Object::dynamic_type()); | 7170 Object::dynamic_type()); |
7160 current_block_->scope->AddVariable(controller_var); | 7171 current_block_->scope->AddVariable(controller_var); |
7161 LocalVariable* async_op_var = new(Z) LocalVariable( | 7172 LocalVariable* async_op_var = new(Z) LocalVariable( |
7162 TokenPosition::kNoSource, | 7173 TokenPosition::kNoSource, |
| 7174 TokenPosition::kNoSource, |
7163 Symbols::AsyncOperation(), | 7175 Symbols::AsyncOperation(), |
7164 Object::dynamic_type()); | 7176 Object::dynamic_type()); |
7165 current_block_->scope->AddVariable(async_op_var); | 7177 current_block_->scope->AddVariable(async_op_var); |
7166 LocalVariable* async_then_callback_var = new(Z) LocalVariable( | 7178 LocalVariable* async_then_callback_var = new(Z) LocalVariable( |
7167 TokenPosition::kNoSource, | 7179 TokenPosition::kNoSource, |
| 7180 TokenPosition::kNoSource, |
7168 Symbols::AsyncThenCallback(), | 7181 Symbols::AsyncThenCallback(), |
7169 Object::dynamic_type()); | 7182 Object::dynamic_type()); |
7170 current_block_->scope->AddVariable(async_then_callback_var); | 7183 current_block_->scope->AddVariable(async_then_callback_var); |
7171 LocalVariable* async_catch_error_callback_var = new(Z) LocalVariable( | 7184 LocalVariable* async_catch_error_callback_var = new(Z) LocalVariable( |
7172 TokenPosition::kNoSource, | 7185 TokenPosition::kNoSource, |
| 7186 TokenPosition::kNoSource, |
7173 Symbols::AsyncCatchErrorCallback(), | 7187 Symbols::AsyncCatchErrorCallback(), |
7174 Object::dynamic_type()); | 7188 Object::dynamic_type()); |
7175 current_block_->scope->AddVariable(async_catch_error_callback_var); | 7189 current_block_->scope->AddVariable(async_catch_error_callback_var); |
7176 } | 7190 } |
7177 | 7191 |
7178 | 7192 |
7179 RawFunction* Parser::OpenAsyncGeneratorFunction( | 7193 RawFunction* Parser::OpenAsyncGeneratorFunction( |
7180 TokenPosition async_func_pos) { | 7194 TokenPosition async_func_pos) { |
7181 TRACE_PARSER("OpenAsyncGeneratorFunction"); | 7195 TRACE_PARSER("OpenAsyncGeneratorFunction"); |
7182 AddContinuationVariables(); | 7196 AddContinuationVariables(); |
(...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7651 void Parser::AddFormalParamsToScope(const ParamList* params, | 7665 void Parser::AddFormalParamsToScope(const ParamList* params, |
7652 LocalScope* scope) { | 7666 LocalScope* scope) { |
7653 ASSERT((params != NULL) && (params->parameters != NULL)); | 7667 ASSERT((params != NULL) && (params->parameters != NULL)); |
7654 ASSERT(scope != NULL); | 7668 ASSERT(scope != NULL); |
7655 const int num_parameters = params->parameters->length(); | 7669 const int num_parameters = params->parameters->length(); |
7656 for (int i = 0; i < num_parameters; i++) { | 7670 for (int i = 0; i < num_parameters; i++) { |
7657 ParamDesc& param_desc = (*params->parameters)[i]; | 7671 ParamDesc& param_desc = (*params->parameters)[i]; |
7658 ASSERT(!is_top_level_ || param_desc.type->IsResolved()); | 7672 ASSERT(!is_top_level_ || param_desc.type->IsResolved()); |
7659 const String* name = param_desc.name; | 7673 const String* name = param_desc.name; |
7660 LocalVariable* parameter = new(Z) LocalVariable( | 7674 LocalVariable* parameter = new(Z) LocalVariable( |
7661 param_desc.name_pos, *name, *param_desc.type); | 7675 param_desc.name_pos, |
| 7676 param_desc.name_pos, |
| 7677 *name, |
| 7678 *param_desc.type); |
7662 if (!scope->InsertParameterAt(i, parameter)) { | 7679 if (!scope->InsertParameterAt(i, parameter)) { |
7663 ReportError(param_desc.name_pos, | 7680 ReportError(param_desc.name_pos, |
7664 "name '%s' already exists in scope", | 7681 "name '%s' already exists in scope", |
7665 param_desc.name->ToCString()); | 7682 param_desc.name->ToCString()); |
7666 } | 7683 } |
7667 param_desc.var = parameter; | 7684 param_desc.var = parameter; |
7668 if (param_desc.is_final) { | 7685 if (param_desc.is_final) { |
7669 parameter->set_is_final(); | 7686 parameter->set_is_final(); |
7670 } | 7687 } |
7671 if (FLAG_initializing_formal_access) { | 7688 if (FLAG_initializing_formal_access) { |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7763 const TokenPosition assign_pos = TokenPos(); | 7780 const TokenPosition assign_pos = TokenPos(); |
7764 AstNode* initialization = NULL; | 7781 AstNode* initialization = NULL; |
7765 LocalVariable* variable = NULL; | 7782 LocalVariable* variable = NULL; |
7766 if (CurrentToken() == Token::kASSIGN) { | 7783 if (CurrentToken() == Token::kASSIGN) { |
7767 // Variable initialization. | 7784 // Variable initialization. |
7768 ConsumeToken(); | 7785 ConsumeToken(); |
7769 AstNode* expr = ParseAwaitableExpr( | 7786 AstNode* expr = ParseAwaitableExpr( |
7770 is_const, kConsumeCascades, await_preamble); | 7787 is_const, kConsumeCascades, await_preamble); |
7771 const TokenPosition expr_end_pos = TokenPos(); | 7788 const TokenPosition expr_end_pos = TokenPos(); |
7772 variable = new(Z) LocalVariable( | 7789 variable = new(Z) LocalVariable( |
7773 expr_end_pos, ident, type); | 7790 ident_pos, |
| 7791 expr_end_pos, |
| 7792 ident, |
| 7793 type); |
7774 initialization = new(Z) StoreLocalNode( | 7794 initialization = new(Z) StoreLocalNode( |
7775 assign_pos, variable, expr); | 7795 assign_pos, variable, expr); |
7776 if (is_const) { | 7796 if (is_const) { |
7777 ASSERT(expr->IsLiteralNode()); | 7797 ASSERT(expr->IsLiteralNode()); |
7778 variable->SetConstValue(expr->AsLiteralNode()->literal()); | 7798 variable->SetConstValue(expr->AsLiteralNode()->literal()); |
7779 } | 7799 } |
7780 } else if (is_final || is_const) { | 7800 } else if (is_final || is_const) { |
7781 ReportError(ident_pos, | 7801 ReportError(ident_pos, |
7782 "missing initialization of 'final' or 'const' variable"); | 7802 "missing initialization of 'final' or 'const' variable"); |
7783 } else { | 7803 } else { |
7784 // Initialize variable with null. | 7804 // Initialize variable with null. |
7785 variable = new(Z) LocalVariable( | 7805 variable = new(Z) LocalVariable( |
7786 assign_pos, ident, type); | 7806 ident_pos, |
| 7807 assign_pos, |
| 7808 ident, |
| 7809 type); |
7787 AstNode* null_expr = new(Z) LiteralNode(ident_pos, Object::null_instance()); | 7810 AstNode* null_expr = new(Z) LiteralNode(ident_pos, Object::null_instance()); |
7788 initialization = new(Z) StoreLocalNode( | 7811 initialization = new(Z) StoreLocalNode( |
7789 ident_pos, variable, null_expr); | 7812 ident_pos, variable, null_expr); |
7790 } | 7813 } |
7791 | 7814 |
7792 ASSERT(current_block_ != NULL); | 7815 ASSERT(current_block_ != NULL); |
7793 const TokenPosition previous_pos = | 7816 const TokenPosition previous_pos = |
7794 current_block_->scope->PreviousReferencePos(ident); | 7817 current_block_->scope->PreviousReferencePos(ident); |
7795 if (previous_pos.IsReal()) { | 7818 if (previous_pos.IsReal()) { |
7796 ASSERT(!script_.IsNull()); | 7819 ASSERT(!script_.IsNull()); |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7913 | 7936 |
7914 AstNode* Parser::ParseFunctionStatement(bool is_literal) { | 7937 AstNode* Parser::ParseFunctionStatement(bool is_literal) { |
7915 TRACE_PARSER("ParseFunctionStatement"); | 7938 TRACE_PARSER("ParseFunctionStatement"); |
7916 AbstractType& result_type = AbstractType::Handle(Z); | 7939 AbstractType& result_type = AbstractType::Handle(Z); |
7917 const String* variable_name = NULL; | 7940 const String* variable_name = NULL; |
7918 const String* function_name = NULL; | 7941 const String* function_name = NULL; |
7919 | 7942 |
7920 result_type = Type::DynamicType(); | 7943 result_type = Type::DynamicType(); |
7921 | 7944 |
7922 const TokenPosition function_pos = TokenPos(); | 7945 const TokenPosition function_pos = TokenPos(); |
| 7946 TokenPosition function_name_pos = TokenPosition::kNoSource; |
7923 TokenPosition metadata_pos = TokenPosition::kNoSource; | 7947 TokenPosition metadata_pos = TokenPosition::kNoSource; |
7924 if (is_literal) { | 7948 if (is_literal) { |
7925 ASSERT(CurrentToken() == Token::kLPAREN || CurrentToken() == Token::kLT); | 7949 ASSERT(CurrentToken() == Token::kLPAREN || CurrentToken() == Token::kLT); |
7926 function_name = &Symbols::AnonymousClosure(); | 7950 function_name = &Symbols::AnonymousClosure(); |
7927 } else { | 7951 } else { |
7928 metadata_pos = SkipMetadata(); | 7952 metadata_pos = SkipMetadata(); |
7929 if (CurrentToken() == Token::kVOID) { | 7953 if (CurrentToken() == Token::kVOID) { |
7930 ConsumeToken(); | 7954 ConsumeToken(); |
7931 result_type = Type::VoidType(); | 7955 result_type = Type::VoidType(); |
7932 } else if (IsFunctionReturnType()) { | 7956 } else if (IsFunctionReturnType()) { |
7933 // It is too early to resolve the type here, since it can be a result type | 7957 // It is too early to resolve the type here, since it can be a result type |
7934 // referring to a not yet declared function type parameter. | 7958 // referring to a not yet declared function type parameter. |
7935 result_type = ParseType(ClassFinalizer::kDoNotResolve); | 7959 result_type = ParseType(ClassFinalizer::kDoNotResolve); |
7936 } | 7960 } |
7937 const TokenPosition name_pos = TokenPos(); | 7961 function_name_pos = TokenPos(); |
7938 variable_name = ExpectIdentifier("function name expected"); | 7962 variable_name = ExpectIdentifier("function name expected"); |
7939 function_name = variable_name; | 7963 function_name = variable_name; |
7940 | 7964 |
7941 // Check that the function name has not been referenced | 7965 // Check that the function name has not been referenced |
7942 // before this declaration. | 7966 // before this declaration. |
7943 ASSERT(current_block_ != NULL); | 7967 ASSERT(current_block_ != NULL); |
7944 const TokenPosition previous_pos = | 7968 const TokenPosition previous_pos = |
7945 current_block_->scope->PreviousReferencePos(*function_name); | 7969 current_block_->scope->PreviousReferencePos(*function_name); |
7946 if (previous_pos.IsReal()) { | 7970 if (previous_pos.IsReal()) { |
7947 ASSERT(!script_.IsNull()); | 7971 ASSERT(!script_.IsNull()); |
7948 intptr_t line_number; | 7972 intptr_t line_number; |
7949 script_.GetTokenLocation(previous_pos, &line_number, NULL); | 7973 script_.GetTokenLocation(previous_pos, &line_number, NULL); |
7950 ReportError(name_pos, | 7974 ReportError(function_name_pos, |
7951 "identifier '%s' previously used in line %" Pd "", | 7975 "identifier '%s' previously used in line %" Pd "", |
7952 function_name->ToCString(), | 7976 function_name->ToCString(), |
7953 line_number); | 7977 line_number); |
7954 } | 7978 } |
7955 } | 7979 } |
7956 | 7980 |
7957 // Check whether we have parsed this closure function before, in a previous | 7981 // Check whether we have parsed this closure function before, in a previous |
7958 // compilation. If so, reuse the function object, else create a new one | 7982 // compilation. If so, reuse the function object, else create a new one |
7959 // and register it in the current class. | 7983 // and register it in the current class. |
7960 // Note that we cannot share the same closure function between the closurized | 7984 // 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... |
8019 const Class& unknown_scope_class = Class::Handle(Z, | 8043 const Class& unknown_scope_class = Class::Handle(Z, |
8020 I->object_store()->closure_class()); | 8044 I->object_store()->closure_class()); |
8021 function_type = Type::New(unknown_scope_class, | 8045 function_type = Type::New(unknown_scope_class, |
8022 TypeArguments::Handle(Z), | 8046 TypeArguments::Handle(Z), |
8023 function_pos); | 8047 function_pos); |
8024 function_type.set_signature(function); | 8048 function_type.set_signature(function); |
8025 function_type.SetIsFinalized(); // No finalization needed. | 8049 function_type.SetIsFinalized(); // No finalization needed. |
8026 | 8050 |
8027 // Add the function variable to the scope before parsing the function in | 8051 // Add the function variable to the scope before parsing the function in |
8028 // order to allow self reference from inside the function. | 8052 // order to allow self reference from inside the function. |
8029 function_variable = new(Z) LocalVariable(function_pos, | 8053 function_variable = new(Z) LocalVariable(function_name_pos, |
| 8054 function_pos, |
8030 *variable_name, | 8055 *variable_name, |
8031 function_type); | 8056 function_type); |
8032 function_variable->set_is_final(); | 8057 function_variable->set_is_final(); |
8033 ASSERT(current_block_ != NULL); | 8058 ASSERT(current_block_ != NULL); |
8034 ASSERT(current_block_->scope != NULL); | 8059 ASSERT(current_block_->scope != NULL); |
8035 if (!current_block_->scope->AddVariable(function_variable)) { | 8060 if (!current_block_->scope->AddVariable(function_variable)) { |
8036 LocalVariable* existing_var = | 8061 LocalVariable* existing_var = |
8037 current_block_->scope->LookupVariable(function_variable->name(), | 8062 current_block_->scope->LookupVariable(function_variable->name(), |
8038 true); | 8063 true); |
8039 ASSERT(existing_var != NULL); | 8064 ASSERT(existing_var != NULL); |
(...skipping 791 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8831 // variable is set to dynamic. It will later be patched to match the | 8856 // variable is set to dynamic. It will later be patched to match the |
8832 // type of the case clause expressions. Therefore, we have to allocate | 8857 // type of the case clause expressions. Therefore, we have to allocate |
8833 // a new type representing dynamic and can't reuse the canonical | 8858 // a new type representing dynamic and can't reuse the canonical |
8834 // type object for dynamic. | 8859 // type object for dynamic. |
8835 const Type& temp_var_type = Type::ZoneHandle(Z, | 8860 const Type& temp_var_type = Type::ZoneHandle(Z, |
8836 Type::New(Class::Handle(Z, Object::dynamic_class()), | 8861 Type::New(Class::Handle(Z, Object::dynamic_class()), |
8837 TypeArguments::Handle(Z), | 8862 TypeArguments::Handle(Z), |
8838 expr_pos)); | 8863 expr_pos)); |
8839 temp_var_type.SetIsFinalized(); | 8864 temp_var_type.SetIsFinalized(); |
8840 LocalVariable* temp_variable = new(Z) LocalVariable( | 8865 LocalVariable* temp_variable = new(Z) LocalVariable( |
8841 expr_pos, Symbols::SwitchExpr(), temp_var_type); | 8866 expr_pos, expr_pos, Symbols::SwitchExpr(), temp_var_type); |
8842 current_block_->scope->AddVariable(temp_variable); | 8867 current_block_->scope->AddVariable(temp_variable); |
8843 AstNode* save_switch_expr = new(Z) StoreLocalNode( | 8868 AstNode* save_switch_expr = new(Z) StoreLocalNode( |
8844 expr_pos, temp_variable, switch_expr); | 8869 expr_pos, temp_variable, switch_expr); |
8845 current_block_->statements->Add(save_switch_expr); | 8870 current_block_->statements->Add(save_switch_expr); |
8846 | 8871 |
8847 // Parse case clauses | 8872 // Parse case clauses |
8848 bool default_seen = false; | 8873 bool default_seen = false; |
8849 GrowableArray<LiteralNode*> case_expr_values; | 8874 GrowableArray<LiteralNode*> case_expr_values; |
8850 while (true) { | 8875 while (true) { |
8851 // Check for statement label | 8876 // Check for statement label |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9121 ASSERT(!iterator_ctor.IsNull()); | 9146 ASSERT(!iterator_ctor.IsNull()); |
9122 ArgumentListNode* ctor_args = new (Z) ArgumentListNode(stream_expr_pos); | 9147 ArgumentListNode* ctor_args = new (Z) ArgumentListNode(stream_expr_pos); |
9123 ctor_args->Add(stream_expr); | 9148 ctor_args->Add(stream_expr); |
9124 ConstructorCallNode* ctor_call = | 9149 ConstructorCallNode* ctor_call = |
9125 new (Z) ConstructorCallNode(stream_expr_pos, | 9150 new (Z) ConstructorCallNode(stream_expr_pos, |
9126 TypeArguments::ZoneHandle(Z), | 9151 TypeArguments::ZoneHandle(Z), |
9127 iterator_ctor, | 9152 iterator_ctor, |
9128 ctor_args); | 9153 ctor_args); |
9129 const AbstractType& iterator_type = Object::dynamic_type(); | 9154 const AbstractType& iterator_type = Object::dynamic_type(); |
9130 LocalVariable* iterator_var = new(Z) LocalVariable( | 9155 LocalVariable* iterator_var = new(Z) LocalVariable( |
9131 stream_expr_pos, Symbols::ForInIter(), iterator_type); | 9156 stream_expr_pos, stream_expr_pos, Symbols::ForInIter(), iterator_type); |
9132 current_block_->scope->AddVariable(iterator_var); | 9157 current_block_->scope->AddVariable(iterator_var); |
9133 AstNode* iterator_init = | 9158 AstNode* iterator_init = |
9134 new(Z) StoreLocalNode(stream_expr_pos, iterator_var, ctor_call); | 9159 new(Z) StoreLocalNode(stream_expr_pos, iterator_var, ctor_call); |
9135 current_block_->statements->Add(iterator_init); | 9160 current_block_->statements->Add(iterator_init); |
9136 | 9161 |
9137 // We need to ensure that the stream is cancelled after the loop. | 9162 // We need to ensure that the stream is cancelled after the loop. |
9138 // Thus, wrap the loop in a try-finally that calls :for-in-iter.close() | 9163 // Thus, wrap the loop in a try-finally that calls :for-in-iter.close() |
9139 // in the finally clause. It is harmless to call close() if the stream | 9164 // in the finally clause. It is harmless to call close() if the stream |
9140 // is already cancelled (when moveNext() returns false). | 9165 // is already cancelled (when moveNext() returns false). |
9141 // Note: even though this is async code, we do not need to set up | 9166 // 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... |
9206 | 9231 |
9207 // Generate assignment of next iterator value to loop variable. | 9232 // Generate assignment of next iterator value to loop variable. |
9208 AstNode* loop_var_assignment = NULL; | 9233 AstNode* loop_var_assignment = NULL; |
9209 if (new_loop_var) { | 9234 if (new_loop_var) { |
9210 // The for loop variable is new for each iteration. | 9235 // The for loop variable is new for each iteration. |
9211 // Create a variable and add it to the loop body scope. | 9236 // Create a variable and add it to the loop body scope. |
9212 // Note that the variable token position needs to be inside the | 9237 // Note that the variable token position needs to be inside the |
9213 // loop block, so it gets put in the loop context level. | 9238 // loop block, so it gets put in the loop context level. |
9214 LocalVariable* loop_var = | 9239 LocalVariable* loop_var = |
9215 new(Z) LocalVariable(loop_var_assignment_pos, | 9240 new(Z) LocalVariable(loop_var_assignment_pos, |
| 9241 loop_var_assignment_pos, |
9216 *loop_var_name, | 9242 *loop_var_name, |
9217 loop_var_type);; | 9243 loop_var_type);; |
9218 if (loop_var_is_final) { | 9244 if (loop_var_is_final) { |
9219 loop_var->set_is_final(); | 9245 loop_var->set_is_final(); |
9220 } | 9246 } |
9221 current_block_->scope->AddVariable(loop_var); | 9247 current_block_->scope->AddVariable(loop_var); |
9222 loop_var_assignment = new(Z) StoreLocalNode( | 9248 loop_var_assignment = new(Z) StoreLocalNode( |
9223 loop_var_assignment_pos, loop_var, iterator_current); | 9249 loop_var_assignment_pos, loop_var, iterator_current); |
9224 } else { | 9250 } else { |
9225 AstNode* loop_var_primary = | 9251 AstNode* loop_var_primary = |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9381 loop_var_pos = TokenPos(); | 9407 loop_var_pos = TokenPos(); |
9382 loop_var_name = ExpectIdentifier("variable name expected"); | 9408 loop_var_name = ExpectIdentifier("variable name expected"); |
9383 } else { | 9409 } else { |
9384 // The case without a type is handled above, so require a type here. | 9410 // The case without a type is handled above, so require a type here. |
9385 // Delay creation of the local variable until we know its actual | 9411 // Delay creation of the local variable until we know its actual |
9386 // position, which is inside the loop body. | 9412 // position, which is inside the loop body. |
9387 new_loop_var = true; | 9413 new_loop_var = true; |
9388 loop_var_type = ParseConstFinalVarOrType( | 9414 loop_var_type = ParseConstFinalVarOrType( |
9389 I->type_checks() ? ClassFinalizer::kCanonicalize : | 9415 I->type_checks() ? ClassFinalizer::kCanonicalize : |
9390 ClassFinalizer::kIgnore); | 9416 ClassFinalizer::kIgnore); |
| 9417 loop_var_pos = TokenPos(); |
9391 loop_var_name = ExpectIdentifier("variable name expected"); | 9418 loop_var_name = ExpectIdentifier("variable name expected"); |
9392 } | 9419 } |
9393 ExpectToken(Token::kIN); | 9420 ExpectToken(Token::kIN); |
9394 | 9421 |
9395 // Ensure that the block token range contains the call to moveNext and it | 9422 // Ensure that the block token range contains the call to moveNext and it |
9396 // also starts the block at a different token position than the following | 9423 // also starts the block at a different token position than the following |
9397 // loop block. Both blocks can allocate contexts and if they have a matching | 9424 // loop block. Both blocks can allocate contexts and if they have a matching |
9398 // token position range, it can be an issue (cf. bug 26941). | 9425 // token position range, it can be an issue (cf. bug 26941). |
9399 OpenBlock(); // Implicit block around while loop. | 9426 OpenBlock(); // Implicit block around while loop. |
9400 | 9427 |
9401 const TokenPosition collection_pos = TokenPos(); | 9428 const TokenPosition collection_pos = TokenPos(); |
9402 AstNode* collection_expr = | 9429 AstNode* collection_expr = |
9403 ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL); | 9430 ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL); |
9404 ExpectToken(Token::kRPAREN); | 9431 ExpectToken(Token::kRPAREN); |
9405 | 9432 |
9406 // Generate implicit iterator variable and add to scope. | 9433 // Generate implicit iterator variable and add to scope. |
9407 // We could set the type of the implicit iterator variable to Iterator<T> | 9434 // We could set the type of the implicit iterator variable to Iterator<T> |
9408 // where T is the type of the for loop variable. However, the type error | 9435 // where T is the type of the for loop variable. However, the type error |
9409 // would refer to the compiler generated iterator and could confuse the user. | 9436 // would refer to the compiler generated iterator and could confuse the user. |
9410 // It is better to leave the iterator untyped and postpone the type error | 9437 // It is better to leave the iterator untyped and postpone the type error |
9411 // until the loop variable is assigned to. | 9438 // until the loop variable is assigned to. |
9412 const AbstractType& iterator_type = Object::dynamic_type(); | 9439 const AbstractType& iterator_type = Object::dynamic_type(); |
9413 LocalVariable* iterator_var = new(Z) LocalVariable( | 9440 LocalVariable* iterator_var = new(Z) LocalVariable( |
| 9441 collection_pos, |
9414 collection_pos, Symbols::ForInIter(), iterator_type); | 9442 collection_pos, Symbols::ForInIter(), iterator_type); |
9415 current_block_->scope->AddVariable(iterator_var); | 9443 current_block_->scope->AddVariable(iterator_var); |
9416 | 9444 |
9417 // Generate initialization of iterator variable. | 9445 // Generate initialization of iterator variable. |
9418 ArgumentListNode* no_args = new(Z) ArgumentListNode(collection_pos); | 9446 ArgumentListNode* no_args = new(Z) ArgumentListNode(collection_pos); |
9419 AstNode* get_iterator = new(Z) InstanceGetterNode( | 9447 AstNode* get_iterator = new(Z) InstanceGetterNode( |
9420 collection_pos, collection_expr, Symbols::Iterator()); | 9448 collection_pos, collection_expr, Symbols::Iterator()); |
9421 AstNode* iterator_init = | 9449 AstNode* iterator_init = |
9422 new(Z) StoreLocalNode(collection_pos, iterator_var, get_iterator); | 9450 new(Z) StoreLocalNode(collection_pos, iterator_var, get_iterator); |
9423 current_block_->statements->Add(iterator_init); | 9451 current_block_->statements->Add(iterator_init); |
(...skipping 17 matching lines...) Expand all Loading... |
9441 loop_var_assignment_pos, | 9469 loop_var_assignment_pos, |
9442 new(Z) LoadLocalNode(loop_var_assignment_pos, iterator_var), | 9470 new(Z) LoadLocalNode(loop_var_assignment_pos, iterator_var), |
9443 Symbols::Current()); | 9471 Symbols::Current()); |
9444 | 9472 |
9445 // Generate assignment of next iterator value to loop variable. | 9473 // Generate assignment of next iterator value to loop variable. |
9446 AstNode* loop_var_assignment = NULL; | 9474 AstNode* loop_var_assignment = NULL; |
9447 if (new_loop_var) { | 9475 if (new_loop_var) { |
9448 // The for loop variable is new for each iteration. | 9476 // The for loop variable is new for each iteration. |
9449 // Create a variable and add it to the loop body scope. | 9477 // Create a variable and add it to the loop body scope. |
9450 LocalVariable* loop_var = | 9478 LocalVariable* loop_var = |
9451 new(Z) LocalVariable(loop_var_assignment_pos, | 9479 new(Z) LocalVariable(loop_var_pos, |
| 9480 loop_var_assignment_pos, |
9452 *loop_var_name, | 9481 *loop_var_name, |
9453 loop_var_type);; | 9482 loop_var_type);; |
9454 if (loop_var_is_final) { | 9483 if (loop_var_is_final) { |
9455 loop_var->set_is_final(); | 9484 loop_var->set_is_final(); |
9456 } | 9485 } |
9457 current_block_->scope->AddVariable(loop_var); | 9486 current_block_->scope->AddVariable(loop_var); |
9458 loop_var_assignment = new(Z) StoreLocalNode( | 9487 loop_var_assignment = new(Z) StoreLocalNode( |
9459 loop_var_assignment_pos, loop_var, iterator_current); | 9488 loop_var_assignment_pos, loop_var, iterator_current); |
9460 } else { | 9489 } else { |
9461 AstNode* loop_var_primary = | 9490 AstNode* loop_var_primary = |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9608 } | 9637 } |
9609 | 9638 |
9610 | 9639 |
9611 // Populate local scope of the catch block with the catch parameters. | 9640 // Populate local scope of the catch block with the catch parameters. |
9612 void Parser::AddCatchParamsToScope(CatchParamDesc* exception_param, | 9641 void Parser::AddCatchParamsToScope(CatchParamDesc* exception_param, |
9613 CatchParamDesc* stack_trace_param, | 9642 CatchParamDesc* stack_trace_param, |
9614 LocalScope* scope) { | 9643 LocalScope* scope) { |
9615 if (exception_param->name != NULL) { | 9644 if (exception_param->name != NULL) { |
9616 LocalVariable* var = new(Z) LocalVariable( | 9645 LocalVariable* var = new(Z) LocalVariable( |
9617 exception_param->token_pos, | 9646 exception_param->token_pos, |
| 9647 exception_param->token_pos, |
9618 *exception_param->name, | 9648 *exception_param->name, |
9619 *exception_param->type); | 9649 *exception_param->type); |
9620 var->set_is_final(); | 9650 var->set_is_final(); |
9621 bool added_to_scope = scope->AddVariable(var); | 9651 bool added_to_scope = scope->AddVariable(var); |
9622 ASSERT(added_to_scope); | 9652 ASSERT(added_to_scope); |
9623 exception_param->var = var; | 9653 exception_param->var = var; |
9624 } | 9654 } |
9625 if (stack_trace_param->name != NULL) { | 9655 if (stack_trace_param->name != NULL) { |
9626 LocalVariable* var = new(Z) LocalVariable( | 9656 LocalVariable* var = new(Z) LocalVariable( |
9627 stack_trace_param->token_pos, | 9657 stack_trace_param->token_pos, |
| 9658 stack_trace_param->token_pos, |
9628 *stack_trace_param->name, | 9659 *stack_trace_param->name, |
9629 *stack_trace_param->type); | 9660 *stack_trace_param->type); |
9630 var->set_is_final(); | 9661 var->set_is_final(); |
9631 bool added_to_scope = scope->AddVariable(var); | 9662 bool added_to_scope = scope->AddVariable(var); |
9632 if (!added_to_scope) { | 9663 if (!added_to_scope) { |
9633 // The name of the exception param is reused for the stack trace param. | 9664 // The name of the exception param is reused for the stack trace param. |
9634 ReportError(stack_trace_param->token_pos, | 9665 ReportError(stack_trace_param->token_pos, |
9635 "name '%s' already exists in scope", | 9666 "name '%s' already exists in scope", |
9636 stack_trace_param->name->ToCString()); | 9667 stack_trace_param->name->ToCString()); |
9637 } | 9668 } |
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10027 | 10058 |
10028 | 10059 |
10029 void Parser::SetupSavedTryContext(LocalVariable* saved_try_context) { | 10060 void Parser::SetupSavedTryContext(LocalVariable* saved_try_context) { |
10030 const String& async_saved_try_ctx_name = String::ZoneHandle(Z, | 10061 const String& async_saved_try_ctx_name = String::ZoneHandle(Z, |
10031 Symbols::NewFormatted(T, | 10062 Symbols::NewFormatted(T, |
10032 "%s%d", | 10063 "%s%d", |
10033 Symbols::AsyncSavedTryCtxVarPrefix().ToCString(), | 10064 Symbols::AsyncSavedTryCtxVarPrefix().ToCString(), |
10034 last_used_try_index_ - 1)); | 10065 last_used_try_index_ - 1)); |
10035 LocalVariable* async_saved_try_ctx = new (Z) LocalVariable( | 10066 LocalVariable* async_saved_try_ctx = new (Z) LocalVariable( |
10036 TokenPosition::kNoSource, | 10067 TokenPosition::kNoSource, |
| 10068 TokenPosition::kNoSource, |
10037 async_saved_try_ctx_name, | 10069 async_saved_try_ctx_name, |
10038 Object::dynamic_type()); | 10070 Object::dynamic_type()); |
10039 ASSERT(async_temp_scope_ != NULL); | 10071 ASSERT(async_temp_scope_ != NULL); |
10040 async_temp_scope_->AddVariable(async_saved_try_ctx); | 10072 async_temp_scope_->AddVariable(async_saved_try_ctx); |
10041 ASSERT(saved_try_context != NULL); | 10073 ASSERT(saved_try_context != NULL); |
10042 current_block_->statements->Add(new(Z) StoreLocalNode( | 10074 current_block_->statements->Add(new(Z) StoreLocalNode( |
10043 TokenPosition::kNoSource, | 10075 TokenPosition::kNoSource, |
10044 async_saved_try_ctx, | 10076 async_saved_try_ctx, |
10045 new(Z) LoadLocalNode(TokenPosition::kNoSource, saved_try_context))); | 10077 new(Z) LoadLocalNode(TokenPosition::kNoSource, saved_try_context))); |
10046 } | 10078 } |
(...skipping 21 matching lines...) Expand all Loading... |
10068 LocalVariable** context_var, | 10100 LocalVariable** context_var, |
10069 LocalVariable** exception_var, | 10101 LocalVariable** exception_var, |
10070 LocalVariable** stack_trace_var, | 10102 LocalVariable** stack_trace_var, |
10071 LocalVariable** saved_exception_var, | 10103 LocalVariable** saved_exception_var, |
10072 LocalVariable** saved_stack_trace_var) { | 10104 LocalVariable** saved_stack_trace_var) { |
10073 // Consecutive try statements share the same set of variables. | 10105 // Consecutive try statements share the same set of variables. |
10074 *context_var = try_scope->LocalLookupVariable(Symbols::SavedTryContextVar()); | 10106 *context_var = try_scope->LocalLookupVariable(Symbols::SavedTryContextVar()); |
10075 if (*context_var == NULL) { | 10107 if (*context_var == NULL) { |
10076 *context_var = new(Z) LocalVariable( | 10108 *context_var = new(Z) LocalVariable( |
10077 TokenPos(), | 10109 TokenPos(), |
| 10110 TokenPos(), |
10078 Symbols::SavedTryContextVar(), | 10111 Symbols::SavedTryContextVar(), |
10079 Object::dynamic_type()); | 10112 Object::dynamic_type()); |
10080 try_scope->AddVariable(*context_var); | 10113 try_scope->AddVariable(*context_var); |
10081 } | 10114 } |
10082 *exception_var = try_scope->LocalLookupVariable(Symbols::ExceptionVar()); | 10115 *exception_var = try_scope->LocalLookupVariable(Symbols::ExceptionVar()); |
10083 if (*exception_var == NULL) { | 10116 if (*exception_var == NULL) { |
10084 *exception_var = new(Z) LocalVariable( | 10117 *exception_var = new(Z) LocalVariable( |
10085 TokenPos(), | 10118 TokenPos(), |
| 10119 TokenPos(), |
10086 Symbols::ExceptionVar(), | 10120 Symbols::ExceptionVar(), |
10087 Object::dynamic_type()); | 10121 Object::dynamic_type()); |
10088 try_scope->AddVariable(*exception_var); | 10122 try_scope->AddVariable(*exception_var); |
10089 } | 10123 } |
10090 *stack_trace_var = try_scope->LocalLookupVariable(Symbols::StackTraceVar()); | 10124 *stack_trace_var = try_scope->LocalLookupVariable(Symbols::StackTraceVar()); |
10091 if (*stack_trace_var == NULL) { | 10125 if (*stack_trace_var == NULL) { |
10092 *stack_trace_var = new(Z) LocalVariable( | 10126 *stack_trace_var = new(Z) LocalVariable( |
10093 TokenPos(), | 10127 TokenPos(), |
| 10128 TokenPos(), |
10094 Symbols::StackTraceVar(), | 10129 Symbols::StackTraceVar(), |
10095 Object::dynamic_type()); | 10130 Object::dynamic_type()); |
10096 try_scope->AddVariable(*stack_trace_var); | 10131 try_scope->AddVariable(*stack_trace_var); |
10097 } | 10132 } |
10098 if (is_async) { | 10133 if (is_async) { |
10099 *saved_exception_var = try_scope->LocalLookupVariable( | 10134 *saved_exception_var = try_scope->LocalLookupVariable( |
10100 Symbols::SavedExceptionVar()); | 10135 Symbols::SavedExceptionVar()); |
10101 if (*saved_exception_var == NULL) { | 10136 if (*saved_exception_var == NULL) { |
10102 *saved_exception_var = new(Z) LocalVariable( | 10137 *saved_exception_var = new(Z) LocalVariable( |
10103 TokenPos(), | 10138 TokenPos(), |
| 10139 TokenPos(), |
10104 Symbols::SavedExceptionVar(), | 10140 Symbols::SavedExceptionVar(), |
10105 Object::dynamic_type()); | 10141 Object::dynamic_type()); |
10106 try_scope->AddVariable(*saved_exception_var); | 10142 try_scope->AddVariable(*saved_exception_var); |
10107 } | 10143 } |
10108 *saved_stack_trace_var = try_scope->LocalLookupVariable( | 10144 *saved_stack_trace_var = try_scope->LocalLookupVariable( |
10109 Symbols::SavedStackTraceVar()); | 10145 Symbols::SavedStackTraceVar()); |
10110 if (*saved_stack_trace_var == NULL) { | 10146 if (*saved_stack_trace_var == NULL) { |
10111 *saved_stack_trace_var = new(Z) LocalVariable( | 10147 *saved_stack_trace_var = new(Z) LocalVariable( |
10112 TokenPos(), | 10148 TokenPos(), |
| 10149 TokenPos(), |
10113 Symbols::SavedStackTraceVar(), | 10150 Symbols::SavedStackTraceVar(), |
10114 Object::dynamic_type()); | 10151 Object::dynamic_type()); |
10115 try_scope->AddVariable(*saved_stack_trace_var); | 10152 try_scope->AddVariable(*saved_stack_trace_var); |
10116 } | 10153 } |
10117 } | 10154 } |
10118 } | 10155 } |
10119 | 10156 |
10120 | 10157 |
10121 AstNode* Parser::ParseTryStatement(String* label_name) { | 10158 AstNode* Parser::ParseTryStatement(String* label_name) { |
10122 TRACE_PARSER("ParseTryStatement"); | 10159 TRACE_PARSER("ParseTryStatement"); |
(...skipping 960 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11083 parsed_function()->EnsureExpressionTemp(); | 11120 parsed_function()->EnsureExpressionTemp(); |
11084 } | 11121 } |
11085 | 11122 |
11086 | 11123 |
11087 LocalVariable* Parser::CreateTempConstVariable(TokenPosition token_pos, | 11124 LocalVariable* Parser::CreateTempConstVariable(TokenPosition token_pos, |
11088 const char* s) { | 11125 const char* s) { |
11089 char name[64]; | 11126 char name[64]; |
11090 OS::SNPrint(name, 64, ":%s%" Pd "", s, token_pos.value()); | 11127 OS::SNPrint(name, 64, ":%s%" Pd "", s, token_pos.value()); |
11091 LocalVariable* temp = new(Z) LocalVariable( | 11128 LocalVariable* temp = new(Z) LocalVariable( |
11092 token_pos, | 11129 token_pos, |
| 11130 token_pos, |
11093 String::ZoneHandle(Z, Symbols::New(T, name)), | 11131 String::ZoneHandle(Z, Symbols::New(T, name)), |
11094 Object::dynamic_type()); | 11132 Object::dynamic_type()); |
11095 temp->set_is_final(); | 11133 temp->set_is_final(); |
11096 current_block_->scope->AddVariable(temp); | 11134 current_block_->scope->AddVariable(temp); |
11097 return temp; | 11135 return temp; |
11098 } | 11136 } |
11099 | 11137 |
11100 | 11138 |
11101 AstNode* Parser::OptimizeBinaryOpNode(TokenPosition op_pos, | 11139 AstNode* Parser::OptimizeBinaryOpNode(TokenPosition op_pos, |
11102 Token::Kind binary_op, | 11140 Token::Kind binary_op, |
(...skipping 4007 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15110 const ArgumentListNode& function_args, | 15148 const ArgumentListNode& function_args, |
15111 const LocalVariable* temp_for_last_arg, | 15149 const LocalVariable* temp_for_last_arg, |
15112 bool is_super_invocation) { | 15150 bool is_super_invocation) { |
15113 UNREACHABLE(); | 15151 UNREACHABLE(); |
15114 return NULL; | 15152 return NULL; |
15115 } | 15153 } |
15116 | 15154 |
15117 } // namespace dart | 15155 } // namespace dart |
15118 | 15156 |
15119 #endif // DART_PRECOMPILED_RUNTIME | 15157 #endif // DART_PRECOMPILED_RUNTIME |
OLD | NEW |