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

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

Issue 2736733005: Manage and capture class and function instantiators in the parser. (Closed)
Patch Set: work in progress Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/parser.h ('k') | runtime/vm/unit_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/parser.h" 5 #include "vm/parser.h"
6 #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 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 DEFINE_FLAG(bool, 53 DEFINE_FLAG(bool,
54 conditional_directives, 54 conditional_directives,
55 true, 55 true,
56 "Enable conditional directives"); 56 "Enable conditional directives");
57 DEFINE_FLAG(bool, 57 DEFINE_FLAG(bool,
58 generic_method_syntax, 58 generic_method_syntax,
59 true, 59 true,
60 "Enable generic function syntax."); 60 "Enable generic function syntax.");
61 DEFINE_FLAG(bool, 61 DEFINE_FLAG(bool,
62 generic_method_semantics, 62 generic_method_semantics,
63 true, 63 false,
64 "Enable generic function semantics (not yet supported)."); 64 "Enable generic function semantics (not yet supported).");
65 DEFINE_FLAG(bool, 65 DEFINE_FLAG(bool,
66 initializing_formal_access, 66 initializing_formal_access,
67 true, 67 true,
68 "Make initializing formal parameters visible in initializer list."); 68 "Make initializing formal parameters visible in initializer list.");
69 DEFINE_FLAG(bool, 69 DEFINE_FLAG(bool,
70 warn_super, 70 warn_super,
71 false, 71 false,
72 "Warning if super initializer not last in initializer list."); 72 "Warning if super initializer not last in initializer list.");
73 DEFINE_FLAG( 73 DEFINE_FLAG(
(...skipping 1082 matching lines...) Expand 10 before | Expand all | Expand 10 after
1156 if (parsed_function->has_expression_temp_var()) { 1156 if (parsed_function->has_expression_temp_var()) {
1157 node_sequence->scope()->AddVariable(parsed_function->expression_temp_var()); 1157 node_sequence->scope()->AddVariable(parsed_function->expression_temp_var());
1158 } 1158 }
1159 node_sequence->scope()->AddVariable(parsed_function->current_context_var()); 1159 node_sequence->scope()->AddVariable(parsed_function->current_context_var());
1160 if (parsed_function->has_finally_return_temp_var()) { 1160 if (parsed_function->has_finally_return_temp_var()) {
1161 node_sequence->scope()->AddVariable( 1161 node_sequence->scope()->AddVariable(
1162 parsed_function->finally_return_temp_var()); 1162 parsed_function->finally_return_temp_var());
1163 } 1163 }
1164 parsed_function->SetNodeSequence(node_sequence); 1164 parsed_function->SetNodeSequence(node_sequence);
1165 1165
1166 // The instantiator may be required at run time for generic type checks or 1166 // The instantiators may be required at run time for generic type checks or
1167 // allocation of generic types. 1167 // allocation of generic types.
1168 if (parser.IsInstantiatorRequired()) { 1168 if (parser.IsInstantiatorRequired()) {
1169 // In the case of a local function, only set the instantiator if the 1169 // In the case of a local function, only set the instantiator if the
1170 // receiver (or type arguments parameter of a factory) was captured. 1170 // receiver (or type arguments parameter of a factory) was captured.
1171 LocalVariable* instantiator = NULL; 1171 LocalVariable* instantiator = NULL;
1172 const bool kTestOnly = true; 1172 const bool kTestOnly = true;
1173 if (parser.current_function().IsInFactoryScope()) { 1173 if (parser.current_function().IsInFactoryScope()) {
1174 instantiator = parser.LookupTypeArgumentsParameter(node_sequence->scope(), 1174 instantiator = parser.LookupTypeArgumentsParameter(node_sequence->scope(),
1175 kTestOnly); 1175 kTestOnly);
1176 } else { 1176 } else {
1177 instantiator = parser.LookupReceiver(node_sequence->scope(), kTestOnly); 1177 instantiator = parser.LookupReceiver(node_sequence->scope(), kTestOnly);
1178 } 1178 }
1179 if (!parser.current_function().IsLocalFunction() || 1179 if (!parser.current_function().IsLocalFunction() ||
1180 ((instantiator != NULL) && instantiator->is_captured())) { 1180 ((instantiator != NULL) && instantiator->is_captured())) {
1181 parsed_function->set_instantiator(instantiator); 1181 parsed_function->set_instantiator(instantiator);
1182 } 1182 }
1183 } 1183 }
1184 if (FLAG_generic_method_semantics && parser.current_function().IsGeneric()) {
1185 const String* variable_name = &Symbols::FunctionInstantiatorVar();
1186 const bool kTestOnly = true;
1187 LocalVariable* instantiator =
1188 node_sequence->scope()->LookupVariable(*variable_name, kTestOnly);
1189 ASSERT(instantiator != NULL);
1190 parsed_function->set_function_instantiator(instantiator);
1191 // Function instantiator variables of parent generic functions, if any, are
1192 // captured and accessible via the context.
1193 }
1184 } 1194 }
1185 1195
1186 1196
1187 RawObject* Parser::ParseMetadata(const Field& meta_data) { 1197 RawObject* Parser::ParseMetadata(const Field& meta_data) {
1188 LongJumpScope jump; 1198 LongJumpScope jump;
1189 if (setjmp(*jump.Set()) == 0) { 1199 if (setjmp(*jump.Set()) == 0) {
1190 Thread* thread = Thread::Current(); 1200 Thread* thread = Thread::Current();
1191 StackZone stack_zone(thread); 1201 StackZone stack_zone(thread);
1192 Zone* zone = stack_zone.GetZone(); 1202 Zone* zone = stack_zone.GetZone();
1193 const Class& owner_class = Class::Handle(zone, meta_data.Owner()); 1203 const Class& owner_class = Class::Handle(zone, meta_data.Owner());
(...skipping 2259 matching lines...) Expand 10 before | Expand all | Expand 10 after
3453 3463
3454 if (func.IsGenerativeConstructor()) { 3464 if (func.IsGenerativeConstructor()) {
3455 SequenceNode* statements = ParseConstructor(func); 3465 SequenceNode* statements = ParseConstructor(func);
3456 last_used_try_index_ = saved_try_index; 3466 last_used_try_index_ = saved_try_index;
3457 return statements; 3467 return statements;
3458 } 3468 }
3459 3469
3460 ASSERT(!func.IsGenerativeConstructor()); 3470 ASSERT(!func.IsGenerativeConstructor());
3461 OpenFunctionBlock(func); // Build local scope for function. 3471 OpenFunctionBlock(func); // Build local scope for function.
3462 3472
3473 if (FLAG_generic_method_semantics && func.IsGeneric()) {
3474 // Insert function instantiator variable to scope.
3475 LocalVariable* function_instantiator = new (Z) LocalVariable(
3476 TokenPosition::kNoSource, TokenPosition::kNoSource,
3477 Symbols::FunctionInstantiatorVar(), Object::dynamic_type());
3478 current_block_->scope->AddVariable(function_instantiator);
3479 }
3480
3463 ParamList params; 3481 ParamList params;
3464 // An instance closure function may capture and access the receiver, but via 3482 // An instance closure function may capture and access the receiver, but via
3465 // the context and not via the first formal parameter. 3483 // the context and not via the first formal parameter.
3466 if (func.IsClosureFunction()) { 3484 if (func.IsClosureFunction()) {
3467 // The first parameter of a closure function is the closure object. 3485 // The first parameter of a closure function is the closure object.
3468 ASSERT(!func.is_const()); // Closure functions cannot be const. 3486 ASSERT(!func.is_const()); // Closure functions cannot be const.
3469 params.AddFinalParameter(TokenPos(), &Symbols::ClosureParameter(), 3487 params.AddFinalParameter(TokenPos(), &Symbols::ClosureParameter(),
3470 &Object::dynamic_type()); 3488 &Object::dynamic_type());
3471 } else if (!func.is_static()) { 3489 } else if (!func.is_static()) {
3472 // Static functions do not have a receiver. 3490 // Static functions do not have a receiver.
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
3542 } 3560 }
3543 ResolveSignature(func); 3561 ResolveSignature(func);
3544 if (!is_top_level_) { 3562 if (!is_top_level_) {
3545 ClassFinalizer::FinalizeSignature(Class::Handle(Z, func.origin()), func); 3563 ClassFinalizer::FinalizeSignature(Class::Handle(Z, func.origin()), func);
3546 } 3564 }
3547 SetupDefaultsForOptionalParams(params); 3565 SetupDefaultsForOptionalParams(params);
3548 ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved()); 3566 ASSERT(AbstractType::Handle(Z, func.result_type()).IsResolved());
3549 3567
3550 // Populate function scope with the formal parameters. 3568 // Populate function scope with the formal parameters.
3551 AddFormalParamsToScope(&params, current_block_->scope); 3569 AddFormalParamsToScope(&params, current_block_->scope);
3552
3553 if (I->type_checks() && (FunctionLevel() > 0)) {
3554 // We are parsing, but not compiling, a local function.
3555 // The instantiator may be required at run time for generic type checks.
3556 if (IsInstantiatorRequired()) {
3557 // Make sure that the receiver of the enclosing instance function
3558 // (or implicit first parameter of an enclosing factory) is marked as
3559 // captured if type checks are enabled, because they may access it to
3560 // instantiate types.
3561 CaptureInstantiator();
3562 }
3563 }
3564 } 3570 }
3565 3571
3566 const TokenPosition modifier_pos = TokenPos(); 3572 const TokenPosition modifier_pos = TokenPos();
3567 RawFunction::AsyncModifier func_modifier = ParseFunctionModifier(); 3573 RawFunction::AsyncModifier func_modifier = ParseFunctionModifier();
3568 if (!func.is_generated_body()) { 3574 if (!func.is_generated_body()) {
3569 // Don't add a modifier to the closure representing the body of 3575 // Don't add a modifier to the closure representing the body of
3570 // the asynchronous function or generator. 3576 // the asynchronous function or generator.
3571 func.set_modifier(func_modifier); 3577 func.set_modifier(func_modifier);
3572 } 3578 }
3573 3579
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
3613 // The closure containing the body of an async* function is debuggable. 3619 // The closure containing the body of an async* function is debuggable.
3614 ASSERT(func.is_debuggable()); 3620 ASSERT(func.is_debuggable());
3615 if (FLAG_causal_async_stacks) { 3621 if (FLAG_causal_async_stacks) {
3616 // In order to collect causal asynchronous stacks efficiently we rely on 3622 // In order to collect causal asynchronous stacks efficiently we rely on
3617 // this function not being inlined. 3623 // this function not being inlined.
3618 func.set_is_inlinable(false); 3624 func.set_is_inlinable(false);
3619 } 3625 }
3620 OpenAsyncGeneratorClosure(); 3626 OpenAsyncGeneratorClosure();
3621 } 3627 }
3622 3628
3629 // Function level is now correctly set to parse the (possibly async) body.
3630 if (I->type_checks() && (FunctionLevel() > 0)) {
3631 // We are parsing, but not compiling, a local function.
3632 // The instantiator may be required at run time for generic type checks.
3633 // Note that the source of this local function may not reference the
3634 // generic type explicitly. However, it may assign a value to a captured
3635 // variable declared with its generic type in the enclosing function.
3636 // Make sure that the receiver of the enclosing instance function
3637 // (or implicit first parameter of an enclosing factory) is marked as
3638 // captured if type checks are enabled, because they may access it to
3639 // instantiate types.
3640 // If any enclosing parent of the function being parsed is generic, capture
3641 // their function instantiators.
3642 CaptureAllInstantiators();
3643 }
3644
3623 BoolScope allow_await(&this->await_is_keyword_, 3645 BoolScope allow_await(&this->await_is_keyword_,
3624 func.IsAsyncOrGenerator() || func.is_generated_body()); 3646 func.IsAsyncOrGenerator() || func.is_generated_body());
3625 TokenPosition end_token_pos = TokenPosition::kNoSource; 3647 TokenPosition end_token_pos = TokenPosition::kNoSource;
3626 if (CurrentToken() == Token::kLBRACE) { 3648 if (CurrentToken() == Token::kLBRACE) {
3627 ConsumeToken(); 3649 ConsumeToken();
3628 if (String::Handle(Z, func.name()).Equals(Symbols::EqualOperator())) { 3650 if (String::Handle(Z, func.name()).Equals(Symbols::EqualOperator())) {
3629 const Class& owner = Class::Handle(Z, func.Owner()); 3651 const Class& owner = Class::Handle(Z, func.Owner());
3630 if (!owner.IsObjectClass()) { 3652 if (!owner.IsObjectClass()) {
3631 AddEqualityNullCheck(); 3653 AddEqualityNullCheck();
3632 } 3654 }
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
3785 return LibraryPrefix::null(); 3807 return LibraryPrefix::null();
3786 } 3808 }
3787 3809
3788 // A library prefix with the name exists. Now check whether it is 3810 // A library prefix with the name exists. Now check whether it is
3789 // shadowed by a local definition. 3811 // shadowed by a local definition.
3790 if (!is_top_level_ && 3812 if (!is_top_level_ &&
3791 ResolveIdentInLocalScope(TokenPos(), ident, NULL, NULL)) { 3813 ResolveIdentInLocalScope(TokenPos(), ident, NULL, NULL)) {
3792 return LibraryPrefix::null(); 3814 return LibraryPrefix::null();
3793 } 3815 }
3794 // Check whether the identifier is shadowed by a function type parameter. 3816 // Check whether the identifier is shadowed by a function type parameter.
3795 // TODO(regis): Shortcut this lookup if no generic functions in scope. 3817 if (InGenericFunctionScope() && (innermost_function().LookupTypeParameter(
3796 if (!innermost_function().IsNull() && 3818 ident, NULL) != TypeParameter::null())) {
hausner 2017/03/08 06:19:36 Nit: weird formatting, but git cl format probably
regis 2017/03/08 16:18:49 Yes, I had to run git cl format. I'll try to fix i
3797 (innermost_function().LookupTypeParameter(ident, NULL) !=
3798 TypeParameter::null())) {
3799 return LibraryPrefix::null(); 3819 return LibraryPrefix::null();
3800 } 3820 }
3801 // Check whether the identifier is shadowed by a class type parameter. 3821 // Check whether the identifier is shadowed by a class type parameter.
3802 ASSERT(!current_class().IsNull()); 3822 ASSERT(!current_class().IsNull());
3803 if (current_class().LookupTypeParameter(ident) != TypeParameter::null()) { 3823 if (current_class().LookupTypeParameter(ident) != TypeParameter::null()) {
3804 return LibraryPrefix::null(); 3824 return LibraryPrefix::null();
3805 } 3825 }
3806 3826
3807 // We have a name that is not shadowed, followed by a period or #. 3827 // We have a name that is not shadowed, followed by a period or #.
3808 // Consume the identifier, let the caller consume the . or #. 3828 // Consume the identifier, let the caller consume the . or #.
(...skipping 1711 matching lines...) Expand 10 before | Expand all | Expand 10 after
5520 // Postpone resolution in order to avoid resolving the owner and its 5540 // Postpone resolution in order to avoid resolving the owner and its
5521 // type parameters, as they are not fully parsed yet. 5541 // type parameters, as they are not fully parsed yet.
5522 type_parameter_bound = ParseType(ClassFinalizer::kDoNotResolve); 5542 type_parameter_bound = ParseType(ClassFinalizer::kDoNotResolve);
5523 } else { 5543 } else {
5524 type_parameter_bound = I->object_store()->object_type(); 5544 type_parameter_bound = I->object_store()->object_type();
5525 } 5545 }
5526 type_parameter = TypeParameter::New( 5546 type_parameter = TypeParameter::New(
5527 parameterizing_class ? current_class() : Class::Handle(Z), 5547 parameterizing_class ? current_class() : Class::Handle(Z),
5528 parameterizing_class ? Function::Handle(Z) : innermost_function(), 5548 parameterizing_class ? Function::Handle(Z) : innermost_function(),
5529 index, 0, type_parameter_name, type_parameter_bound, declaration_pos); 5549 index, 0, type_parameter_name, type_parameter_bound, declaration_pos);
5550 if (!parameterizing_class) {
5551 type_parameter.SetIsFinalized();
5552 }
5530 type_parameters_array.Add( 5553 type_parameters_array.Add(
5531 &AbstractType::ZoneHandle(Z, type_parameter.raw())); 5554 &AbstractType::ZoneHandle(Z, type_parameter.raw()));
5532 if (FLAG_enable_mirrors && metadata_pos.IsReal()) { 5555 if (FLAG_enable_mirrors && metadata_pos.IsReal()) {
5533 library_.AddTypeParameterMetadata(type_parameter, metadata_pos); 5556 library_.AddTypeParameterMetadata(type_parameter, metadata_pos);
5534 } 5557 }
5535 index++; 5558 index++;
5536 } while (CurrentToken() == Token::kCOMMA); 5559 } while (CurrentToken() == Token::kCOMMA);
5537 Token::Kind token = CurrentToken(); 5560 Token::Kind token = CurrentToken();
5538 if ((token == Token::kGT) || (token == Token::kSHR)) { 5561 if ((token == Token::kGT) || (token == Token::kSHR)) {
5539 ConsumeRightAngleBracket(); 5562 ConsumeRightAngleBracket();
(...skipping 1475 matching lines...) Expand 10 before | Expand all | Expand 10 after
7015 // Finalize function type. 7038 // Finalize function type.
7016 Type& signature_type = Type::Handle(Z, closure.SignatureType()); 7039 Type& signature_type = Type::Handle(Z, closure.SignatureType());
7017 signature_type ^= CanonicalizeType(signature_type); 7040 signature_type ^= CanonicalizeType(signature_type);
7018 closure.SetSignatureType(signature_type); 7041 closure.SetSignatureType(signature_type);
7019 ASSERT(AbstractType::Handle(Z, closure.result_type()).IsResolved()); 7042 ASSERT(AbstractType::Handle(Z, closure.result_type()).IsResolved());
7020 ASSERT(closure.NumParameters() == closure_params.parameters->length()); 7043 ASSERT(closure.NumParameters() == closure_params.parameters->length());
7021 } 7044 }
7022 OpenFunctionBlock(closure); 7045 OpenFunctionBlock(closure);
7023 AddFormalParamsToScope(&closure_params, current_block_->scope); 7046 AddFormalParamsToScope(&closure_params, current_block_->scope);
7024 async_temp_scope_ = current_block_->scope; 7047 async_temp_scope_ = current_block_->scope;
7025
7026 // Capture instantiator in case it may be needed to generate the type
7027 // check of the return value. (C.f. handling of Token::kRETURN.)
7028 ASSERT(FunctionLevel() > 0);
7029 if (I->type_checks() && IsInstantiatorRequired()) {
7030 CaptureInstantiator();
7031 }
7032 return closure.raw(); 7048 return closure.raw();
7033 } 7049 }
7034 7050
7035 7051
7036 void Parser::AddContinuationVariables() { 7052 void Parser::AddContinuationVariables() {
7037 // Add to current block's scope: 7053 // Add to current block's scope:
7038 // var :await_jump_var; 7054 // var :await_jump_var;
7039 // var :await_ctx_var; 7055 // var :await_ctx_var;
7040 LocalVariable* await_jump_var = 7056 LocalVariable* await_jump_var =
7041 new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource, 7057 new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
(...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after
7710 void Parser::CaptureInstantiator() { 7726 void Parser::CaptureInstantiator() {
7711 ASSERT(FunctionLevel() > 0); 7727 ASSERT(FunctionLevel() > 0);
7712 const String* variable_name = current_function().IsInFactoryScope() 7728 const String* variable_name = current_function().IsInFactoryScope()
7713 ? &Symbols::TypeArgumentsParameter() 7729 ? &Symbols::TypeArgumentsParameter()
7714 : &Symbols::This(); 7730 : &Symbols::This();
7715 current_block_->scope->CaptureVariable( 7731 current_block_->scope->CaptureVariable(
7716 current_block_->scope->LookupVariable(*variable_name, true)); 7732 current_block_->scope->LookupVariable(*variable_name, true));
7717 } 7733 }
7718 7734
7719 7735
7720 void Parser::CaptureFunctionInstantiator() { 7736 void Parser::CaptureFunctionInstantiators() {
7737 ASSERT(InGenericFunctionScope());
7721 ASSERT(FunctionLevel() > 0); 7738 ASSERT(FunctionLevel() > 0);
7739 if (!FLAG_generic_method_semantics) {
7740 return;
7741 }
7742 // Capture function instantiators starting at parent of innermost function.
7743 intptr_t variable_function_level = FunctionLevel() - 1;
7722 const String* variable_name = &Symbols::FunctionInstantiatorVar(); 7744 const String* variable_name = &Symbols::FunctionInstantiatorVar();
7723 current_block_->scope->CaptureVariable( 7745 LocalScope* scope = current_block_->scope;
7724 current_block_->scope->LookupVariable(*variable_name, true)); 7746 do {
7747 while (scope->function_level() > variable_function_level) {
7748 scope = scope->parent();
7749 }
7750 // Function instantiator is in top scope at that function level.
7751 LocalScope* parent_scope = scope->parent();
7752 while ((parent_scope != NULL) &&
7753 (parent_scope->function_level() == scope->function_level())) {
7754 scope = parent_scope;
7755 parent_scope = scope->parent();
7756 }
7757 LocalVariable* function_instantiator_var =
7758 scope->LookupVariable(*variable_name, true);
7759 if (function_instantiator_var != NULL) {
7760 current_block_->scope->CaptureVariable(function_instantiator_var);
7761 }
7762 scope = scope->parent();
7763 variable_function_level--;
7764 } while (variable_function_level >= 0);
7725 } 7765 }
7726 7766
7727 7767
7768 void Parser::CaptureAllInstantiators() {
7769 if (IsInstantiatorRequired()) {
7770 CaptureInstantiator();
7771 }
7772 if (AreFunctionInstantiatorsRequired()) {
7773 CaptureFunctionInstantiators();
7774 }
7775 }
7776
7777
7728 AstNode* Parser::LoadReceiver(TokenPosition token_pos) { 7778 AstNode* Parser::LoadReceiver(TokenPosition token_pos) {
7729 // A nested function may access 'this', referring to the receiver of the 7779 // A nested function may access 'this', referring to the receiver of the
7730 // outermost enclosing function. 7780 // outermost enclosing function.
7731 const bool kTestOnly = false; 7781 const bool kTestOnly = false;
7732 LocalVariable* receiver = LookupReceiver(current_block_->scope, kTestOnly); 7782 LocalVariable* receiver = LookupReceiver(current_block_->scope, kTestOnly);
7733 if (receiver == NULL) { 7783 if (receiver == NULL) {
7734 ReportError(token_pos, "illegal implicit access to receiver 'this'"); 7784 ReportError(token_pos, "illegal implicit access to receiver 'this'");
7735 } 7785 }
7736 return new (Z) LoadLocalNode(TokenPos(), receiver); 7786 return new (Z) LoadLocalNode(TokenPos(), receiver);
7737 } 7787 }
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
8058 SkipFunctionLiteral(); 8108 SkipFunctionLiteral();
8059 signature_type = function.SignatureType(); 8109 signature_type = function.SignatureType();
8060 } 8110 }
8061 8111
8062 // Local functions are registered in the enclosing class, but 8112 // Local functions are registered in the enclosing class, but
8063 // ignored during class finalization. The enclosing class has 8113 // ignored during class finalization. The enclosing class has
8064 // already been finalized. 8114 // already been finalized.
8065 ASSERT(current_class().is_finalized()); 8115 ASSERT(current_class().is_finalized());
8066 ASSERT(signature_type.IsFinalized()); 8116 ASSERT(signature_type.IsFinalized());
8067 8117
8068 // Make sure that the instantiator is captured. 8118 // Make sure that the instantiators are captured.
8069 if ((FunctionLevel() > 0) && 8119 if ((FunctionLevel() > 0) && !signature_type.IsInstantiated()) {
8070 Class::Handle(signature_type.type_class()).IsGeneric()) { 8120 CaptureAllInstantiators();
8071 CaptureInstantiator();
8072 } 8121 }
8073 8122
8074 // A local signature type itself cannot be malformed or malbounded, only its 8123 // A local signature type itself cannot be malformed or malbounded, only its
8075 // signature function's result type or parameter types may be. 8124 // signature function's result type or parameter types may be.
8076 ASSERT(!signature_type.IsMalformed()); 8125 ASSERT(!signature_type.IsMalformed());
8077 ASSERT(!signature_type.IsMalbounded()); 8126 ASSERT(!signature_type.IsMalbounded());
8078 8127
8079 if (!is_literal) { 8128 if (!is_literal) {
8080 // Patch the function type of the variable now that the signature is known. 8129 // Patch the function type of the variable now that the signature is known.
8081 function_type.set_type_class(Class::Handle(Z, signature_type.type_class())); 8130 function_type.set_type_class(Class::Handle(Z, signature_type.type_class()));
(...skipping 1852 matching lines...) Expand 10 before | Expand all | Expand 10 after
9934 catch_blocks.Last() = block; 9983 catch_blocks.Last() = block;
9935 } 9984 }
9936 // This catch clause will handle all exceptions. We can safely forget 9985 // This catch clause will handle all exceptions. We can safely forget
9937 // all previous catch clause types. 9986 // all previous catch clause types.
9938 handler_types.SetLength(0); 9987 handler_types.SetLength(0);
9939 handler_types.Add(*exception_param.type); 9988 handler_types.Add(*exception_param.type);
9940 } else { 9989 } else {
9941 // Has a type specification that is not malformed or malbounded. Now 9990 // Has a type specification that is not malformed or malbounded. Now
9942 // form an 'if type check' to guard the catch handler code. 9991 // form an 'if type check' to guard the catch handler code.
9943 if (!exception_param.type->IsInstantiated() && (FunctionLevel() > 0)) { 9992 if (!exception_param.type->IsInstantiated() && (FunctionLevel() > 0)) {
9944 // Make sure that the instantiator is captured. 9993 // Make sure that the instantiators are captured.
9945 CaptureInstantiator(); 9994 CaptureAllInstantiators();
9946 } 9995 }
9947 TypeNode* exception_type = 9996 TypeNode* exception_type =
9948 new (Z) TypeNode(catch_pos, *exception_param.type); 9997 new (Z) TypeNode(catch_pos, *exception_param.type);
9949 AstNode* exception_value = 9998 AstNode* exception_value =
9950 new (Z) LoadLocalNode(catch_pos, exception_var); 9999 new (Z) LoadLocalNode(catch_pos, exception_var);
9951 if (!exception_type->type().IsInstantiated()) { 10000 if (!exception_type->type().IsInstantiated()) {
9952 EnsureExpressionTemp(); 10001 EnsureExpressionTemp();
9953 } 10002 }
9954 type_tests.Add(new (Z) ComparisonNode(catch_pos, Token::kIS, 10003 type_tests.Add(new (Z) ComparisonNode(catch_pos, Token::kIS,
9955 exception_value, exception_type)); 10004 exception_value, exception_type));
(...skipping 1009 matching lines...) Expand 10 before | Expand all | Expand 10 after
10965 } else { 11014 } else {
10966 // For 'is' and 'as' we expect the right operand to be a type. 11015 // For 'is' and 'as' we expect the right operand to be a type.
10967 if ((op_kind == Token::kIS) && (CurrentToken() == Token::kNOT)) { 11016 if ((op_kind == Token::kIS) && (CurrentToken() == Token::kNOT)) {
10968 ConsumeToken(); 11017 ConsumeToken();
10969 op_kind = Token::kISNOT; 11018 op_kind = Token::kISNOT;
10970 } 11019 }
10971 const TokenPosition type_pos = TokenPos(); 11020 const TokenPosition type_pos = TokenPos();
10972 const AbstractType& type = AbstractType::ZoneHandle( 11021 const AbstractType& type = AbstractType::ZoneHandle(
10973 Z, ParseTypeOrFunctionType(false, ClassFinalizer::kCanonicalize)); 11022 Z, ParseTypeOrFunctionType(false, ClassFinalizer::kCanonicalize));
10974 if (!type.IsInstantiated() && (FunctionLevel() > 0)) { 11023 if (!type.IsInstantiated() && (FunctionLevel() > 0)) {
10975 // Make sure that the instantiator is captured. 11024 // Make sure that the instantiators are captured.
10976 CaptureInstantiator(); 11025 CaptureAllInstantiators();
10977 } 11026 }
10978 right_operand = new (Z) TypeNode(type_pos, type); 11027 right_operand = new (Z) TypeNode(type_pos, type);
10979 // In production mode, the type may be malformed. 11028 // In production mode, the type may be malformed.
10980 // In checked mode, the type may be malformed or malbounded. 11029 // In checked mode, the type may be malformed or malbounded.
10981 if (type.IsMalformedOrMalbounded()) { 11030 if (type.IsMalformedOrMalbounded()) {
10982 // Note that a type error is thrown in a type test or in 11031 // Note that a type error is thrown in a type test or in
10983 // a type cast even if the tested value is null. 11032 // a type cast even if the tested value is null.
10984 // We need to evaluate the left operand for potential 11033 // We need to evaluate the left operand for potential
10985 // side effects. 11034 // side effects.
10986 LetNode* let = new (Z) LetNode(left_operand->token_pos()); 11035 LetNode* let = new (Z) LetNode(left_operand->token_pos());
(...skipping 846 matching lines...) Expand 10 before | Expand all | Expand 10 after
11833 TypeParameter& type_parameter = TypeParameter::ZoneHandle(Z); 11882 TypeParameter& type_parameter = TypeParameter::ZoneHandle(Z);
11834 type_parameter = TypeParameter::Cast(primary->primary()).raw(); 11883 type_parameter = TypeParameter::Cast(primary->primary()).raw();
11835 if (type_parameter.IsClassTypeParameter()) { 11884 if (type_parameter.IsClassTypeParameter()) {
11836 if (ParsingStaticMember()) { 11885 if (ParsingStaticMember()) {
11837 const String& name = String::Handle(Z, type_parameter.name()); 11886 const String& name = String::Handle(Z, type_parameter.name());
11838 ReportError(primary_pos, 11887 ReportError(primary_pos,
11839 "cannot access type parameter '%s' " 11888 "cannot access type parameter '%s' "
11840 "from static function", 11889 "from static function",
11841 name.ToCString()); 11890 name.ToCString());
11842 } 11891 }
11843 // TODO(regis): Verify that CaptureInstantiator() was already called
11844 // and remove call below.
11845 if (FunctionLevel() > 0) { 11892 if (FunctionLevel() > 0) {
11846 // Make sure that the class instantiator is captured. 11893 // Make sure that the class instantiator is captured.
11847 CaptureInstantiator(); 11894 CaptureInstantiator();
11848 } 11895 }
11849 type_parameter ^= CanonicalizeType(type_parameter); 11896 type_parameter ^= CanonicalizeType(type_parameter);
11850 ASSERT(!type_parameter.IsMalformed());
11851 return new (Z) TypeNode(primary_pos, type_parameter);
11852 } else { 11897 } else {
11853 ASSERT(type_parameter.IsFunctionTypeParameter()); 11898 ASSERT(type_parameter.IsFunctionTypeParameter());
11854 // TODO(regis): Verify that CaptureFunctionInstantiator() was already 11899 if (!FLAG_generic_method_semantics) {
11855 // called if necessary. 11900 Type& type = Type::ZoneHandle(Z, Type::DynamicType());
11856 // TODO(regis): Finalize type parameter and return as type node. 11901 return new (Z) TypeNode(primary_pos, type);
11857 // For now, map to dynamic type. 11902 }
11858 Type& type = Type::ZoneHandle(Z, Type::DynamicType()); 11903 if (type_parameter.parent_level() > 0) {
11859 return new (Z) TypeNode(primary_pos, type); 11904 // Make sure that the function instantiators are captured.
11905 CaptureFunctionInstantiators();
11906 }
11860 } 11907 }
11908 ASSERT(type_parameter.IsFinalized());
11909 ASSERT(!type_parameter.IsMalformed());
11910 return new (Z) TypeNode(primary_pos, type_parameter);
11861 } 11911 }
11862 11912
11863 11913
11864 AstNode* Parser::ParseSelectors(AstNode* primary, bool is_cascade) { 11914 AstNode* Parser::ParseSelectors(AstNode* primary, bool is_cascade) {
11865 AstNode* left = primary; 11915 AstNode* left = primary;
11866 while (true) { 11916 while (true) {
11867 AstNode* selector = NULL; 11917 AstNode* selector = NULL;
11868 if ((CurrentToken() == Token::kPERIOD) || 11918 if ((CurrentToken() == Token::kPERIOD) ||
11869 (CurrentToken() == Token::kQM_PERIOD)) { 11919 (CurrentToken() == Token::kQM_PERIOD)) {
11870 // Unconditional or conditional property extraction or method call. 11920 // Unconditional or conditional property extraction or method call.
(...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after
12354 return; 12404 return;
12355 } 12405 }
12356 // Resolve type class. 12406 // Resolve type class.
12357 if (!type->HasResolvedTypeClass()) { 12407 if (!type->HasResolvedTypeClass()) {
12358 const UnresolvedClass& unresolved_class = 12408 const UnresolvedClass& unresolved_class =
12359 UnresolvedClass::Handle(Z, type->unresolved_class()); 12409 UnresolvedClass::Handle(Z, type->unresolved_class());
12360 const String& unresolved_class_name = 12410 const String& unresolved_class_name =
12361 String::Handle(Z, unresolved_class.ident()); 12411 String::Handle(Z, unresolved_class.ident());
12362 if (unresolved_class.library_or_library_prefix() == Object::null()) { 12412 if (unresolved_class.library_or_library_prefix() == Object::null()) {
12363 // First check if the type is a function type parameter. 12413 // First check if the type is a function type parameter.
12364 if (!innermost_function().IsNull()) { 12414 if (InGenericFunctionScope()) {
12365 // TODO(regis): Shortcut this lookup if no generic functions in scope. 12415 intptr_t type_param_func_level = FunctionLevel();
12366 // A bit has_generic_parent() would be useful on Function.
12367 // Unfortunately, all 32 kind bits are used in Function.
12368 TypeParameter& type_parameter = TypeParameter::ZoneHandle( 12416 TypeParameter& type_parameter = TypeParameter::ZoneHandle(
12369 Z, innermost_function().LookupTypeParameter(unresolved_class_name, 12417 Z, innermost_function().LookupTypeParameter(
12370 NULL)); 12418 unresolved_class_name, &type_param_func_level));
12371 if (!type_parameter.IsNull()) { 12419 if (!type_parameter.IsNull()) {
12372 // A type parameter cannot be parameterized, so make the type 12420 // A type parameter cannot be parameterized, so make the type
12373 // malformed if type arguments have previously been parsed. 12421 // malformed if type arguments have previously been parsed.
12374 if (type->arguments() != TypeArguments::null()) { 12422 if (type->arguments() != TypeArguments::null()) {
12375 *type = ClassFinalizer::NewFinalizedMalformedType( 12423 *type = ClassFinalizer::NewFinalizedMalformedType(
12376 Error::Handle(Z), // No previous error. 12424 Error::Handle(Z), // No previous error.
12377 script_, type_parameter.token_pos(), 12425 script_, type_parameter.token_pos(),
12378 "type parameter '%s' cannot be parameterized", 12426 "type parameter '%s' cannot be parameterized",
12379 String::Handle(Z, type_parameter.name()).ToCString()); 12427 String::Handle(Z, type_parameter.name()).ToCString());
12380 return; 12428 return;
12381 } 12429 }
12382 // TODO(regis): Mark function type parameter as finalized (its index 12430 if (FLAG_generic_method_semantics) {
12383 // does not need adjustment upon finalization) and return it. 12431 ASSERT(type_parameter.IsFinalized());
12384 // For now, resolve the function type parameter to dynamic. 12432 ASSERT(!type_parameter.IsMalformed());
12385 *type = Type::DynamicType(); 12433 *type = type_parameter.raw();
12434 } else {
12435 *type = Type::DynamicType();
12436 }
12386 return; 12437 return;
12387 } 12438 }
12388 } 12439 }
12389 // Then check if the type is a class type parameter. 12440 // Then check if the type is a class type parameter.
12390 const TypeParameter& type_parameter = TypeParameter::Handle( 12441 const TypeParameter& type_parameter = TypeParameter::Handle(
12391 Z, current_class().LookupTypeParameter(unresolved_class_name)); 12442 Z, current_class().LookupTypeParameter(unresolved_class_name));
12392 if (!type_parameter.IsNull()) { 12443 if (!type_parameter.IsNull()) {
12393 // A type parameter is considered to be a malformed type when 12444 // A type parameter is considered to be a malformed type when
12394 // referenced by a static member. 12445 // referenced by a static member.
12395 if (ParsingStaticMember()) { 12446 if (ParsingStaticMember()) {
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
12511 bool Parser::IsInstantiatorRequired() const { 12562 bool Parser::IsInstantiatorRequired() const {
12512 ASSERT(!current_function().IsNull()); 12563 ASSERT(!current_function().IsNull());
12513 if (current_function().is_static() && 12564 if (current_function().is_static() &&
12514 !current_function().IsInFactoryScope()) { 12565 !current_function().IsInFactoryScope()) {
12515 return false; 12566 return false;
12516 } 12567 }
12517 return current_class().IsGeneric(); 12568 return current_class().IsGeneric();
12518 } 12569 }
12519 12570
12520 12571
12572 bool Parser::AreFunctionInstantiatorsRequired() const {
12573 ASSERT(!innermost_function().IsNull());
12574 Function& parent = Function::Handle(innermost_function().parent_function());
12575 while (!parent.IsNull()) {
12576 if (parent.IsGeneric()) {
12577 return true;
12578 }
12579 parent = parent.parent_function();
12580 }
12581 return false;
12582 }
12583
12584
12585 bool Parser::InGenericFunctionScope() const {
12586 if (!innermost_function().IsNull()) {
12587 // With one more free tag bit in Function, we could cache this information.
12588 if (innermost_function().IsGeneric()) {
12589 return true;
12590 }
12591 Function& parent = Function::Handle(innermost_function().parent_function());
12592 while (!parent.IsNull()) {
12593 if (parent.IsGeneric()) {
12594 return true;
12595 }
12596 parent = parent.parent_function();
12597 }
12598 }
12599 return false;
12600 }
12601
12602
12521 void Parser::InsertCachedConstantValue(const Script& script, 12603 void Parser::InsertCachedConstantValue(const Script& script,
12522 TokenPosition token_pos, 12604 TokenPosition token_pos,
12523 const Instance& value) { 12605 const Instance& value) {
12524 ASSERT(Thread::Current()->IsMutatorThread()); 12606 ASSERT(Thread::Current()->IsMutatorThread());
12525 const intptr_t kInitialConstMapSize = 16; 12607 const intptr_t kInitialConstMapSize = 16;
12526 ASSERT(!script.InVMHeap()); 12608 ASSERT(!script.InVMHeap());
12527 if (script.compile_time_constants() == Array::null()) { 12609 if (script.compile_time_constants() == Array::null()) {
12528 const Array& array = Array::Handle( 12610 const Array& array = Array::Handle(
12529 HashTables::New<ConstantsMap>(kInitialConstMapSize, Heap::kNew)); 12611 HashTables::New<ConstantsMap>(kInitialConstMapSize, Heap::kNew));
12530 script.set_compile_time_constants(array); 12612 script.set_compile_time_constants(array);
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after
12958 // throw NoSuchMethodError if we're compiling a static method. 13040 // throw NoSuchMethodError if we're compiling a static method.
12959 AstNode* Parser::ResolveIdent(TokenPosition ident_pos, 13041 AstNode* Parser::ResolveIdent(TokenPosition ident_pos,
12960 const String& ident, 13042 const String& ident,
12961 bool allow_closure_names) { 13043 bool allow_closure_names) {
12962 TRACE_PARSER("ResolveIdent"); 13044 TRACE_PARSER("ResolveIdent");
12963 // First try to find the variable in the local scope (block scope or 13045 // First try to find the variable in the local scope (block scope or
12964 // class scope). 13046 // class scope).
12965 AstNode* resolved = NULL; 13047 AstNode* resolved = NULL;
12966 intptr_t resolved_func_level = 0; 13048 intptr_t resolved_func_level = 0;
12967 ResolveIdentInLocalScope(ident_pos, ident, &resolved, &resolved_func_level); 13049 ResolveIdentInLocalScope(ident_pos, ident, &resolved, &resolved_func_level);
12968 if (!innermost_function().IsNull()) { 13050 if (InGenericFunctionScope()) {
12969 // TODO(regis): Shortcut this lookup if no generic functions in scope.
12970 intptr_t type_param_func_level = FunctionLevel(); 13051 intptr_t type_param_func_level = FunctionLevel();
12971 const TypeParameter& type_parameter = 13052 const TypeParameter& type_parameter =
12972 TypeParameter::ZoneHandle(Z, innermost_function().LookupTypeParameter( 13053 TypeParameter::ZoneHandle(Z, innermost_function().LookupTypeParameter(
12973 ident, &type_param_func_level)); 13054 ident, &type_param_func_level));
12974 if (!type_parameter.IsNull()) { 13055 if (!type_parameter.IsNull()) {
12975 if ((resolved == NULL) || (resolved_func_level < type_param_func_level)) { 13056 if ((resolved == NULL) || (resolved_func_level < type_param_func_level)) {
12976 // The identifier is a function type parameter, possibly shadowing 13057 // The identifier is a function type parameter, possibly shadowing
12977 // 'resolved'. 13058 // 'resolved'.
12978 if ((FunctionLevel() > 0) && 13059 if (!FLAG_generic_method_semantics) {
12979 (type_param_func_level < FunctionLevel())) { 13060 Type& type = Type::ZoneHandle(Z, Type::DynamicType());
12980 // Make sure that the function instantiator is captured. 13061 return new (Z) TypeNode(ident_pos, type);
12981 CaptureFunctionInstantiator();
12982 } 13062 }
12983 // TODO(regis): Mark function type parameter as finalized (its index 13063 ASSERT(type_parameter.IsFinalized());
12984 // does not need adjustment upon finalization) and return as type node. 13064 ASSERT(!type_parameter.IsMalformed());
12985 // For now, resolve the function type parameter to dynamic. 13065 return new (Z) TypeNode(ident_pos, type_parameter);
12986 Type& type = Type::ZoneHandle(Z, Type::DynamicType());
12987 return new (Z) TypeNode(ident_pos, type);
12988 } 13066 }
12989 } 13067 }
12990 } 13068 }
12991 if (resolved == NULL) { 13069 if (resolved == NULL) {
12992 // Check whether the identifier is a class type parameter. 13070 // Check whether the identifier is a class type parameter.
12993 if (!current_class().IsNull()) { 13071 if (!current_class().IsNull()) {
12994 TypeParameter& type_parameter = TypeParameter::ZoneHandle( 13072 TypeParameter& type_parameter = TypeParameter::ZoneHandle(
12995 Z, current_class().LookupTypeParameter(ident)); 13073 Z, current_class().LookupTypeParameter(ident));
12996 if (!type_parameter.IsNull()) { 13074 if (!type_parameter.IsNull()) {
12997 if (FunctionLevel() > 0) {
12998 // Make sure that the class instantiator is captured.
12999 CaptureInstantiator();
13000 }
13001 type_parameter ^= CanonicalizeType(type_parameter); 13075 type_parameter ^= CanonicalizeType(type_parameter);
13002 ASSERT(!type_parameter.IsMalformed()); 13076 ASSERT(!type_parameter.IsMalformed());
13003 return new (Z) TypeNode(ident_pos, type_parameter); 13077 return new (Z) TypeNode(ident_pos, type_parameter);
13004 } 13078 }
13005 } 13079 }
13006 // Not found in the local scope, and the name is not a type parameter. 13080 // Not found in the local scope, and the name is not a type parameter.
13007 // Try finding the variable in the library scope (current library 13081 // Try finding the variable in the library scope (current library
13008 // and all libraries imported by it without a library prefix). 13082 // and all libraries imported by it without a library prefix).
13009 resolved = ResolveIdentInCurrentLibraryScope(ident_pos, ident); 13083 resolved = ResolveIdentInCurrentLibraryScope(ident_pos, ident);
13010 } 13084 }
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after
13425 // Factory call at runtime. 13499 // Factory call at runtime.
13426 const Class& factory_class = 13500 const Class& factory_class =
13427 Class::Handle(Z, Library::LookupCoreClass(Symbols::List())); 13501 Class::Handle(Z, Library::LookupCoreClass(Symbols::List()));
13428 ASSERT(!factory_class.IsNull()); 13502 ASSERT(!factory_class.IsNull());
13429 const Function& factory_method = Function::ZoneHandle( 13503 const Function& factory_method = Function::ZoneHandle(
13430 Z, factory_class.LookupFactory( 13504 Z, factory_class.LookupFactory(
13431 Library::PrivateCoreLibName(Symbols::ListLiteralFactory()))); 13505 Library::PrivateCoreLibName(Symbols::ListLiteralFactory())));
13432 ASSERT(!factory_method.IsNull()); 13506 ASSERT(!factory_method.IsNull());
13433 if (!list_type_arguments.IsNull() && 13507 if (!list_type_arguments.IsNull() &&
13434 !list_type_arguments.IsInstantiated() && (FunctionLevel() > 0)) { 13508 !list_type_arguments.IsInstantiated() && (FunctionLevel() > 0)) {
13435 // Make sure that the instantiator is captured. 13509 // Make sure that the instantiators are captured.
13436 CaptureInstantiator(); 13510 CaptureAllInstantiators();
13437 } 13511 }
13438 TypeArguments& factory_type_args = 13512 TypeArguments& factory_type_args =
13439 TypeArguments::ZoneHandle(Z, list_type_arguments.raw()); 13513 TypeArguments::ZoneHandle(Z, list_type_arguments.raw());
13440 // If the factory class extends other parameterized classes, adjust the 13514 // If the factory class extends other parameterized classes, adjust the
13441 // type argument vector. 13515 // type argument vector.
13442 if (!factory_type_args.IsNull() && (factory_class.NumTypeArguments() > 1)) { 13516 if (!factory_type_args.IsNull() && (factory_class.NumTypeArguments() > 1)) {
13443 ASSERT(factory_type_args.Length() == 1); 13517 ASSERT(factory_type_args.Length() == 1);
13444 Type& factory_type = Type::Handle( 13518 Type& factory_type = Type::Handle(
13445 Z, Type::New(factory_class, factory_type_args, type_pos, Heap::kOld)); 13519 Z, Type::New(factory_class, factory_type_args, type_pos, Heap::kOld));
13446 // It is not strictly necessary to canonicalize factory_type, but only its 13520 // It is not strictly necessary to canonicalize factory_type, but only its
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
13676 const Class& factory_class = 13750 const Class& factory_class =
13677 Class::Handle(Z, Library::LookupCoreClass(Symbols::Map())); 13751 Class::Handle(Z, Library::LookupCoreClass(Symbols::Map()));
13678 ASSERT(!factory_class.IsNull()); 13752 ASSERT(!factory_class.IsNull());
13679 const Function& factory_method = Function::ZoneHandle( 13753 const Function& factory_method = Function::ZoneHandle(
13680 Z, factory_class.LookupFactory( 13754 Z, factory_class.LookupFactory(
13681 Library::PrivateCoreLibName(Symbols::MapLiteralFactory()))); 13755 Library::PrivateCoreLibName(Symbols::MapLiteralFactory())));
13682 ASSERT(!factory_method.IsNull()); 13756 ASSERT(!factory_method.IsNull());
13683 if (!map_type_arguments.IsNull() && !map_type_arguments.IsInstantiated() && 13757 if (!map_type_arguments.IsNull() && !map_type_arguments.IsInstantiated() &&
13684 (FunctionLevel() > 0)) { 13758 (FunctionLevel() > 0)) {
13685 // Make sure that the instantiator is captured. 13759 // Make sure that the instantiator is captured.
13686 CaptureInstantiator(); 13760 CaptureAllInstantiators();
13687 } 13761 }
13688 TypeArguments& factory_type_args = 13762 TypeArguments& factory_type_args =
13689 TypeArguments::ZoneHandle(Z, map_type_arguments.raw()); 13763 TypeArguments::ZoneHandle(Z, map_type_arguments.raw());
13690 // If the factory class extends other parameterized classes, adjust the 13764 // If the factory class extends other parameterized classes, adjust the
13691 // type argument vector. 13765 // type argument vector.
13692 if (!factory_type_args.IsNull() && (factory_class.NumTypeArguments() > 2)) { 13766 if (!factory_type_args.IsNull() && (factory_class.NumTypeArguments() > 2)) {
13693 ASSERT(factory_type_args.Length() == 2); 13767 ASSERT(factory_type_args.Length() == 2);
13694 Type& factory_type = Type::Handle( 13768 Type& factory_type = Type::Handle(
13695 Z, Type::New(factory_class, factory_type_args, type_pos, Heap::kOld)); 13769 Z, Type::New(factory_class, factory_type_args, type_pos, Heap::kOld));
13696 // It is not strictly necessary to canonicalize factory_type, but only its 13770 // It is not strictly necessary to canonicalize factory_type, but only its
(...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after
14161 const Function& tearoff_func = Function::ZoneHandle( 14235 const Function& tearoff_func = Function::ZoneHandle(
14162 Z, BuildConstructorClosureFunction(constructor, new_pos)); 14236 Z, BuildConstructorClosureFunction(constructor, new_pos));
14163 14237
14164 // Local functions normally get parsed when the enclosing function is 14238 // Local functions normally get parsed when the enclosing function is
14165 // compiled. Since constructor tearoff closures don't get parsed here, 14239 // compiled. Since constructor tearoff closures don't get parsed here,
14166 // we need to duplicate some of the side effects of parsing, namely 14240 // we need to duplicate some of the side effects of parsing, namely
14167 // creating a function scope, and capturing the instantiator of the 14241 // creating a function scope, and capturing the instantiator of the
14168 // enclosing function if necessary. 14242 // enclosing function if necessary.
14169 OpenFunctionBlock(tearoff_func); 14243 OpenFunctionBlock(tearoff_func);
14170 // If there are type arguments in the tearoff expression that are 14244 // If there are type arguments in the tearoff expression that are
14171 // not yet instantiated, capture the instantiator. 14245 // not yet instantiated, capture the instantiators.
14172 if (IsInstantiatorRequired() && !type_arguments.IsNull() && 14246 if (!type_arguments.IsNull() && !type_arguments.IsInstantiated()) {
14173 !type_arguments.IsInstantiated()) { 14247 CaptureAllInstantiators();
14174 CaptureInstantiator();
14175 } 14248 }
14176 SequenceNode* tearoff_body = CloseBlock(); 14249 SequenceNode* tearoff_body = CloseBlock();
14177 ClosureNode* closure_obj = 14250 ClosureNode* closure_obj =
14178 new (Z) ClosureNode(new_pos, tearoff_func, NULL, tearoff_body->scope()); 14251 new (Z) ClosureNode(new_pos, tearoff_func, NULL, tearoff_body->scope());
14179 return closure_obj; 14252 return closure_obj;
14180 } 14253 }
14181 14254
14182 ASSERT(!is_tearoff_expression); 14255 ASSERT(!is_tearoff_expression);
14183 String& error_message = String::Handle(Z); 14256 String& error_message = String::Handle(Z);
14184 if (!constructor.AreValidArguments(arguments_length, arguments->names(), 14257 if (!constructor.AreValidArguments(arguments_length, arguments->names(),
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
14248 "const factory result is not an instance of '%s'", 14321 "const factory result is not an instance of '%s'",
14249 String::Handle(Z, type_bound.UserVisibleName()).ToCString()); 14322 String::Handle(Z, type_bound.UserVisibleName()).ToCString());
14250 new_object = ThrowTypeError(new_pos, type_bound); 14323 new_object = ThrowTypeError(new_pos, type_bound);
14251 } 14324 }
14252 type_bound = AbstractType::null(); 14325 type_bound = AbstractType::null();
14253 } 14326 }
14254 } else { 14327 } else {
14255 CheckConstructorCallTypeArguments(new_pos, constructor, type_arguments); 14328 CheckConstructorCallTypeArguments(new_pos, constructor, type_arguments);
14256 if (!type_arguments.IsNull() && !type_arguments.IsInstantiated() && 14329 if (!type_arguments.IsNull() && !type_arguments.IsInstantiated() &&
14257 (FunctionLevel() > 0)) { 14330 (FunctionLevel() > 0)) {
14258 // Make sure that the instantiator is captured. 14331 // Make sure that the instantiators are captured.
14259 CaptureInstantiator(); 14332 CaptureAllInstantiators();
14260 } 14333 }
14261 // If the type argument vector is not instantiated, we verify in checked 14334 // If the type argument vector is not instantiated, we verify in checked
14262 // mode at runtime that it is within its declared bounds. 14335 // mode at runtime that it is within its declared bounds.
14263 new_object = CreateConstructorCallNode(new_pos, type_arguments, constructor, 14336 new_object = CreateConstructorCallNode(new_pos, type_arguments, constructor,
14264 arguments); 14337 arguments);
14265 } 14338 }
14266 if (!type_bound.IsNull()) { 14339 if (!type_bound.IsNull()) {
14267 new_object = new (Z) AssignableNode(new_pos, new_object, type_bound, 14340 new_object = new (Z) AssignableNode(new_pos, new_object, type_bound,
14268 Symbols::FactoryResult()); 14341 Symbols::FactoryResult());
14269 } 14342 }
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
14433 ExpectToken(Token::kPERIOD); 14506 ExpectToken(Token::kPERIOD);
14434 } 14507 }
14435 } 14508 }
14436 String& ident = *CurrentLiteral(); 14509 String& ident = *CurrentLiteral();
14437 ConsumeToken(); 14510 ConsumeToken();
14438 if (prefix.IsNull()) { 14511 if (prefix.IsNull()) {
14439 intptr_t primary_func_level = 0; 14512 intptr_t primary_func_level = 0;
14440 ResolveIdentInLocalScope(qual_ident_pos, ident, &primary, 14513 ResolveIdentInLocalScope(qual_ident_pos, ident, &primary,
14441 &primary_func_level); 14514 &primary_func_level);
14442 // Check whether the identifier is shadowed by a function type parameter. 14515 // Check whether the identifier is shadowed by a function type parameter.
14443 if (!innermost_function().IsNull()) { 14516 if (InGenericFunctionScope()) {
14444 // TODO(regis): Shortcut this lookup if no generic functions in scope.
14445 intptr_t type_param_func_level = FunctionLevel(); 14517 intptr_t type_param_func_level = FunctionLevel();
14446 TypeParameter& type_param = TypeParameter::ZoneHandle( 14518 TypeParameter& type_param = TypeParameter::ZoneHandle(
14447 Z, innermost_function().LookupTypeParameter( 14519 Z, innermost_function().LookupTypeParameter(
14448 ident, &type_param_func_level)); 14520 ident, &type_param_func_level));
14449 if (!type_param.IsNull()) { 14521 if (!type_param.IsNull()) {
14450 if ((primary == NULL) || 14522 if ((primary == NULL) ||
14451 (primary_func_level < type_param_func_level)) { 14523 (primary_func_level < type_param_func_level)) {
14452 // The identifier is a function type parameter, possibly shadowing 14524 // The identifier is a function type parameter, possibly shadowing
14453 // already resolved 'primary'. 14525 // already resolved 'primary'.
14454 if ((FunctionLevel() > 0) &&
14455 (type_param_func_level < FunctionLevel())) {
14456 // Make sure that the function instantiator is captured.
14457 CaptureFunctionInstantiator();
14458 }
14459 return new (Z) PrimaryNode(qual_ident_pos, type_param); 14526 return new (Z) PrimaryNode(qual_ident_pos, type_param);
14460 } 14527 }
14461 } 14528 }
14462 } 14529 }
14463 if (primary == NULL) { 14530 if (primary == NULL) {
14464 // Check whether the identifier is a type parameter. 14531 // Check whether the identifier is a type parameter.
14465 if (!current_class().IsNull()) { 14532 if (!current_class().IsNull()) {
14466 TypeParameter& type_param = TypeParameter::ZoneHandle( 14533 TypeParameter& type_param = TypeParameter::ZoneHandle(
14467 Z, current_class().LookupTypeParameter(ident)); 14534 Z, current_class().LookupTypeParameter(ident));
14468 if (!type_param.IsNull()) { 14535 if (!type_param.IsNull()) {
(...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after
15133 const ArgumentListNode& function_args, 15200 const ArgumentListNode& function_args,
15134 const LocalVariable* temp_for_last_arg, 15201 const LocalVariable* temp_for_last_arg,
15135 bool is_super_invocation) { 15202 bool is_super_invocation) {
15136 UNREACHABLE(); 15203 UNREACHABLE();
15137 return NULL; 15204 return NULL;
15138 } 15205 }
15139 15206
15140 } // namespace dart 15207 } // namespace dart
15141 15208
15142 #endif // DART_PRECOMPILED_RUNTIME 15209 #endif // DART_PRECOMPILED_RUNTIME
OLDNEW
« no previous file with comments | « runtime/vm/parser.h ('k') | runtime/vm/unit_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698