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

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

Issue 8234016: Inline allocation of implicit closures. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: '' Created 9 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 | Annotate | Revision Log
« no previous file with comments | « runtime/vm/object.cc ('k') | runtime/vm/stub_code.h » ('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) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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 "vm/bigint_operations.h" 7 #include "vm/bigint_operations.h"
8 #include "vm/class_finalizer.h" 8 #include "vm/class_finalizer.h"
9 #include "vm/compiler.h" 9 #include "vm/compiler.h"
10 #include "vm/compiler_stats.h" 10 #include "vm/compiler_stats.h"
(...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after
573 if ((node_sequence->length() == 0) || 573 if ((node_sequence->length() == 0) ||
574 !node_sequence->NodeAt(node_sequence->length() - 1)->IsReturnNode()) { 574 !node_sequence->NodeAt(node_sequence->length() - 1)->IsReturnNode()) {
575 // Add implicit return node. 575 // Add implicit return node.
576 node_sequence->Add(new ReturnNode(parser.token_index_)); 576 node_sequence->Add(new ReturnNode(parser.token_index_));
577 } 577 }
578 parsed_function->set_node_sequence(node_sequence); 578 parsed_function->set_node_sequence(node_sequence);
579 579
580 // The instantiator may be required at run time for generic type checks or 580 // The instantiator may be required at run time for generic type checks or
581 // allocation of generic types. 581 // allocation of generic types.
582 if (parser.current_class().IsParameterized() && 582 if (parser.current_class().IsParameterized() &&
583 (!parser.current_function().IsInStaticScope() || 583 (!parser.current_function().is_static() ||
584 parser.current_function().IsInFactoryScope())) { 584 parser.current_function().IsInFactoryScope())) {
585 // In the case of a local function, only set the instantiator if the 585 // In the case of a local function, only set the instantiator if the
586 // receiver was captured. 586 // receiver was captured.
587 const bool kTestOnly = true; 587 const bool kTestOnly = true;
588 LocalVariable* receiver = 588 LocalVariable* receiver =
589 parser.LookupReceiver(node_sequence->scope(), 589 parser.LookupReceiver(node_sequence->scope(),
590 kTestOnly); 590 kTestOnly);
591 if (!parser.current_function().IsLocalFunction() || 591 if (!parser.current_function().IsLocalFunction() ||
592 ((receiver != NULL) && receiver->is_captured())) { 592 ((receiver != NULL) && receiver->is_captured())) {
593 parsed_function->set_instantiator( 593 parsed_function->set_instantiator(
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
836 ParamList func_params; 836 ParamList func_params;
837 const bool no_explicit_default_values = false; 837 const bool no_explicit_default_values = false;
838 ParseFormalParameterList(no_explicit_default_values, &func_params); 838 ParseFormalParameterList(no_explicit_default_values, &func_params);
839 // Change the name of the parameter type to be the signature of the 839 // Change the name of the parameter type to be the signature of the
840 // function type. 840 // function type.
841 // Note that the function type signature may involve parameters of a type 841 // Note that the function type signature may involve parameters of a type
842 // that is a type parameter of the enclosing class, so we parameterize the 842 // that is a type parameter of the enclosing class, so we parameterize the
843 // signature with the type parameters of the enclosing class, if any. 843 // signature with the type parameters of the enclosing class, if any.
844 // TODO(regis): Revisit if this is not the right thing to do. 844 // TODO(regis): Revisit if this is not the right thing to do.
845 const bool is_static = 845 const bool is_static =
846 current_function().IsNull() || current_function().IsInStaticScope(); 846 current_function().IsNull() || current_function().is_static();
847 const Function& signature_function = Function::Handle( 847 const Function& signature_function = Function::Handle(
848 Function::New(*parameter.name, 848 Function::New(*parameter.name,
849 RawFunction::kSignatureFunction, 849 RawFunction::kSignatureFunction,
850 is_static, 850 is_static,
851 /* is_const = */ false, 851 /* is_const = */ false,
852 parameter.name_pos)); 852 parameter.name_pos));
853 signature_function.set_owner(current_class()); 853 signature_function.set_owner(current_class());
854 signature_function.set_result_type(result_type); 854 signature_function.set_result_type(result_type);
855 AddFormalParamsToFunction(&func_params, signature_function); 855 AddFormalParamsToFunction(&func_params, signature_function);
856 const String& signature = String::Handle(signature_function.Signature()); 856 const String& signature = String::Handle(signature_function.Signature());
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
1066 } 1066 }
1067 return super_op; 1067 return super_op;
1068 } 1068 }
1069 1069
1070 1070
1071 AstNode* Parser::CreateImplicitClosureNode(const Function& func, 1071 AstNode* Parser::CreateImplicitClosureNode(const Function& func,
1072 intptr_t token_pos, 1072 intptr_t token_pos,
1073 AstNode* receiver) { 1073 AstNode* receiver) {
1074 Function& implicit_closure_function = 1074 Function& implicit_closure_function =
1075 Function::ZoneHandle(func.ImplicitClosureFunction()); 1075 Function::ZoneHandle(func.ImplicitClosureFunction());
1076 ASSERT(!implicit_closure_function.IsNull());
1077 ASSERT(implicit_closure_function.is_static()); // TODO(regis): For now.
1078 AstNode* node;
1079 if (receiver == NULL) { 1076 if (receiver == NULL) {
1080 ASSERT(func.is_static()); 1077 return new ImplicitStaticClosureNode(token_pos, implicit_closure_function);
1081 node = new StaticImplicitClosureNode(token_pos, implicit_closure_function);
1082 } else { 1078 } else {
1083 ASSERT(!func.is_static()); 1079 return new ImplicitInstanceClosureNode(token_pos,
1084 node = new ImplicitClosureNode(token_pos, 1080 implicit_closure_function,
1085 implicit_closure_function, 1081 receiver);
1086 receiver);
1087 } 1082 }
1088 return node;
1089 } 1083 }
1090 1084
1091 1085
1092 AstNode* Parser::ParseSuperFieldAccess(const String& field_name) { 1086 AstNode* Parser::ParseSuperFieldAccess(const String& field_name) {
1093 const intptr_t field_pos = token_index_; 1087 const intptr_t field_pos = token_index_;
1094 const Class& super_class = Class::Handle(current_class().SuperClass()); 1088 const Class& super_class = Class::Handle(current_class().SuperClass());
1095 if (super_class.IsNull()) { 1089 if (super_class.IsNull()) {
1096 ErrorMsg("class '%s' does not have a superclass", 1090 ErrorMsg("class '%s' does not have a superclass",
1097 String::Handle(current_class().Name()).ToCString()); 1091 String::Handle(current_class().Name()).ToCString());
1098 } 1092 }
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
1410 if (IsLiteral("class")) { 1404 if (IsLiteral("class")) {
1411 // Special case: implicit constructor. There is no source text to 1405 // Special case: implicit constructor. There is no source text to
1412 // parse. We just build the sequence node by hand. 1406 // parse. We just build the sequence node by hand.
1413 return MakeImplicitConstructor(func); 1407 return MakeImplicitConstructor(func);
1414 } 1408 }
1415 1409
1416 // Build local scope for function. 1410 // Build local scope for function.
1417 OpenFunctionBlock(func); 1411 OpenFunctionBlock(func);
1418 1412
1419 ParamList params; 1413 ParamList params;
1414 // Static functions do not have a receiver, except constructors, which are
1415 // passed the allocated but uninitialized instance to construct.
1416 // An instance closure may capture and access the receiver, but via the
1417 // context and not via the first formal parameter.
1420 // The first parameter of a factory is the TypeArguments vector of the type 1418 // The first parameter of a factory is the TypeArguments vector of the type
1421 // of the instance to be allocated. We name this hidden parameter 'this'. 1419 // of the instance to be allocated. We name this hidden parameter 'this'.
1422 const bool has_receiver = 1420 const bool has_receiver = !func.IsClosureFunction() &&
1423 !func.is_static() || func.IsConstructor() || func.IsFactory(); 1421 (!func.is_static() || func.IsConstructor() || func.IsFactory());
1424 const bool are_implicitly_final = func.is_const() && func.IsConstructor(); 1422 const bool are_implicitly_final = func.is_const() && func.IsConstructor();
1425 const bool allow_explicit_default_values = true; 1423 const bool allow_explicit_default_values = true;
1426 ASSERT(CurrentToken() == Token::kLPAREN); 1424 ASSERT(CurrentToken() == Token::kLPAREN);
1427 if (has_receiver) { 1425 if (has_receiver) {
1428 params.AddReceiver(token_index_); 1426 params.AddReceiver(token_index_);
1429 } 1427 }
1430 if (are_implicitly_final) { 1428 if (are_implicitly_final) {
1431 params.SetImplicitlyFinal(); 1429 params.SetImplicitlyFinal();
1432 } 1430 }
1433 ParseFormalParameterList(allow_explicit_default_values, &params); 1431 ParseFormalParameterList(allow_explicit_default_values, &params);
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
1533 if (initialized_check_needed) { 1531 if (initialized_check_needed) {
1534 CheckConstFieldsInitialized(cls); 1532 CheckConstFieldsInitialized(cls);
1535 } 1533 }
1536 } 1534 }
1537 1535
1538 if (current_block_->scope->function_level() > 0) { 1536 if (current_block_->scope->function_level() > 0) {
1539 // We are parsing, but not compiling, a local function. 1537 // We are parsing, but not compiling, a local function.
1540 // The instantiator may be required at run time for generic type checks or 1538 // The instantiator may be required at run time for generic type checks or
1541 // allocation of generic types. 1539 // allocation of generic types.
1542 if (current_class().IsParameterized() && 1540 if (current_class().IsParameterized() &&
1543 (!current_function().IsInStaticScope() || 1541 (!current_function().is_static() ||
1544 current_function().IsInFactoryScope())) { 1542 current_function().IsInFactoryScope())) {
1545 // Make sure that the receiver of the enclosing instance function 1543 // Make sure that the receiver of the enclosing instance function
1546 // (or implicit first parameter of an enclosing factory) is marked as 1544 // (or implicit first parameter of an enclosing factory) is marked as
1547 // captured if type checks are enabled, because they may access the 1545 // captured if type checks are enabled, because they may access the
1548 // receiver to instantiate types. 1546 // receiver to instantiate types.
1549 if (FLAG_enable_type_checks) { 1547 if (FLAG_enable_type_checks) {
1550 CaptureReceiver(); 1548 CaptureReceiver();
1551 } 1549 }
1552 } 1550 }
1553 } 1551 }
(...skipping 1589 matching lines...) Expand 10 before | Expand all | Expand 10 after
3143 // Side effect of lookup captures the receiver variable. 3141 // Side effect of lookup captures the receiver variable.
3144 LocalVariable* receiver = LookupReceiver(current_block_->scope, kTestOnly); 3142 LocalVariable* receiver = LookupReceiver(current_block_->scope, kTestOnly);
3145 ASSERT(receiver != NULL); 3143 ASSERT(receiver != NULL);
3146 } 3144 }
3147 3145
3148 3146
3149 AstNode* Parser::LoadReceiver(intptr_t token_pos) { 3147 AstNode* Parser::LoadReceiver(intptr_t token_pos) {
3150 // A nested function may access 'this', referring to the receiver of the 3148 // A nested function may access 'this', referring to the receiver of the
3151 // outermost enclosing function. 3149 // outermost enclosing function.
3152 // We should not be loading the receiver from a static scope. 3150 // We should not be loading the receiver from a static scope.
3153 ASSERT(!current_function().IsInStaticScope() || 3151 ASSERT(!current_function().is_static() ||
3154 current_function().IsInFactoryScope()); 3152 current_function().IsInFactoryScope());
3155 const bool kTestOnly = false; 3153 const bool kTestOnly = false;
3156 LocalVariable* receiver = LookupReceiver(current_block_->scope, kTestOnly); 3154 LocalVariable* receiver = LookupReceiver(current_block_->scope, kTestOnly);
3157 if (receiver == NULL) { 3155 if (receiver == NULL) {
3158 ErrorMsg(token_pos, "illegal access to 'this'"); 3156 ErrorMsg(token_pos, "illegal access to 'this'");
3159 } 3157 }
3160 return new LoadLocalNode(token_index_, *receiver); 3158 return new LoadLocalNode(token_index_, *receiver);
3161 } 3159 }
3162 3160
3163 3161
(...skipping 2210 matching lines...) Expand 10 before | Expand all | Expand 10 after
5374 AstNode* array = left; 5372 AstNode* array = left;
5375 if (left->IsPrimaryNode()) { 5373 if (left->IsPrimaryNode()) {
5376 PrimaryNode* primary = left->AsPrimaryNode(); 5374 PrimaryNode* primary = left->AsPrimaryNode();
5377 if (primary->primary().IsFunction()) { 5375 if (primary->primary().IsFunction()) {
5378 ErrorMsg(bracket_pos, "cannot apply index operator to function"); 5376 ErrorMsg(bracket_pos, "cannot apply index operator to function");
5379 } else if (primary->primary().IsClass()) { 5377 } else if (primary->primary().IsClass()) {
5380 ErrorMsg(bracket_pos, "cannot apply index operator to class"); 5378 ErrorMsg(bracket_pos, "cannot apply index operator to class");
5381 } else if (primary->primary().IsString()) { 5379 } else if (primary->primary().IsString()) {
5382 // Primary is an unresolved name. 5380 // Primary is an unresolved name.
5383 String& name = String::CheckedZoneHandle(primary->primary().raw()); 5381 String& name = String::CheckedZoneHandle(primary->primary().raw());
5384 if (current_function().IsInStaticScope()) { 5382 if (current_function().is_static()) {
5385 ErrorMsg(primary->token_index(), 5383 ErrorMsg(primary->token_index(),
5386 "identifier '%s' is not declared in this scope", 5384 "identifier '%s' is not declared in this scope",
5387 name.ToCString()); 5385 name.ToCString());
5388 } else { 5386 } else {
5389 // Treat as call to unresolved (instance) method. 5387 // Treat as call to unresolved (instance) method.
5390 AstNode* receiver = LoadReceiver(primary->token_index()); 5388 AstNode* receiver = LoadReceiver(primary->token_index());
5391 selector = ParseInstanceCall(receiver, name); 5389 selector = ParseInstanceCall(receiver, name);
5392 } 5390 }
5393 } else { 5391 } else {
5394 // Internal parser error. 5392 // Internal parser error.
5395 UNREACHABLE(); 5393 UNREACHABLE();
5396 } 5394 }
5397 } 5395 }
5398 selector = new LoadIndexedNode(bracket_pos, array, index); 5396 selector = new LoadIndexedNode(bracket_pos, array, index);
5399 } else if (CurrentToken() == Token::kLPAREN) { 5397 } else if (CurrentToken() == Token::kLPAREN) {
5400 if (left->IsPrimaryNode()) { 5398 if (left->IsPrimaryNode()) {
5401 PrimaryNode* primary = left->AsPrimaryNode(); 5399 PrimaryNode* primary = left->AsPrimaryNode();
5402 const intptr_t primary_pos = primary->token_index(); 5400 const intptr_t primary_pos = primary->token_index();
5403 if (primary->primary().IsFunction()) { 5401 if (primary->primary().IsFunction()) {
5404 Function& func = Function::CheckedHandle(primary->primary().raw()); 5402 Function& func = Function::CheckedHandle(primary->primary().raw());
5405 String& func_name = String::ZoneHandle(func.name()); 5403 String& func_name = String::ZoneHandle(func.name());
5406 if (func.is_static()) { 5404 if (func.is_static()) {
5407 // Parse static function call. 5405 // Parse static function call.
5408 Class& cls = Class::Handle(func.owner()); 5406 Class& cls = Class::Handle(func.owner());
5409 selector = ParseStaticCall(cls, func_name, primary_pos); 5407 selector = ParseStaticCall(cls, func_name, primary_pos);
5410 } else { 5408 } else {
5411 // Dynamic function call on implicit "this" parameter. 5409 // Dynamic function call on implicit "this" parameter.
5412 if (current_function().IsInStaticScope()) { 5410 if (current_function().is_static()) {
5413 ErrorMsg(primary_pos, 5411 ErrorMsg(primary_pos,
5414 "Cannot access instance method '%s' " 5412 "Cannot access instance method '%s' "
5415 "from static function", 5413 "from static function",
5416 func_name.ToCString()); 5414 func_name.ToCString());
5417 } 5415 }
5418 selector = ParseInstanceCall(LoadReceiver(primary_pos), func_name); 5416 selector = ParseInstanceCall(LoadReceiver(primary_pos), func_name);
5419 } 5417 }
5420 } else if (primary->primary().IsString()) { 5418 } else if (primary->primary().IsString()) {
5421 // Primary is an unresolved name. 5419 // Primary is an unresolved name.
5422 String& name = String::CheckedZoneHandle(primary->primary().raw()); 5420 String& name = String::CheckedZoneHandle(primary->primary().raw());
5423 if (current_function().IsInStaticScope()) { 5421 if (current_function().is_static()) {
5424 ErrorMsg(primary->token_index(), 5422 ErrorMsg(primary->token_index(),
5425 "identifier '%s' is not declared in this scope", 5423 "identifier '%s' is not declared in this scope",
5426 name.ToCString()); 5424 name.ToCString());
5427 } else { 5425 } else {
5428 // Treat as call to unresolved (instance) method. 5426 // Treat as call to unresolved (instance) method.
5429 AstNode* receiver = LoadReceiver(primary->token_index()); 5427 AstNode* receiver = LoadReceiver(primary->token_index());
5430 selector = ParseInstanceCall(receiver, name); 5428 selector = ParseInstanceCall(receiver, name);
5431 } 5429 }
5432 } else if (primary->primary().IsClass()) { 5430 } else if (primary->primary().IsClass()) {
5433 ErrorMsg(left->token_index(), 5431 ErrorMsg(left->token_index(),
(...skipping 13 matching lines...) Expand all
5447 if (left->AsPrimaryNode()->primary().IsString()) { 5445 if (left->AsPrimaryNode()->primary().IsString()) {
5448 PrimaryNode* primary = left->AsPrimaryNode(); 5446 PrimaryNode* primary = left->AsPrimaryNode();
5449 const String& ident = 5447 const String& ident =
5450 String::CheckedZoneHandle(primary->primary().raw()); 5448 String::CheckedZoneHandle(primary->primary().raw());
5451 // An unresolved identifier that is not followed by a selector token 5449 // An unresolved identifier that is not followed by a selector token
5452 // . or [ or (. 5450 // . or [ or (.
5453 // If we are in a static method, this is an error. 5451 // If we are in a static method, this is an error.
5454 // If we are compiling an instance method, convert this into 5452 // If we are compiling an instance method, convert this into
5455 // a runtime lookup for a field (which may be defined in a 5453 // a runtime lookup for a field (which may be defined in a
5456 // subclass.) 5454 // subclass.)
5457 if (current_function().IsInStaticScope()) { 5455 if (current_function().is_static()) {
5458 ErrorMsg(primary->token_index(), 5456 ErrorMsg(primary->token_index(),
5459 "identifier '%s' is not declared in this scope", 5457 "identifier '%s' is not declared in this scope",
5460 ident.ToCString()); 5458 ident.ToCString());
5461 } else { 5459 } else {
5462 // Treat as call to unresolved (instance) field. 5460 // Treat as call to unresolved (instance) field.
5463 AstNode* receiver = LoadReceiver(primary->token_index()); 5461 AstNode* receiver = LoadReceiver(primary->token_index());
5464 postfix_expr = ParseInstanceFieldAccess(receiver, ident); 5462 postfix_expr = ParseInstanceFieldAccess(receiver, ident);
5465 } 5463 }
5466 } else if (left->AsPrimaryNode()->primary().IsFunction()) { 5464 } else if (left->AsPrimaryNode()->primary().IsFunction()) {
5467 // Treat as implicit closure. 5465 // Treat as implicit closure.
5468 PrimaryNode* primary = left->AsPrimaryNode(); 5466 PrimaryNode* primary = left->AsPrimaryNode();
5469 const Function& func = 5467 const Function& func =
5470 Function::CheckedZoneHandle(primary->primary().raw()); 5468 Function::CheckedZoneHandle(primary->primary().raw());
5471 const String& funcname = String::ZoneHandle(func.name()); 5469 const String& funcname = String::ZoneHandle(func.name());
5472 if (func.is_static()) { 5470 if (func.is_static()) {
5473 // Static function access. 5471 // Static function access.
5474 postfix_expr = CreateImplicitClosureNode(func, 5472 postfix_expr = CreateImplicitClosureNode(func,
5475 primary->token_index(), 5473 primary->token_index(),
5476 NULL); 5474 NULL);
5477 } else { 5475 } else {
5478 // Instance function access. 5476 // Instance function access.
5479 if (current_function().IsInStaticScope() || 5477 if (current_function().is_static() ||
5480 current_function().IsInFactoryScope()) { 5478 current_function().IsInFactoryScope()) {
5481 ErrorMsg(primary->token_index(), 5479 ErrorMsg(primary->token_index(),
5482 "illegal use of method '%s'", 5480 "illegal use of method '%s'",
5483 funcname.ToCString()); 5481 funcname.ToCString());
5484 } 5482 }
5485 AstNode* receiver = LoadReceiver(primary->token_index()); 5483 AstNode* receiver = LoadReceiver(primary->token_index());
5486 postfix_expr = ParseInstanceFieldAccess(receiver, funcname); 5484 postfix_expr = ParseInstanceFieldAccess(receiver, funcname);
5487 } 5485 }
5488 } 5486 }
5489 } 5487 }
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
5596 // A found name is treated as accessed and possibly marked as captured. 5594 // A found name is treated as accessed and possibly marked as captured.
5597 const bool kTestOnly = false; 5595 const bool kTestOnly = false;
5598 return current_block_->scope->LookupVariable(ident, kTestOnly); 5596 return current_block_->scope->LookupVariable(ident, kTestOnly);
5599 } 5597 }
5600 5598
5601 5599
5602 void Parser::CheckInstanceFieldAccess(intptr_t field_pos, 5600 void Parser::CheckInstanceFieldAccess(intptr_t field_pos,
5603 const String& field_name) { 5601 const String& field_name) {
5604 // Fields are not accessible from a static function, except from a 5602 // Fields are not accessible from a static function, except from a
5605 // constructor, which is considered as non-static by the compiler. 5603 // constructor, which is considered as non-static by the compiler.
5606 if (current_function().IsInStaticScope()) { 5604 if (current_function().is_static()) {
5607 ErrorMsg(field_pos, 5605 ErrorMsg(field_pos,
5608 "cannot access instance field '%s' from a static function", 5606 "cannot access instance field '%s' from a static function",
5609 field_name.ToCString()); 5607 field_name.ToCString());
5610 } 5608 }
5611 } 5609 }
5612 5610
5613 5611
5614 void Parser::CheckTypeParameterReference(intptr_t type_parameter_pos, 5612 void Parser::CheckTypeParameterReference(intptr_t type_parameter_pos,
5615 const String& type_parameter_name) { 5613 const String& type_parameter_name) {
5616 // Type parameters cannot be referred to from a static function, except from 5614 // Type parameters cannot be referred to from a static function, except from
5617 // a constructor or from a factory. 5615 // a constructor or from a factory.
5618 // A constructor is considered as non-static by the compiler. 5616 // A constructor is considered as non-static by the compiler.
5619 if ((is_top_level_ && 5617 if ((is_top_level_ &&
5620 (current_member_ != NULL) && 5618 (current_member_ != NULL) &&
5621 current_member_->has_static && 5619 current_member_->has_static &&
5622 !current_member_->has_factory) || 5620 !current_member_->has_factory) ||
5623 (!current_function().IsNull() && 5621 (!current_function().IsNull() &&
5624 current_function().IsInStaticScope() && 5622 current_function().is_static() &&
5625 !current_function().IsInFactoryScope())) { 5623 !current_function().IsInFactoryScope())) {
5626 ErrorMsg(type_parameter_pos, 5624 ErrorMsg(type_parameter_pos,
5627 "cannot refer to type parameter '%s' from a static function", 5625 "cannot refer to type parameter '%s' from a static function",
5628 type_parameter_name.ToCString()); 5626 type_parameter_name.ToCString());
5629 } 5627 }
5630 } 5628 }
5631 5629
5632 5630
5633 void Parser::RunStaticFieldInitializer(const Field& field) { 5631 void Parser::RunStaticFieldInitializer(const Field& field) {
5634 ASSERT(field.is_static()); 5632 ASSERT(field.is_static());
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
5921 qual_ident, 5919 qual_ident,
5922 kResolveIncludingImports); 5920 kResolveIncludingImports);
5923 } 5921 }
5924 if (var_or_field->IsPrimaryNode()) { 5922 if (var_or_field->IsPrimaryNode()) {
5925 PrimaryNode* primary = var_or_field->AsPrimaryNode(); 5923 PrimaryNode* primary = var_or_field->AsPrimaryNode();
5926 if (primary->primary().IsString()) { 5924 if (primary->primary().IsString()) {
5927 // We got an unresolved name. If we are compiling a static 5925 // We got an unresolved name. If we are compiling a static
5928 // method, this is an error. In an instance method, we convert 5926 // method, this is an error. In an instance method, we convert
5929 // the unresolved name to an instance field access, since a 5927 // the unresolved name to an instance field access, since a
5930 // subclass might define a field with this name. 5928 // subclass might define a field with this name.
5931 if (current_function().IsInStaticScope()) { 5929 if (current_function().is_static()) {
5932 ErrorMsg(ident_pos, "identifier '%s' is not declared in this scope", 5930 ErrorMsg(ident_pos, "identifier '%s' is not declared in this scope",
5933 ident.ToCString()); 5931 ident.ToCString());
5934 } else { 5932 } else {
5935 // Treat as call to unresolved instance field. 5933 // Treat as call to unresolved instance field.
5936 var_or_field = CallGetter(ident_pos, LoadReceiver(ident_pos), ident); 5934 var_or_field = CallGetter(ident_pos, LoadReceiver(ident_pos), ident);
5937 } 5935 }
5938 } else if (primary->primary().IsFunction()) { 5936 } else if (primary->primary().IsFunction()) {
5939 ErrorMsg(ident_pos, "illegal reference to method '%s'", 5937 ErrorMsg(ident_pos, "illegal reference to method '%s'",
5940 ident.ToCString()); 5938 ident.ToCString());
5941 } else { 5939 } else {
(...skipping 702 matching lines...) Expand 10 before | Expand all | Expand 10 after
6644 primary = ParseCompoundLiteral(); 6642 primary = ParseCompoundLiteral();
6645 } else { 6643 } else {
6646 primary = ParseNewOperator(); 6644 primary = ParseNewOperator();
6647 } 6645 }
6648 } else if (CurrentToken() == Token::kLT || 6646 } else if (CurrentToken() == Token::kLT ||
6649 CurrentToken() == Token::kLBRACK || 6647 CurrentToken() == Token::kLBRACK ||
6650 CurrentToken() == Token::kINDEX || 6648 CurrentToken() == Token::kINDEX ||
6651 CurrentToken() == Token::kLBRACE) { 6649 CurrentToken() == Token::kLBRACE) {
6652 primary = ParseCompoundLiteral(); 6650 primary = ParseCompoundLiteral();
6653 } else if (CurrentToken() == Token::kSUPER) { 6651 } else if (CurrentToken() == Token::kSUPER) {
6654 if (current_function().IsInStaticScope()) { 6652 if (current_function().is_static()) {
6655 ErrorMsg("cannot access superclass from static method"); 6653 ErrorMsg("cannot access superclass from static method");
6656 } else if (current_function().IsLocalFunction()) { 6654 } else if (current_function().IsLocalFunction()) {
6657 ErrorMsg("cannot access superclass from local function"); 6655 ErrorMsg("cannot access superclass from local function");
6658 } 6656 }
6659 ConsumeToken(); 6657 ConsumeToken();
6660 if (CurrentToken() == Token::kPERIOD) { 6658 if (CurrentToken() == Token::kPERIOD) {
6661 ConsumeToken(); 6659 ConsumeToken();
6662 const String& ident = *ExpectIdentifier("identifier expected"); 6660 const String& ident = *ExpectIdentifier("identifier expected");
6663 if (CurrentToken() == Token::kLPAREN) { 6661 if (CurrentToken() == Token::kLPAREN) {
6664 primary = ParseSuperCall(ident); 6662 primary = ParseSuperCall(ident);
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
6929 } 6927 }
6930 6928
6931 6929
6932 void Parser::SkipNestedExpr() { 6930 void Parser::SkipNestedExpr() {
6933 const bool saved_mode = SetAllowFunctionLiterals(true); 6931 const bool saved_mode = SetAllowFunctionLiterals(true);
6934 SkipExpr(); 6932 SkipExpr();
6935 SetAllowFunctionLiterals(saved_mode); 6933 SetAllowFunctionLiterals(saved_mode);
6936 } 6934 }
6937 6935
6938 } // namespace dart 6936 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.cc ('k') | runtime/vm/stub_code.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698