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

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

Issue 1412633007: Save the native name on the function instead of finding it in the token stream for lazily-linked na… (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 1 month 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/object.cc ('k') | runtime/vm/raw_object.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) 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 3807 matching lines...) Expand 10 before | Expand all | Expand 10 after
3818 RawFunction::AsyncModifier async_modifier = ParseFunctionModifier(); 3818 RawFunction::AsyncModifier async_modifier = ParseFunctionModifier();
3819 if ((method->IsFactoryOrConstructor() || method->IsSetter()) && 3819 if ((method->IsFactoryOrConstructor() || method->IsSetter()) &&
3820 (async_modifier != RawFunction::kNoModifier)) { 3820 (async_modifier != RawFunction::kNoModifier)) {
3821 ReportError(modifier_pos, 3821 ReportError(modifier_pos,
3822 "%s '%s' may not be async, async* or sync*", 3822 "%s '%s' may not be async, async* or sync*",
3823 (method->IsSetter()) ? "setter" : "constructor", 3823 (method->IsSetter()) ? "setter" : "constructor",
3824 method->name->ToCString()); 3824 method->name->ToCString());
3825 } 3825 }
3826 3826
3827 intptr_t method_end_pos = TokenPos(); 3827 intptr_t method_end_pos = TokenPos();
3828 String* native_name = NULL;
3828 if ((CurrentToken() == Token::kLBRACE) || 3829 if ((CurrentToken() == Token::kLBRACE) ||
3829 (CurrentToken() == Token::kARROW)) { 3830 (CurrentToken() == Token::kARROW)) {
3830 if (method->has_abstract) { 3831 if (method->has_abstract) {
3831 ReportError(TokenPos(), 3832 ReportError(TokenPos(),
3832 "abstract method '%s' may not have a function body", 3833 "abstract method '%s' may not have a function body",
3833 method->name->ToCString()); 3834 method->name->ToCString());
3834 } else if (method->has_external) { 3835 } else if (method->has_external) {
3835 ReportError(TokenPos(), 3836 ReportError(TokenPos(),
3836 "external %s '%s' may not have a function body", 3837 "external %s '%s' may not have a function body",
3837 method->IsFactoryOrConstructor() ? "constructor" : "method", 3838 method->IsFactoryOrConstructor() ? "constructor" : "method",
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
3873 method->name->ToCString()); 3874 method->name->ToCString());
3874 } else if (method->IsConstructor() && method->has_const) { 3875 } else if (method->IsConstructor() && method->has_const) {
3875 ReportError(method->name_pos, 3876 ReportError(method->name_pos,
3876 "const constructor '%s' may not be native", 3877 "const constructor '%s' may not be native",
3877 method->name->ToCString()); 3878 method->name->ToCString());
3878 } 3879 }
3879 if (method->redirect_name != NULL) { 3880 if (method->redirect_name != NULL) {
3880 ReportError(method->name_pos, 3881 ReportError(method->name_pos,
3881 "Constructor with redirection may not have a function body"); 3882 "Constructor with redirection may not have a function body");
3882 } 3883 }
3883 ParseNativeDeclaration(); 3884 native_name = &ParseNativeDeclaration();
3884 method_end_pos = TokenPos(); 3885 method_end_pos = TokenPos();
3885 ExpectSemicolon(); 3886 ExpectSemicolon();
3886 method->has_native = true; 3887 method->has_native = true;
3887 } else { 3888 } else {
3888 // We haven't found a method body. Issue error if one is required. 3889 // We haven't found a method body. Issue error if one is required.
3889 const bool must_have_body = 3890 const bool must_have_body =
3890 method->has_static && 3891 method->has_static &&
3891 !method->has_external && 3892 !method->has_external &&
3892 redirection_type.IsNull(); 3893 redirection_type.IsNull();
3893 if (must_have_body) { 3894 if (must_have_body) {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
3951 func.set_result_type(*method->type); 3952 func.set_result_type(*method->type);
3952 func.set_end_token_pos(method_end_pos); 3953 func.set_end_token_pos(method_end_pos);
3953 func.set_is_redirecting(is_redirecting); 3954 func.set_is_redirecting(is_redirecting);
3954 func.set_modifier(async_modifier); 3955 func.set_modifier(async_modifier);
3955 if (library_.is_dart_scheme() && library_.IsPrivate(*method->name)) { 3956 if (library_.is_dart_scheme() && library_.IsPrivate(*method->name)) {
3956 func.set_is_reflectable(false); 3957 func.set_is_reflectable(false);
3957 } 3958 }
3958 if (method->metadata_pos > 0) { 3959 if (method->metadata_pos > 0) {
3959 library_.AddFunctionMetadata(func, method->metadata_pos); 3960 library_.AddFunctionMetadata(func, method->metadata_pos);
3960 } 3961 }
3962 if (method->has_native) {
3963 func.set_native_name(*native_name);
3964 }
3961 3965
3962 // If this method is a redirecting factory, set the redirection information. 3966 // If this method is a redirecting factory, set the redirection information.
3963 if (!redirection_type.IsNull()) { 3967 if (!redirection_type.IsNull()) {
3964 ASSERT(func.IsFactory()); 3968 ASSERT(func.IsFactory());
3965 func.SetRedirectionType(redirection_type); 3969 func.SetRedirectionType(redirection_type);
3966 if (!redirection_identifier.IsNull()) { 3970 if (!redirection_identifier.IsNull()) {
3967 func.SetRedirectionIdentifier(redirection_identifier); 3971 func.SetRedirectionIdentifier(redirection_identifier);
3968 } 3972 }
3969 } 3973 }
3970 3974
(...skipping 1606 matching lines...) Expand 10 before | Expand all | Expand 10 after
5577 const intptr_t function_pos = TokenPos(); 5581 const intptr_t function_pos = TokenPos();
5578 ParamList params; 5582 ParamList params;
5579 const bool allow_explicit_default_values = true; 5583 const bool allow_explicit_default_values = true;
5580 ParseFormalParameterList(allow_explicit_default_values, false, &params); 5584 ParseFormalParameterList(allow_explicit_default_values, false, &params);
5581 5585
5582 const intptr_t modifier_pos = TokenPos(); 5586 const intptr_t modifier_pos = TokenPos();
5583 RawFunction::AsyncModifier func_modifier = ParseFunctionModifier(); 5587 RawFunction::AsyncModifier func_modifier = ParseFunctionModifier();
5584 5588
5585 intptr_t function_end_pos = function_pos; 5589 intptr_t function_end_pos = function_pos;
5586 bool is_native = false; 5590 bool is_native = false;
5591 String* native_name = NULL;
5587 if (is_external) { 5592 if (is_external) {
5588 function_end_pos = TokenPos(); 5593 function_end_pos = TokenPos();
5589 ExpectSemicolon(); 5594 ExpectSemicolon();
5590 } else if (CurrentToken() == Token::kLBRACE) { 5595 } else if (CurrentToken() == Token::kLBRACE) {
5591 SkipBlock(); 5596 SkipBlock();
5592 function_end_pos = TokenPos(); 5597 function_end_pos = TokenPos();
5593 ExpectToken(Token::kRBRACE); 5598 ExpectToken(Token::kRBRACE);
5594 } else if (CurrentToken() == Token::kARROW) { 5599 } else if (CurrentToken() == Token::kARROW) {
5595 if ((func_modifier & RawFunction::kGeneratorBit) != 0) { 5600 if ((func_modifier & RawFunction::kGeneratorBit) != 0) {
5596 ReportError(modifier_pos, 5601 ReportError(modifier_pos,
5597 "=> style function may not be sync* or async* generator"); 5602 "=> style function may not be sync* or async* generator");
5598 } 5603 }
5599 ConsumeToken(); 5604 ConsumeToken();
5600 BoolScope allow_await(&this->await_is_keyword_, 5605 BoolScope allow_await(&this->await_is_keyword_,
5601 func_modifier != RawFunction::kNoModifier); 5606 func_modifier != RawFunction::kNoModifier);
5602 SkipExpr(); 5607 SkipExpr();
5603 function_end_pos = TokenPos(); 5608 function_end_pos = TokenPos();
5604 ExpectSemicolon(); 5609 ExpectSemicolon();
5605 } else if (IsSymbol(Symbols::Native())) { 5610 } else if (IsSymbol(Symbols::Native())) {
5606 ParseNativeDeclaration(); 5611 native_name = &ParseNativeDeclaration();
5607 function_end_pos = TokenPos(); 5612 function_end_pos = TokenPos();
5608 ExpectSemicolon(); 5613 ExpectSemicolon();
5609 is_native = true; 5614 is_native = true;
5610 } else { 5615 } else {
5611 ReportError("function block expected"); 5616 ReportError("function block expected");
5612 } 5617 }
5613 Function& func = Function::Handle(Z, 5618 Function& func = Function::Handle(Z,
5614 Function::New(func_name, 5619 Function::New(func_name,
5615 RawFunction::kRegularFunction, 5620 RawFunction::kRegularFunction,
5616 is_static, 5621 is_static,
5617 /* is_const = */ false, 5622 /* is_const = */ false,
5618 /* is_abstract = */ false, 5623 /* is_abstract = */ false,
5619 is_external, 5624 is_external,
5620 is_native, 5625 is_native,
5621 current_class(), 5626 current_class(),
5622 decl_begin_pos)); 5627 decl_begin_pos));
5623 func.set_result_type(result_type); 5628 func.set_result_type(result_type);
5624 func.set_end_token_pos(function_end_pos); 5629 func.set_end_token_pos(function_end_pos);
5625 func.set_modifier(func_modifier); 5630 func.set_modifier(func_modifier);
5626 if (library_.is_dart_scheme() && library_.IsPrivate(func_name)) { 5631 if (library_.is_dart_scheme() && library_.IsPrivate(func_name)) {
5627 func.set_is_reflectable(false); 5632 func.set_is_reflectable(false);
5628 } 5633 }
5634 if (is_native) {
5635 func.set_native_name(*native_name);
5636 }
5629 AddFormalParamsToFunction(&params, func); 5637 AddFormalParamsToFunction(&params, func);
5630 top_level->AddFunction(func); 5638 top_level->AddFunction(func);
5631 if (!is_patch) { 5639 if (!is_patch) {
5632 library_.AddObject(func, func_name); 5640 library_.AddObject(func, func_name);
5633 } else { 5641 } else {
5634 library_.ReplaceObject(func, func_name); 5642 library_.ReplaceObject(func, func_name);
5635 } 5643 }
5636 if (metadata_pos >= 0) { 5644 if (metadata_pos >= 0) {
5637 library_.AddFunctionMetadata(func, metadata_pos); 5645 library_.AddFunctionMetadata(func, metadata_pos);
5638 } 5646 }
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
5727 5735
5728 const intptr_t modifier_pos = TokenPos(); 5736 const intptr_t modifier_pos = TokenPos();
5729 RawFunction::AsyncModifier func_modifier = ParseFunctionModifier(); 5737 RawFunction::AsyncModifier func_modifier = ParseFunctionModifier();
5730 if (!is_getter && (func_modifier != RawFunction::kNoModifier)) { 5738 if (!is_getter && (func_modifier != RawFunction::kNoModifier)) {
5731 ReportError(modifier_pos, 5739 ReportError(modifier_pos,
5732 "setter function cannot be async, async* or sync*"); 5740 "setter function cannot be async, async* or sync*");
5733 } 5741 }
5734 5742
5735 intptr_t accessor_end_pos = accessor_pos; 5743 intptr_t accessor_end_pos = accessor_pos;
5736 bool is_native = false; 5744 bool is_native = false;
5745 String* native_name = NULL;
5737 if (is_external) { 5746 if (is_external) {
5738 accessor_end_pos = TokenPos(); 5747 accessor_end_pos = TokenPos();
5739 ExpectSemicolon(); 5748 ExpectSemicolon();
5740 } else if (CurrentToken() == Token::kLBRACE) { 5749 } else if (CurrentToken() == Token::kLBRACE) {
5741 SkipBlock(); 5750 SkipBlock();
5742 accessor_end_pos = TokenPos(); 5751 accessor_end_pos = TokenPos();
5743 ExpectToken(Token::kRBRACE); 5752 ExpectToken(Token::kRBRACE);
5744 } else if (CurrentToken() == Token::kARROW) { 5753 } else if (CurrentToken() == Token::kARROW) {
5745 if (is_getter && ((func_modifier & RawFunction::kGeneratorBit) != 0)) { 5754 if (is_getter && ((func_modifier & RawFunction::kGeneratorBit) != 0)) {
5746 ReportError(modifier_pos, 5755 ReportError(modifier_pos,
5747 "=> style getter may not be sync* or async* generator"); 5756 "=> style getter may not be sync* or async* generator");
5748 } 5757 }
5749 ConsumeToken(); 5758 ConsumeToken();
5750 BoolScope allow_await(&this->await_is_keyword_, 5759 BoolScope allow_await(&this->await_is_keyword_,
5751 func_modifier != RawFunction::kNoModifier); 5760 func_modifier != RawFunction::kNoModifier);
5752 SkipExpr(); 5761 SkipExpr();
5753 accessor_end_pos = TokenPos(); 5762 accessor_end_pos = TokenPos();
5754 ExpectSemicolon(); 5763 ExpectSemicolon();
5755 } else if (IsSymbol(Symbols::Native())) { 5764 } else if (IsSymbol(Symbols::Native())) {
5756 ParseNativeDeclaration(); 5765 native_name = &ParseNativeDeclaration();
5757 accessor_end_pos = TokenPos(); 5766 accessor_end_pos = TokenPos();
5758 ExpectSemicolon(); 5767 ExpectSemicolon();
5759 is_native = true; 5768 is_native = true;
5760 } else { 5769 } else {
5761 ReportError("function block expected"); 5770 ReportError("function block expected");
5762 } 5771 }
5763 Function& func = Function::Handle(Z, 5772 Function& func = Function::Handle(Z,
5764 Function::New(accessor_name, 5773 Function::New(accessor_name,
5765 is_getter ? RawFunction::kGetterFunction : 5774 is_getter ? RawFunction::kGetterFunction :
5766 RawFunction::kSetterFunction, 5775 RawFunction::kSetterFunction,
5767 is_static, 5776 is_static,
5768 /* is_const = */ false, 5777 /* is_const = */ false,
5769 /* is_abstract = */ false, 5778 /* is_abstract = */ false,
5770 is_external, 5779 is_external,
5771 is_native, 5780 is_native,
5772 current_class(), 5781 current_class(),
5773 decl_begin_pos)); 5782 decl_begin_pos));
5774 func.set_result_type(result_type); 5783 func.set_result_type(result_type);
5775 func.set_end_token_pos(accessor_end_pos); 5784 func.set_end_token_pos(accessor_end_pos);
5776 func.set_modifier(func_modifier); 5785 func.set_modifier(func_modifier);
5777 if (is_native) { 5786 if (is_native) {
5778 func.set_is_debuggable(false); 5787 func.set_is_debuggable(false);
5788 func.set_native_name(*native_name);
5779 } 5789 }
5780 if (library_.is_dart_scheme() && library_.IsPrivate(accessor_name)) { 5790 if (library_.is_dart_scheme() && library_.IsPrivate(accessor_name)) {
5781 func.set_is_reflectable(false); 5791 func.set_is_reflectable(false);
5782 } 5792 }
5783 AddFormalParamsToFunction(&params, func); 5793 AddFormalParamsToFunction(&params, func);
5784 top_level->AddFunction(func); 5794 top_level->AddFunction(func);
5785 if (!is_patch) { 5795 if (!is_patch) {
5786 library_.AddObject(func, accessor_name); 5796 library_.AddObject(func, accessor_name);
5787 } else { 5797 } else {
5788 library_.ReplaceObject(func, accessor_name); 5798 library_.ReplaceObject(func, accessor_name);
(...skipping 8543 matching lines...) Expand 10 before | Expand all | Expand 10 after
14332 void Parser::SkipQualIdent() { 14342 void Parser::SkipQualIdent() {
14333 ASSERT(IsIdentifier()); 14343 ASSERT(IsIdentifier());
14334 ConsumeToken(); 14344 ConsumeToken();
14335 if (CurrentToken() == Token::kPERIOD) { 14345 if (CurrentToken() == Token::kPERIOD) {
14336 ConsumeToken(); // Consume the kPERIOD token. 14346 ConsumeToken(); // Consume the kPERIOD token.
14337 ExpectIdentifier("identifier expected after '.'"); 14347 ExpectIdentifier("identifier expected after '.'");
14338 } 14348 }
14339 } 14349 }
14340 14350
14341 } // namespace dart 14351 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.cc ('k') | runtime/vm/raw_object.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698