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

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

Issue 1409113006: - Some cleanup of dynamic_type usage. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/parser.h" 5 #include "vm/parser.h"
6 6
7 #include "lib/invocation_mirror.h" 7 #include "lib/invocation_mirror.h"
8 #include "platform/utils.h" 8 #include "platform/utils.h"
9 #include "vm/ast_transformer.h" 9 #include "vm/ast_transformer.h"
10 #include "vm/bootstrap.h" 10 #include "vm/bootstrap.h"
(...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 param.type = type; 551 param.type = type;
552 this->parameters->Add(param); 552 this->parameters->Add(param);
553 } 553 }
554 554
555 void AddReceiver(const AbstractType* receiver_type, intptr_t token_pos) { 555 void AddReceiver(const AbstractType* receiver_type, intptr_t token_pos) {
556 ASSERT(this->parameters->is_empty()); 556 ASSERT(this->parameters->is_empty());
557 AddFinalParameter(token_pos, &Symbols::This(), receiver_type); 557 AddFinalParameter(token_pos, &Symbols::This(), receiver_type);
558 } 558 }
559 559
560 void EraseParameterTypes() { 560 void EraseParameterTypes() {
561 const Type& dynamic_type = Type::ZoneHandle(Type::DynamicType());
562 const int num_parameters = parameters->length(); 561 const int num_parameters = parameters->length();
563 for (int i = 0; i < num_parameters; i++) { 562 for (int i = 0; i < num_parameters; i++) {
564 (*parameters)[i].type = &dynamic_type; 563 (*parameters)[i].type = &Object::dynamic_type();
565 } 564 }
566 } 565 }
567 566
568 // Make the parameter variables visible/invisible. 567 // Make the parameter variables visible/invisible.
569 // Field initializer parameters are always invisible. 568 // Field initializer parameters are always invisible.
570 void SetInvisible(bool invisible) { 569 void SetInvisible(bool invisible) {
571 const intptr_t num_params = parameters->length(); 570 const intptr_t num_params = parameters->length();
572 for (int i = 0; i < num_params; i++) { 571 for (int i = 0; i < num_params; i++) {
573 ParamDesc& param = (*parameters)[i]; 572 ParamDesc& param = (*parameters)[i];
574 ASSERT(param.var != NULL); 573 ASSERT(param.var != NULL);
(...skipping 4139 matching lines...) Expand 10 before | Expand all | Expand 10 after
4714 4713
4715 SkipMetadata(); 4714 SkipMetadata();
4716 ExpectToken(Token::kENUM); 4715 ExpectToken(Token::kENUM);
4717 4716
4718 const String& enum_name = String::Handle(Z, cls.PrettyName()); 4717 const String& enum_name = String::Handle(Z, cls.PrettyName());
4719 ClassDesc enum_members(Z, cls, enum_name, false, cls.token_pos()); 4718 ClassDesc enum_members(Z, cls, enum_name, false, cls.token_pos());
4720 4719
4721 // Add instance field 'final int index'. 4720 // Add instance field 'final int index'.
4722 Field& index_field = Field::ZoneHandle(Z); 4721 Field& index_field = Field::ZoneHandle(Z);
4723 const Type& int_type = Type::Handle(Z, Type::IntType()); 4722 const Type& int_type = Type::Handle(Z, Type::IntType());
4724 const Type& dynamic_type = Type::Handle(Type::DynamicType());
4725 index_field = Field::New(Symbols::Index(), 4723 index_field = Field::New(Symbols::Index(),
4726 false, // Not static. 4724 false, // Not static.
4727 true, // Field is final. 4725 true, // Field is final.
4728 false, // Not const. 4726 false, // Not const.
4729 true, // Is reflectable. 4727 true, // Is reflectable.
4730 cls, 4728 cls,
4731 cls.token_pos()); 4729 cls.token_pos());
4732 index_field.set_type(int_type); 4730 index_field.set_type(int_type);
4733 enum_members.AddField(index_field); 4731 enum_members.AddField(index_field);
4734 4732
4735 // Add implicit getter for index field. 4733 // Add implicit getter for index field.
4736 const String& getter_name = 4734 const String& getter_name =
4737 String::Handle(Z, Field::GetterSymbol(Symbols::Index())); 4735 String::Handle(Z, Field::GetterSymbol(Symbols::Index()));
4738 Function& getter = Function::Handle(Z); 4736 Function& getter = Function::Handle(Z);
4739 getter = Function::New(getter_name, 4737 getter = Function::New(getter_name,
4740 RawFunction::kImplicitGetter, 4738 RawFunction::kImplicitGetter,
4741 /* is_static = */ false, 4739 /* is_static = */ false,
4742 /* is_const = */ true, 4740 /* is_const = */ true,
4743 /* is_abstract = */ false, 4741 /* is_abstract = */ false,
4744 /* is_external = */ false, 4742 /* is_external = */ false,
4745 /* is_native = */ false, 4743 /* is_native = */ false,
4746 cls, 4744 cls,
4747 cls.token_pos()); 4745 cls.token_pos());
4748 getter.set_result_type(int_type); 4746 getter.set_result_type(int_type);
4749 getter.set_is_debuggable(false); 4747 getter.set_is_debuggable(false);
4750 ParamList params; 4748 ParamList params;
4751 params.AddReceiver(&dynamic_type, cls.token_pos()); 4749 params.AddReceiver(&Object::dynamic_type(), cls.token_pos());
4752 AddFormalParamsToFunction(&params, getter); 4750 AddFormalParamsToFunction(&params, getter);
4753 enum_members.AddFunction(getter); 4751 enum_members.AddFunction(getter);
4754 4752
4755 GrowableObjectArray& enum_names = GrowableObjectArray::Handle(Z, 4753 GrowableObjectArray& enum_names = GrowableObjectArray::Handle(Z,
4756 GrowableObjectArray::New(8, Heap::kOld)); 4754 GrowableObjectArray::New(8, Heap::kOld));
4757 const String& name_prefix = 4755 const String& name_prefix =
4758 String::Handle(String::Concat(enum_name, Symbols::Dot())); 4756 String::Handle(String::Concat(enum_name, Symbols::Dot()));
4759 4757
4760 ASSERT(IsIdentifier()); 4758 ASSERT(IsIdentifier());
4761 ASSERT(CurrentLiteral()->raw() == cls.Name()); 4759 ASSERT(CurrentLiteral()->raw() == cls.Name());
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
4794 declared_names.Add(enum_ident); 4792 declared_names.Add(enum_ident);
4795 4793
4796 // Create the static const field for the enumeration value. 4794 // Create the static const field for the enumeration value.
4797 enum_value = Field::New(*enum_ident, 4795 enum_value = Field::New(*enum_ident,
4798 /* is_static = */ true, 4796 /* is_static = */ true,
4799 /* is_final = */ true, 4797 /* is_final = */ true,
4800 /* is_const = */ true, 4798 /* is_const = */ true,
4801 /* is_reflectable = */ true, 4799 /* is_reflectable = */ true,
4802 cls, 4800 cls,
4803 cls.token_pos()); 4801 cls.token_pos());
4804 enum_value.set_type(dynamic_type); 4802 enum_value.set_type(Object::dynamic_type());
4805 enum_value.set_has_initializer(false); 4803 enum_value.set_has_initializer(false);
4806 enum_members.AddField(enum_value); 4804 enum_members.AddField(enum_value);
4807 // Initialize the field with the ordinal value. It will be patched 4805 // Initialize the field with the ordinal value. It will be patched
4808 // later with the enum constant instance. 4806 // later with the enum constant instance.
4809 const Smi& ordinal_value = Smi::Handle(Z, Smi::New(i)); 4807 const Smi& ordinal_value = Smi::Handle(Z, Smi::New(i));
4810 enum_value.SetStaticValue(ordinal_value, true); 4808 enum_value.SetStaticValue(ordinal_value, true);
4811 enum_value.RecordStore(ordinal_value); 4809 enum_value.RecordStore(ordinal_value);
4812 i++; 4810 i++;
4813 4811
4814 // For the user-visible name of the enumeration value, we need to 4812 // For the user-visible name of the enumeration value, we need to
(...skipping 1415 matching lines...) Expand 10 before | Expand all | Expand 10 after
6230 const intptr_t try_end_pos = innermost_function().end_token_pos(); 6228 const intptr_t try_end_pos = innermost_function().end_token_pos();
6231 6229
6232 // The try-block (closure body code) has been parsed. We are now 6230 // The try-block (closure body code) has been parsed. We are now
6233 // generating the code for the catch block. 6231 // generating the code for the catch block.
6234 LocalScope* try_scope = current_block_->scope; 6232 LocalScope* try_scope = current_block_->scope;
6235 try_stack_->enter_catch(); 6233 try_stack_->enter_catch();
6236 OpenBlock(); // Catch handler list. 6234 OpenBlock(); // Catch handler list.
6237 OpenBlock(); // Catch block. 6235 OpenBlock(); // Catch block.
6238 6236
6239 // Add the exception and stack trace parameters to the scope. 6237 // Add the exception and stack trace parameters to the scope.
6240 const AbstractType& dynamic_type =
6241 AbstractType::ZoneHandle(Z, Type::DynamicType());
6242 CatchParamDesc exception_param; 6238 CatchParamDesc exception_param;
6243 CatchParamDesc stack_trace_param; 6239 CatchParamDesc stack_trace_param;
6244 exception_param.token_pos = Scanner::kNoSourcePos; 6240 exception_param.token_pos = Scanner::kNoSourcePos;
6245 exception_param.type = &dynamic_type; 6241 exception_param.type = &Object::dynamic_type();
6246 exception_param.name = &Symbols::ExceptionParameter(); 6242 exception_param.name = &Symbols::ExceptionParameter();
6247 stack_trace_param.token_pos = Scanner::kNoSourcePos; 6243 stack_trace_param.token_pos = Scanner::kNoSourcePos;
6248 stack_trace_param.type = &dynamic_type; 6244 stack_trace_param.type = &Object::dynamic_type();
6249 stack_trace_param.name = &Symbols::StackTraceParameter(); 6245 stack_trace_param.name = &Symbols::StackTraceParameter();
6250 6246
6251 AddCatchParamsToScope( 6247 AddCatchParamsToScope(
6252 &exception_param, &stack_trace_param, current_block_->scope); 6248 &exception_param, &stack_trace_param, current_block_->scope);
6253 6249
6254 // Generate code to save the exception object and stack trace 6250 // Generate code to save the exception object and stack trace
6255 // in local variables. 6251 // in local variables.
6256 LocalVariable* context_var = try_scope->LocalLookupVariable( 6252 LocalVariable* context_var = try_scope->LocalLookupVariable(
6257 Symbols::SavedTryContextVar()); 6253 Symbols::SavedTryContextVar());
6258 ASSERT(context_var != NULL); 6254 ASSERT(context_var != NULL);
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
6360 node_index++; 6356 node_index++;
6361 } 6357 }
6362 } while (finally_clause == NULL); 6358 } while (finally_clause == NULL);
6363 6359
6364 if (try_stack_ != NULL) { 6360 if (try_stack_ != NULL) {
6365 try_stack_->exit_finally(); 6361 try_stack_->exit_finally();
6366 } 6362 }
6367 6363
6368 const GrowableObjectArray& handler_types = 6364 const GrowableObjectArray& handler_types =
6369 GrowableObjectArray::Handle(Z, GrowableObjectArray::New(Heap::kOld)); 6365 GrowableObjectArray::Handle(Z, GrowableObjectArray::New(Heap::kOld));
6370 handler_types.Add(dynamic_type); // Catch block handles all exceptions. 6366 // Catch block handles all exceptions.
6367 handler_types.Add(Object::dynamic_type());
6371 6368
6372 CatchClauseNode* catch_clause = new(Z) CatchClauseNode( 6369 CatchClauseNode* catch_clause = new(Z) CatchClauseNode(
6373 Scanner::kNoSourcePos, 6370 Scanner::kNoSourcePos,
6374 catch_handler_list, 6371 catch_handler_list,
6375 Array::ZoneHandle(Z, Array::MakeArray(handler_types)), 6372 Array::ZoneHandle(Z, Array::MakeArray(handler_types)),
6376 context_var, 6373 context_var,
6377 exception_var, 6374 exception_var,
6378 stack_trace_var, 6375 stack_trace_var,
6379 saved_exception_var, 6376 saved_exception_var,
6380 saved_stack_trace_var, 6377 saved_stack_trace_var,
(...skipping 18 matching lines...) Expand all
6399 // This is the outermost try-catch of the function. 6396 // This is the outermost try-catch of the function.
6400 ASSERT(try_stack_ != NULL); 6397 ASSERT(try_stack_ != NULL);
6401 ASSERT(try_stack_->outer_try() == NULL); 6398 ASSERT(try_stack_->outer_try() == NULL);
6402 ASSERT(innermost_function().IsAsyncClosure()); 6399 ASSERT(innermost_function().IsAsyncClosure());
6403 LocalScope* try_scope = current_block_->scope; 6400 LocalScope* try_scope = current_block_->scope;
6404 6401
6405 try_stack_->enter_catch(); 6402 try_stack_->enter_catch();
6406 6403
6407 OpenBlock(); // Catch handler list. 6404 OpenBlock(); // Catch handler list.
6408 OpenBlock(); // Catch block. 6405 OpenBlock(); // Catch block.
6409 const AbstractType& dynamic_type =
6410 AbstractType::ZoneHandle(Z, Type::DynamicType());
6411 CatchParamDesc exception_param; 6406 CatchParamDesc exception_param;
6412 CatchParamDesc stack_trace_param; 6407 CatchParamDesc stack_trace_param;
6413 exception_param.token_pos = Scanner::kNoSourcePos; 6408 exception_param.token_pos = Scanner::kNoSourcePos;
6414 exception_param.type = &dynamic_type; 6409 exception_param.type = &Object::dynamic_type();
6415 exception_param.name = &Symbols::ExceptionParameter(); 6410 exception_param.name = &Symbols::ExceptionParameter();
6416 stack_trace_param.token_pos = Scanner::kNoSourcePos; 6411 stack_trace_param.token_pos = Scanner::kNoSourcePos;
6417 stack_trace_param.type = &dynamic_type; 6412 stack_trace_param.type = &Object::dynamic_type();
6418 stack_trace_param.name = &Symbols::StackTraceParameter(); 6413 stack_trace_param.name = &Symbols::StackTraceParameter();
6419 6414
6420 AddCatchParamsToScope( 6415 AddCatchParamsToScope(
6421 &exception_param, &stack_trace_param, current_block_->scope); 6416 &exception_param, &stack_trace_param, current_block_->scope);
6422 6417
6423 LocalVariable* context_var = try_scope->LocalLookupVariable( 6418 LocalVariable* context_var = try_scope->LocalLookupVariable(
6424 Symbols::SavedTryContextVar()); 6419 Symbols::SavedTryContextVar());
6425 ASSERT(context_var != NULL); 6420 ASSERT(context_var != NULL);
6426 6421
6427 LocalVariable* exception_var = try_scope->LocalLookupVariable( 6422 LocalVariable* exception_var = try_scope->LocalLookupVariable(
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
6537 PushTry(current_block_); 6532 PushTry(current_block_);
6538 6533
6539 SetupSavedTryContext(context_var); 6534 SetupSavedTryContext(context_var);
6540 } 6535 }
6541 6536
6542 6537
6543 void Parser::AddSyncGenClosureParameters(ParamList* params) { 6538 void Parser::AddSyncGenClosureParameters(ParamList* params) {
6544 // Create the parameter list for the body closure of a sync generator: 6539 // Create the parameter list for the body closure of a sync generator:
6545 // 1) Implicit closure parameter; 6540 // 1) Implicit closure parameter;
6546 // 2) Iterator 6541 // 2) Iterator
6547 const Type& dynamic_type = Type::ZoneHandle(Z, Type::DynamicType());
6548 // Add implicit closure parameter if not already present. 6542 // Add implicit closure parameter if not already present.
6549 if (params->parameters->length() == 0) { 6543 if (params->parameters->length() == 0) {
6550 params->AddFinalParameter(0, &Symbols::ClosureParameter(), &dynamic_type); 6544 params->AddFinalParameter(
6545 0, &Symbols::ClosureParameter(), &Object::dynamic_type());
6551 } 6546 }
6552 ParamDesc iterator_param; 6547 ParamDesc iterator_param;
6553 iterator_param.name = &Symbols::IteratorParameter(); 6548 iterator_param.name = &Symbols::IteratorParameter();
6554 iterator_param.type = &dynamic_type; 6549 iterator_param.type = &Object::dynamic_type();
6555 params->parameters->Add(iterator_param); 6550 params->parameters->Add(iterator_param);
6556 params->num_fixed_parameters++; 6551 params->num_fixed_parameters++;
6557 } 6552 }
6558 6553
6559 6554
6560 void Parser::AddAsyncGenClosureParameters(ParamList* params) { 6555 void Parser::AddAsyncGenClosureParameters(ParamList* params) {
6561 // Create the parameter list for the body closure of an async generator. 6556 // Create the parameter list for the body closure of an async generator.
6562 // The closure has the same parameters as an asynchronous non-generator. 6557 // The closure has the same parameters as an asynchronous non-generator.
6563 AddAsyncClosureParameters(params); 6558 AddAsyncClosureParameters(params);
6564 } 6559 }
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
6672 current_block_->statements->Add(return_node); 6667 current_block_->statements->Add(return_node);
6673 return CloseBlock(); 6668 return CloseBlock();
6674 } 6669 }
6675 6670
6676 6671
6677 void Parser::AddAsyncClosureParameters(ParamList* params) { 6672 void Parser::AddAsyncClosureParameters(ParamList* params) {
6678 // Async closures have three optional parameters: 6673 // Async closures have three optional parameters:
6679 // * A continuation result. 6674 // * A continuation result.
6680 // * A continuation error. 6675 // * A continuation error.
6681 // * A continuation stack trace. 6676 // * A continuation stack trace.
6682 const Type& dynamic_type = Type::ZoneHandle(Z, Type::DynamicType());
6683 ASSERT(params->parameters->length() <= 1); 6677 ASSERT(params->parameters->length() <= 1);
6684 // Add implicit closure parameter if not yet present. 6678 // Add implicit closure parameter if not yet present.
6685 if (params->parameters->length() == 0) { 6679 if (params->parameters->length() == 0) {
6686 params->AddFinalParameter(0, &Symbols::ClosureParameter(), &dynamic_type); 6680 params->AddFinalParameter(
6681 0, &Symbols::ClosureParameter(), &Object::dynamic_type());
6687 } 6682 }
6688 ParamDesc result_param; 6683 ParamDesc result_param;
6689 result_param.name = &Symbols::AsyncOperationParam(); 6684 result_param.name = &Symbols::AsyncOperationParam();
6690 result_param.default_value = &Object::null_instance(); 6685 result_param.default_value = &Object::null_instance();
6691 result_param.type = &dynamic_type; 6686 result_param.type = &Object::dynamic_type();
6692 params->parameters->Add(result_param); 6687 params->parameters->Add(result_param);
6693 ParamDesc error_param; 6688 ParamDesc error_param;
6694 error_param.name = &Symbols::AsyncOperationErrorParam(); 6689 error_param.name = &Symbols::AsyncOperationErrorParam();
6695 error_param.default_value = &Object::null_instance(); 6690 error_param.default_value = &Object::null_instance();
6696 error_param.type = &dynamic_type; 6691 error_param.type = &Object::dynamic_type();
6697 params->parameters->Add(error_param); 6692 params->parameters->Add(error_param);
6698 ParamDesc stack_trace_param; 6693 ParamDesc stack_trace_param;
6699 stack_trace_param.name = &Symbols::AsyncOperationStackTraceParam(); 6694 stack_trace_param.name = &Symbols::AsyncOperationStackTraceParam();
6700 stack_trace_param.default_value = &Object::null_instance(); 6695 stack_trace_param.default_value = &Object::null_instance();
6701 stack_trace_param.type = &dynamic_type; 6696 stack_trace_param.type = &Object::dynamic_type();
6702 params->parameters->Add(stack_trace_param); 6697 params->parameters->Add(stack_trace_param);
6703 params->has_optional_positional_parameters = true; 6698 params->has_optional_positional_parameters = true;
6704 params->num_optional_parameters += 3; 6699 params->num_optional_parameters += 3;
6705 } 6700 }
6706 6701
6707 6702
6708 RawFunction* Parser::OpenAsyncFunction(intptr_t async_func_pos) { 6703 RawFunction* Parser::OpenAsyncFunction(intptr_t async_func_pos) {
6709 TRACE_PARSER("OpenAsyncFunction"); 6704 TRACE_PARSER("OpenAsyncFunction");
6710 AddContinuationVariables(); 6705 AddContinuationVariables();
6711 AddAsyncClosureVariables(); 6706 AddAsyncClosureVariables();
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
6765 AddFormalParamsToScope(&closure_params, current_block_->scope); 6760 AddFormalParamsToScope(&closure_params, current_block_->scope);
6766 async_temp_scope_ = current_block_->scope; 6761 async_temp_scope_ = current_block_->scope;
6767 return closure.raw(); 6762 return closure.raw();
6768 } 6763 }
6769 6764
6770 6765
6771 void Parser::AddContinuationVariables() { 6766 void Parser::AddContinuationVariables() {
6772 // Add to current block's scope: 6767 // Add to current block's scope:
6773 // var :await_jump_var; 6768 // var :await_jump_var;
6774 // var :await_ctx_var; 6769 // var :await_ctx_var;
6775 const Type& dynamic_type = Type::ZoneHandle(Z, Type::DynamicType());
6776 LocalVariable* await_jump_var = new (Z) LocalVariable( 6770 LocalVariable* await_jump_var = new (Z) LocalVariable(
6777 Scanner::kNoSourcePos, Symbols::AwaitJumpVar(), dynamic_type); 6771 Scanner::kNoSourcePos, Symbols::AwaitJumpVar(), Object::dynamic_type());
6778 current_block_->scope->AddVariable(await_jump_var); 6772 current_block_->scope->AddVariable(await_jump_var);
6779 LocalVariable* await_ctx_var = new (Z) LocalVariable( 6773 LocalVariable* await_ctx_var = new (Z) LocalVariable(
6780 Scanner::kNoSourcePos, Symbols::AwaitContextVar(), dynamic_type); 6774 Scanner::kNoSourcePos,
6775 Symbols::AwaitContextVar(),
6776 Object::dynamic_type());
6781 current_block_->scope->AddVariable(await_ctx_var); 6777 current_block_->scope->AddVariable(await_ctx_var);
6782 } 6778 }
6783 6779
6784 6780
6785 void Parser::AddAsyncClosureVariables() { 6781 void Parser::AddAsyncClosureVariables() {
6786 // Add to current block's scope: 6782 // Add to current block's scope:
6787 // var :async_op; 6783 // var :async_op;
6788 // var :async_then_callback; 6784 // var :async_then_callback;
6789 // var :async_catch_error_callback; 6785 // var :async_catch_error_callback;
6790 // var :async_completer; 6786 // var :async_completer;
6791 const Type& dynamic_type = Type::ZoneHandle(Z, Type::DynamicType());
6792 LocalVariable* async_op_var = new(Z) LocalVariable( 6787 LocalVariable* async_op_var = new(Z) LocalVariable(
6793 Scanner::kNoSourcePos, Symbols::AsyncOperation(), dynamic_type); 6788 Scanner::kNoSourcePos, Symbols::AsyncOperation(), Object::dynamic_type());
6794 current_block_->scope->AddVariable(async_op_var); 6789 current_block_->scope->AddVariable(async_op_var);
6795 LocalVariable* async_then_callback_var = new(Z) LocalVariable( 6790 LocalVariable* async_then_callback_var = new(Z) LocalVariable(
6796 Scanner::kNoSourcePos, Symbols::AsyncThenCallback(), dynamic_type); 6791 Scanner::kNoSourcePos,
6792 Symbols::AsyncThenCallback(),
6793 Object::dynamic_type());
6797 current_block_->scope->AddVariable(async_then_callback_var); 6794 current_block_->scope->AddVariable(async_then_callback_var);
6798 LocalVariable* async_catch_error_callback_var = new(Z) LocalVariable( 6795 LocalVariable* async_catch_error_callback_var = new(Z) LocalVariable(
6799 Scanner::kNoSourcePos, Symbols::AsyncCatchErrorCallback(), dynamic_type); 6796 Scanner::kNoSourcePos,
6797 Symbols::AsyncCatchErrorCallback(),
6798 Object::dynamic_type());
6800 current_block_->scope->AddVariable(async_catch_error_callback_var); 6799 current_block_->scope->AddVariable(async_catch_error_callback_var);
6801 LocalVariable* async_completer = new(Z) LocalVariable( 6800 LocalVariable* async_completer = new(Z) LocalVariable(
6802 Scanner::kNoSourcePos, Symbols::AsyncCompleter(), dynamic_type); 6801 Scanner::kNoSourcePos,
6802 Symbols::AsyncCompleter(),
6803 Object::dynamic_type());
6803 current_block_->scope->AddVariable(async_completer); 6804 current_block_->scope->AddVariable(async_completer);
6804 } 6805 }
6805 6806
6806 6807
6807 void Parser::AddAsyncGeneratorVariables() { 6808 void Parser::AddAsyncGeneratorVariables() {
6808 // Add to current block's scope: 6809 // Add to current block's scope:
6809 // var :controller; 6810 // var :controller;
6810 // The :controller variable is used by the async generator closure to 6811 // The :controller variable is used by the async generator closure to
6811 // store the StreamController object to which the yielded expressions 6812 // store the StreamController object to which the yielded expressions
6812 // are added. 6813 // are added.
6813 // var :async_op; 6814 // var :async_op;
6814 // var :async_then_callback; 6815 // var :async_then_callback;
6815 // var :async_catch_error_callback; 6816 // var :async_catch_error_callback;
6816 // These variables are used to store the async generator closure containing 6817 // These variables are used to store the async generator closure containing
6817 // the body of the async* function. They are used by the await operator. 6818 // the body of the async* function. They are used by the await operator.
6818 const Type& dynamic_type = Type::ZoneHandle(Z, Type::DynamicType());
6819 LocalVariable* controller_var = new(Z) LocalVariable( 6819 LocalVariable* controller_var = new(Z) LocalVariable(
6820 Scanner::kNoSourcePos, Symbols::Controller(), dynamic_type); 6820 Scanner::kNoSourcePos, Symbols::Controller(), Object::dynamic_type());
6821 current_block_->scope->AddVariable(controller_var); 6821 current_block_->scope->AddVariable(controller_var);
6822 LocalVariable* async_op_var = new(Z) LocalVariable( 6822 LocalVariable* async_op_var = new(Z) LocalVariable(
6823 Scanner::kNoSourcePos, Symbols::AsyncOperation(), dynamic_type); 6823 Scanner::kNoSourcePos, Symbols::AsyncOperation(), Object::dynamic_type());
6824 current_block_->scope->AddVariable(async_op_var); 6824 current_block_->scope->AddVariable(async_op_var);
6825 LocalVariable* async_then_callback_var = new(Z) LocalVariable( 6825 LocalVariable* async_then_callback_var = new(Z) LocalVariable(
6826 Scanner::kNoSourcePos, Symbols::AsyncThenCallback(), dynamic_type); 6826 Scanner::kNoSourcePos,
6827 Symbols::AsyncThenCallback(),
6828 Object::dynamic_type());
6827 current_block_->scope->AddVariable(async_then_callback_var); 6829 current_block_->scope->AddVariable(async_then_callback_var);
6828 LocalVariable* async_catch_error_callback_var = new(Z) LocalVariable( 6830 LocalVariable* async_catch_error_callback_var = new(Z) LocalVariable(
6829 Scanner::kNoSourcePos, Symbols::AsyncCatchErrorCallback(), dynamic_type); 6831 Scanner::kNoSourcePos,
6832 Symbols::AsyncCatchErrorCallback(),
6833 Object::dynamic_type());
6830 current_block_->scope->AddVariable(async_catch_error_callback_var); 6834 current_block_->scope->AddVariable(async_catch_error_callback_var);
6831 } 6835 }
6832 6836
6833 6837
6834 RawFunction* Parser::OpenAsyncGeneratorFunction(intptr_t async_func_pos) { 6838 RawFunction* Parser::OpenAsyncGeneratorFunction(intptr_t async_func_pos) {
6835 TRACE_PARSER("OpenAsyncGeneratorFunction"); 6839 TRACE_PARSER("OpenAsyncGeneratorFunction");
6836 AddContinuationVariables(); 6840 AddContinuationVariables();
6837 AddAsyncGeneratorVariables(); 6841 AddAsyncGeneratorVariables();
6838 6842
6839 Function& closure = Function::Handle(Z); 6843 Function& closure = Function::Handle(Z);
(...skipping 2014 matching lines...) Expand 10 before | Expand all | Expand 10 after
8854 } 8858 }
8855 } while (finally_clause == NULL); 8859 } while (finally_clause == NULL);
8856 8860
8857 if (try_stack_ != NULL) { 8861 if (try_stack_ != NULL) {
8858 try_stack_->exit_finally(); 8862 try_stack_->exit_finally();
8859 } 8863 }
8860 8864
8861 // Create the try-statement and add to the current sequence, which is 8865 // Create the try-statement and add to the current sequence, which is
8862 // the block around the loop statement. 8866 // the block around the loop statement.
8863 8867
8864 const Type& dynamic_type = Type::ZoneHandle(Z, Type::DynamicType());
8865 const Array& handler_types = Array::ZoneHandle(Z, Array::New(1, Heap::kOld)); 8868 const Array& handler_types = Array::ZoneHandle(Z, Array::New(1, Heap::kOld));
8866 handler_types.SetAt(0, dynamic_type); // Catch block handles all exceptions. 8869 // Catch block handles all exceptions.
8870 handler_types.SetAt(0, Object::dynamic_type());
8867 8871
8868 CatchClauseNode* catch_clause = new(Z) CatchClauseNode(await_for_pos, 8872 CatchClauseNode* catch_clause = new(Z) CatchClauseNode(await_for_pos,
8869 catch_block, 8873 catch_block,
8870 handler_types, 8874 handler_types,
8871 context_var, 8875 context_var,
8872 exception_var, 8876 exception_var,
8873 stack_trace_var, 8877 stack_trace_var,
8874 exception_var, 8878 exception_var,
8875 stack_trace_var, 8879 stack_trace_var,
8876 AllocateTryIndex(), 8880 AllocateTryIndex(),
(...skipping 700 matching lines...) Expand 10 before | Expand all | Expand 10 after
9577 // In case of async code, we create two additional variables: 9581 // In case of async code, we create two additional variables:
9578 // ':saved_exception_var' - Used to capture the exception object above. 9582 // ':saved_exception_var' - Used to capture the exception object above.
9579 // ':saved_stack_trace_var' - Used to capture the stack trace object above. 9583 // ':saved_stack_trace_var' - Used to capture the stack trace object above.
9580 void Parser::SetupExceptionVariables(LocalScope* try_scope, 9584 void Parser::SetupExceptionVariables(LocalScope* try_scope,
9581 bool is_async, 9585 bool is_async,
9582 LocalVariable** context_var, 9586 LocalVariable** context_var,
9583 LocalVariable** exception_var, 9587 LocalVariable** exception_var,
9584 LocalVariable** stack_trace_var, 9588 LocalVariable** stack_trace_var,
9585 LocalVariable** saved_exception_var, 9589 LocalVariable** saved_exception_var,
9586 LocalVariable** saved_stack_trace_var) { 9590 LocalVariable** saved_stack_trace_var) {
9587 const Type& dynamic_type = Type::ZoneHandle(Z, Type::DynamicType());
9588 // Consecutive try statements share the same set of variables. 9591 // Consecutive try statements share the same set of variables.
9589 *context_var = try_scope->LocalLookupVariable(Symbols::SavedTryContextVar()); 9592 *context_var = try_scope->LocalLookupVariable(Symbols::SavedTryContextVar());
9590 if (*context_var == NULL) { 9593 if (*context_var == NULL) {
9591 *context_var = new(Z) LocalVariable( 9594 *context_var = new(Z) LocalVariable(
9592 TokenPos(), 9595 TokenPos(),
9593 Symbols::SavedTryContextVar(), 9596 Symbols::SavedTryContextVar(),
9594 dynamic_type); 9597 Object::dynamic_type());
9595 try_scope->AddVariable(*context_var); 9598 try_scope->AddVariable(*context_var);
9596 } 9599 }
9597 *exception_var = try_scope->LocalLookupVariable(Symbols::ExceptionVar()); 9600 *exception_var = try_scope->LocalLookupVariable(Symbols::ExceptionVar());
9598 if (*exception_var == NULL) { 9601 if (*exception_var == NULL) {
9599 *exception_var = new(Z) LocalVariable( 9602 *exception_var = new(Z) LocalVariable(
9600 TokenPos(), 9603 TokenPos(),
9601 Symbols::ExceptionVar(), 9604 Symbols::ExceptionVar(),
9602 dynamic_type); 9605 Object::dynamic_type());
9603 try_scope->AddVariable(*exception_var); 9606 try_scope->AddVariable(*exception_var);
9604 } 9607 }
9605 *stack_trace_var = try_scope->LocalLookupVariable(Symbols::StackTraceVar()); 9608 *stack_trace_var = try_scope->LocalLookupVariable(Symbols::StackTraceVar());
9606 if (*stack_trace_var == NULL) { 9609 if (*stack_trace_var == NULL) {
9607 *stack_trace_var = new(Z) LocalVariable( 9610 *stack_trace_var = new(Z) LocalVariable(
9608 TokenPos(), 9611 TokenPos(),
9609 Symbols::StackTraceVar(), 9612 Symbols::StackTraceVar(),
9610 dynamic_type); 9613 Object::dynamic_type());
9611 try_scope->AddVariable(*stack_trace_var); 9614 try_scope->AddVariable(*stack_trace_var);
9612 } 9615 }
9613 if (is_async) { 9616 if (is_async) {
9614 *saved_exception_var = try_scope->LocalLookupVariable( 9617 *saved_exception_var = try_scope->LocalLookupVariable(
9615 Symbols::SavedExceptionVar()); 9618 Symbols::SavedExceptionVar());
9616 if (*saved_exception_var == NULL) { 9619 if (*saved_exception_var == NULL) {
9617 *saved_exception_var = new(Z) LocalVariable( 9620 *saved_exception_var = new(Z) LocalVariable(
9618 TokenPos(), 9621 TokenPos(),
9619 Symbols::SavedExceptionVar(), 9622 Symbols::SavedExceptionVar(),
9620 dynamic_type); 9623 Object::dynamic_type());
9621 try_scope->AddVariable(*saved_exception_var); 9624 try_scope->AddVariable(*saved_exception_var);
9622 } 9625 }
9623 *saved_stack_trace_var = try_scope->LocalLookupVariable( 9626 *saved_stack_trace_var = try_scope->LocalLookupVariable(
9624 Symbols::SavedStackTraceVar()); 9627 Symbols::SavedStackTraceVar());
9625 if (*saved_stack_trace_var == NULL) { 9628 if (*saved_stack_trace_var == NULL) {
9626 *saved_stack_trace_var = new(Z) LocalVariable( 9629 *saved_stack_trace_var = new(Z) LocalVariable(
9627 TokenPos(), 9630 TokenPos(),
9628 Symbols::SavedStackTraceVar(), 9631 Symbols::SavedStackTraceVar(),
9629 dynamic_type); 9632 Object::dynamic_type());
9630 try_scope->AddVariable(*saved_stack_trace_var); 9633 try_scope->AddVariable(*saved_stack_trace_var);
9631 } 9634 }
9632 } 9635 }
9633 } 9636 }
9634 9637
9635 9638
9636 AstNode* Parser::ParseTryStatement(String* label_name) { 9639 AstNode* Parser::ParseTryStatement(String* label_name) {
9637 TRACE_PARSER("ParseTryStatement"); 9640 TRACE_PARSER("ParseTryStatement");
9638 9641
9639 const intptr_t try_pos = TokenPos(); 9642 const intptr_t try_pos = TokenPos();
(...skipping 4663 matching lines...) Expand 10 before | Expand all | Expand 10 after
14303 void Parser::SkipQualIdent() { 14306 void Parser::SkipQualIdent() {
14304 ASSERT(IsIdentifier()); 14307 ASSERT(IsIdentifier());
14305 ConsumeToken(); 14308 ConsumeToken();
14306 if (CurrentToken() == Token::kPERIOD) { 14309 if (CurrentToken() == Token::kPERIOD) {
14307 ConsumeToken(); // Consume the kPERIOD token. 14310 ConsumeToken(); // Consume the kPERIOD token.
14308 ExpectIdentifier("identifier expected after '.'"); 14311 ExpectIdentifier("identifier expected after '.'");
14309 } 14312 }
14310 } 14313 }
14311 14314
14312 } // namespace dart 14315 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.cc ('k') | runtime/vm/scopes.h » ('j') | runtime/vm/scopes.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698