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

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

Issue 1410383020: Eliminate all but one top-level class per library. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Address review comments Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/parser.h" 5 #include "vm/parser.h"
6 #include "vm/flags.h" 6 #include "vm/flags.h"
7 7
8 #ifndef DART_PRECOMPILED 8 #ifndef DART_PRECOMPILED
9 9
10 #include "lib/invocation_mirror.h" 10 #include "lib/invocation_mirror.h"
(...skipping 989 matching lines...) Expand 10 before | Expand all | Expand 10 after
1000 instantiator = parser.LookupReceiver(node_sequence->scope(), kTestOnly); 1000 instantiator = parser.LookupReceiver(node_sequence->scope(), kTestOnly);
1001 } 1001 }
1002 if (!parser.current_function().IsLocalFunction() || 1002 if (!parser.current_function().IsLocalFunction() ||
1003 ((instantiator != NULL) && instantiator->is_captured())) { 1003 ((instantiator != NULL) && instantiator->is_captured())) {
1004 parsed_function->set_instantiator(instantiator); 1004 parsed_function->set_instantiator(instantiator);
1005 } 1005 }
1006 } 1006 }
1007 } 1007 }
1008 1008
1009 1009
1010 RawObject* Parser::ParseMetadata(const Class& cls, intptr_t token_pos) { 1010 RawObject* Parser::ParseMetadata(const Field& meta_data) {
1011 Thread* thread = Thread::Current(); 1011 Thread* thread = Thread::Current();
1012 Isolate* isolate = thread->isolate(); 1012 Isolate* isolate = thread->isolate();
1013 StackZone stack_zone(thread); 1013 StackZone stack_zone(thread);
1014 Zone* zone = stack_zone.GetZone(); 1014 Zone* zone = stack_zone.GetZone();
1015 LongJumpScope jump; 1015 LongJumpScope jump;
1016
1017 const Class& owner_class = Class::Handle(zone, meta_data.owner());
1018 const Script& script = Script::Handle(zone, meta_data.script());
1019 const intptr_t token_pos = meta_data.token_pos();
1020
1016 if (setjmp(*jump.Set()) == 0) { 1021 if (setjmp(*jump.Set()) == 0) {
1017 const Script& script = Script::Handle(zone, cls.script());
1018 // Parsing metadata can involve following paths in the parser that are 1022 // Parsing metadata can involve following paths in the parser that are
1019 // normally used for expressions and assume current_function is non-null, 1023 // normally used for expressions and assume current_function is non-null,
1020 // so we create a fake function to use as the current_function rather than 1024 // so we create a fake function to use as the current_function rather than
1021 // scattering special cases throughout the parser. 1025 // scattering special cases throughout the parser.
1022 const Function& fake_function = Function::ZoneHandle(zone, Function::New( 1026 const Function& fake_function = Function::ZoneHandle(zone, Function::New(
1023 Symbols::At(), 1027 Symbols::At(),
1024 RawFunction::kRegularFunction, 1028 RawFunction::kRegularFunction,
1025 true, // is_static 1029 true, // is_static
1026 false, // is_const 1030 false, // is_const
1027 false, // is_abstract 1031 false, // is_abstract
1028 false, // is_external 1032 false, // is_external
1029 false, // is_native 1033 false, // is_native
1030 cls, 1034 Object::Handle(zone, meta_data.RawOwner()),
1031 token_pos)); 1035 token_pos));
1032 fake_function.set_is_debuggable(false); 1036 fake_function.set_is_debuggable(false);
1033 ParsedFunction* parsed_function = 1037 ParsedFunction* parsed_function =
1034 new ParsedFunction(thread, fake_function); 1038 new ParsedFunction(thread, fake_function);
1035 Parser parser(script, parsed_function, token_pos); 1039 Parser parser(script, parsed_function, token_pos);
1036 parser.set_current_class(cls); 1040 parser.set_current_class(owner_class);
1037 1041
1038 RawObject* metadata = parser.EvaluateMetadata(); 1042 RawObject* metadata = parser.EvaluateMetadata();
1039 return metadata; 1043 return metadata;
1040 } else { 1044 } else {
1041 Error& error = Error::Handle(zone); 1045 Error& error = Error::Handle(zone);
1042 error = isolate->object_store()->sticky_error(); 1046 error = isolate->object_store()->sticky_error();
1043 isolate->object_store()->clear_sticky_error(); 1047 isolate->object_store()->clear_sticky_error();
1044 return error.raw(); 1048 return error.raw();
1045 } 1049 }
1046 UNREACHABLE(); 1050 UNREACHABLE();
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
1138 return CloseBlock(); 1142 return CloseBlock();
1139 } 1143 }
1140 1144
1141 1145
1142 ParsedFunction* Parser::ParseStaticFieldInitializer(const Field& field) { 1146 ParsedFunction* Parser::ParseStaticFieldInitializer(const Field& field) {
1143 ASSERT(field.is_static()); 1147 ASSERT(field.is_static());
1144 Thread* thread = Thread::Current(); 1148 Thread* thread = Thread::Current();
1145 // TODO(koda): Should there be a StackZone here? 1149 // TODO(koda): Should there be a StackZone here?
1146 Zone* zone = thread->zone(); 1150 Zone* zone = thread->zone();
1147 1151
1148 const Class& script_cls = Class::Handle(zone, field.origin());
1149 const Script& script = Script::Handle(zone, script_cls.script());
1150
1151 const String& field_name = String::Handle(zone, field.name()); 1152 const String& field_name = String::Handle(zone, field.name());
1152 String& init_name = String::Handle(zone, 1153 String& init_name = String::Handle(zone,
1153 Symbols::FromConcat(Symbols::InitPrefix(), field_name)); 1154 Symbols::FromConcat(Symbols::InitPrefix(), field_name));
1154 1155
1156 const Script& script = Script::Handle(zone, field.script());
1155 Object& initializer_owner = Object::Handle(field.owner()); 1157 Object& initializer_owner = Object::Handle(field.owner());
1156 if (field.owner() != field.origin()) { 1158 initializer_owner =
1157 initializer_owner = 1159 PatchClass::New(Class::Handle(field.owner()), script);
1158 PatchClass::New(Class::Handle(field.owner()), script_cls);
1159 }
1160 1160
1161 const Function& initializer = Function::ZoneHandle(zone, 1161 const Function& initializer = Function::ZoneHandle(zone,
1162 Function::New(init_name, 1162 Function::New(init_name,
1163 RawFunction::kImplicitStaticFinalGetter, 1163 RawFunction::kImplicitStaticFinalGetter,
1164 true, // static 1164 true, // static
1165 false, // !const 1165 false, // !const
1166 false, // !abstract 1166 false, // !abstract
1167 false, // !external 1167 false, // !external
1168 false, // !native 1168 false, // !native
1169 initializer_owner, 1169 initializer_owner,
(...skipping 670 matching lines...) Expand 10 before | Expand all | Expand 10 after
1840 1840
1841 // Add implicit closure object parameter. 1841 // Add implicit closure object parameter.
1842 func_params.AddFinalParameter( 1842 func_params.AddFinalParameter(
1843 TokenPos(), 1843 TokenPos(),
1844 &Symbols::ClosureParameter(), 1844 &Symbols::ClosureParameter(),
1845 &Type::ZoneHandle(Z, Type::DynamicType())); 1845 &Type::ZoneHandle(Z, Type::DynamicType()));
1846 1846
1847 const bool no_explicit_default_values = false; 1847 const bool no_explicit_default_values = false;
1848 ParseFormalParameterList(no_explicit_default_values, false, &func_params); 1848 ParseFormalParameterList(no_explicit_default_values, false, &func_params);
1849 1849
1850 // In top-level and mixin functions, the source may be in a different
1851 // script than the script of the current class.
1852 Object& sig_func_owner = Object::Handle(Z, current_class().raw());
1853 if (current_class().script() != script_.raw()) {
1854 sig_func_owner = PatchClass::New(current_class(), script_);
Ivan Posva 2015/11/30 23:54:26 If the current_class().script and script_.raw() ar
hausner 2015/12/01 19:38:17 Yes. But unless I add the RawOwner to the Parser c
1855 }
1856
1850 // The field 'is_static' has no meaning for signature functions. 1857 // The field 'is_static' has no meaning for signature functions.
1851 const Function& signature_function = Function::Handle(Z, 1858 const Function& signature_function = Function::Handle(Z,
1852 Function::New(*parameter.name, 1859 Function::New(*parameter.name,
1853 RawFunction::kSignatureFunction, 1860 RawFunction::kSignatureFunction,
1854 /* is_static = */ false, 1861 /* is_static = */ false,
1855 /* is_const = */ false, 1862 /* is_const = */ false,
1856 /* is_abstract = */ false, 1863 /* is_abstract = */ false,
1857 /* is_external = */ false, 1864 /* is_external = */ false,
1858 /* is_native = */ false, 1865 /* is_native = */ false,
1859 current_class(), 1866 sig_func_owner,
1860 parameter.name_pos)); 1867 parameter.name_pos));
1861 signature_function.set_result_type(result_type); 1868 signature_function.set_result_type(result_type);
1862 signature_function.set_is_debuggable(false); 1869 signature_function.set_is_debuggable(false);
1863 AddFormalParamsToFunction(&func_params, signature_function); 1870 AddFormalParamsToFunction(&func_params, signature_function);
1864 const String& signature = String::Handle(Z, 1871 const String& signature =
1865 signature_function.Signature()); 1872 String::Handle(Z, signature_function.Signature());
1866 // Lookup the signature class, i.e. the class whose name is the signature. 1873 // Lookup the signature class, i.e. the class whose name is the signature.
1867 // We only lookup in the current library, but not in its imports, and only 1874 // We only lookup in the current library, but not in its imports, and only
1868 // create a new canonical signature class if it does not exist yet. 1875 // create a new canonical signature class if it does not exist yet.
1869 Class& signature_class = Class::ZoneHandle(Z, 1876 Class& signature_class =
1870 library_.LookupLocalClass(signature)); 1877 Class::ZoneHandle(Z, library_.LookupLocalClass(signature));
1871 if (signature_class.IsNull()) { 1878 if (signature_class.IsNull()) {
1872 signature_class = Class::NewSignatureClass(signature, 1879 signature_class = Class::NewSignatureClass(signature,
1873 signature_function, 1880 signature_function,
1874 script_, 1881 script_,
1875 parameter.name_pos); 1882 parameter.name_pos);
1876 // Record the function signature class in the current library, unless 1883 // Record the function signature class in the current library, unless
1877 // we are currently skipping a formal parameter list, in which case 1884 // we are currently skipping a formal parameter list, in which case
1878 // the signature class could remain unfinalized. 1885 // the signature class could remain unfinalized.
1879 if (!params->skipped) { 1886 if (!params->skipped) {
1880 library_.AddClass(signature_class); 1887 library_.AddClass(signature_class);
(...skipping 2526 matching lines...) Expand 10 before | Expand all | Expand 10 after
4407 } else { 4414 } else {
4408 UnexpectedToken(); 4415 UnexpectedToken();
4409 } 4416 }
4410 current_member_ = NULL; 4417 current_member_ = NULL;
4411 CheckMemberNameConflict(members, &member); 4418 CheckMemberNameConflict(members, &member);
4412 members->AddMember(member); 4419 members->AddMember(member);
4413 } 4420 }
4414 4421
4415 4422
4416 void Parser::ParseEnumDeclaration(const GrowableObjectArray& pending_classes, 4423 void Parser::ParseEnumDeclaration(const GrowableObjectArray& pending_classes,
4417 const Class& toplevel_class, 4424 const PatchClass& tl_owner,
4418 intptr_t metadata_pos) { 4425 intptr_t metadata_pos) {
4419 TRACE_PARSER("ParseEnumDeclaration"); 4426 TRACE_PARSER("ParseEnumDeclaration");
4420 const intptr_t declaration_pos = (metadata_pos > 0) ? metadata_pos 4427 const intptr_t declaration_pos = (metadata_pos > 0) ? metadata_pos
4421 : TokenPos(); 4428 : TokenPos();
4422 ConsumeToken(); 4429 ConsumeToken();
4423 const intptr_t name_pos = TokenPos(); 4430 const intptr_t name_pos = TokenPos();
4424 String* enum_name = 4431 String* enum_name =
4425 ExpectUserDefinedTypeIdentifier("enum type name expected"); 4432 ExpectUserDefinedTypeIdentifier("enum type name expected");
4426 if (FLAG_trace_parser) { 4433 if (FLAG_trace_parser) {
4427 OS::Print("TopLevel parsing enum '%s'\n", enum_name->ToCString()); 4434 OS::Print("TopLevel parsing enum '%s'\n", enum_name->ToCString());
(...skipping 21 matching lines...) Expand all
4449 if (!obj.IsNull()) { 4456 if (!obj.IsNull()) {
4450 ReportError(name_pos, "'%s' is already defined", enum_name->ToCString()); 4457 ReportError(name_pos, "'%s' is already defined", enum_name->ToCString());
4451 } 4458 }
4452 Class& cls = Class::Handle(Z); 4459 Class& cls = Class::Handle(Z);
4453 cls = Class::New(*enum_name, script_, declaration_pos); 4460 cls = Class::New(*enum_name, script_, declaration_pos);
4454 cls.set_library(library_); 4461 cls.set_library(library_);
4455 library_.AddClass(cls); 4462 library_.AddClass(cls);
4456 cls.set_is_synthesized_class(); 4463 cls.set_is_synthesized_class();
4457 cls.set_is_enum_class(); 4464 cls.set_is_enum_class();
4458 if (metadata_pos >= 0) { 4465 if (metadata_pos >= 0) {
4459 library_.AddClassMetadata(cls, toplevel_class, metadata_pos); 4466 library_.AddClassMetadata(cls, tl_owner, metadata_pos);
4460 } 4467 }
4461 cls.set_super_type(Type::Handle(Z, Type::ObjectType())); 4468 cls.set_super_type(Type::Handle(Z, Type::ObjectType()));
4462 pending_classes.Add(cls, Heap::kOld); 4469 pending_classes.Add(cls, Heap::kOld);
4463 } 4470 }
4464 4471
4465 4472
4466 void Parser::ParseClassDeclaration(const GrowableObjectArray& pending_classes, 4473 void Parser::ParseClassDeclaration(const GrowableObjectArray& pending_classes,
4467 const Class& toplevel_class, 4474 const PatchClass& tl_owner,
4468 intptr_t metadata_pos) { 4475 intptr_t metadata_pos) {
4469 TRACE_PARSER("ParseClassDeclaration"); 4476 TRACE_PARSER("ParseClassDeclaration");
4470 bool is_patch = false; 4477 bool is_patch = false;
4471 bool is_abstract = false; 4478 bool is_abstract = false;
4472 intptr_t declaration_pos = (metadata_pos > 0) ? metadata_pos : TokenPos(); 4479 intptr_t declaration_pos = (metadata_pos > 0) ? metadata_pos : TokenPos();
4473 if (is_patch_source() && 4480 if (is_patch_source() &&
4474 (CurrentToken() == Token::kIDENT) && 4481 (CurrentToken() == Token::kIDENT) &&
4475 CurrentLiteral()->Equals("patch")) { 4482 CurrentLiteral()->Equals("patch")) {
4476 ConsumeToken(); 4483 ConsumeToken();
4477 is_patch = true; 4484 is_patch = true;
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
4572 String::Handle(orig_bound.UserVisibleName()).ToCString()); 4579 String::Handle(orig_bound.UserVisibleName()).ToCString());
4573 } 4580 }
4574 } 4581 }
4575 cls.set_type_parameters(orig_type_parameters); 4582 cls.set_type_parameters(orig_type_parameters);
4576 } 4583 }
4577 4584
4578 if (is_abstract) { 4585 if (is_abstract) {
4579 cls.set_is_abstract(); 4586 cls.set_is_abstract();
4580 } 4587 }
4581 if (metadata_pos >= 0) { 4588 if (metadata_pos >= 0) {
4582 library_.AddClassMetadata(cls, toplevel_class, metadata_pos); 4589 library_.AddClassMetadata(cls, tl_owner, metadata_pos);
4583 } 4590 }
4584 4591
4585 const bool is_mixin_declaration = (CurrentToken() == Token::kASSIGN); 4592 const bool is_mixin_declaration = (CurrentToken() == Token::kASSIGN);
4586 if (is_mixin_declaration && is_patch) { 4593 if (is_mixin_declaration && is_patch) {
4587 ReportError(classname_pos, 4594 ReportError(classname_pos,
4588 "mixin application '%s' may not be a patch class", 4595 "mixin application '%s' may not be a patch class",
4589 class_name.ToCString()); 4596 class_name.ToCString());
4590 } 4597 }
4591 4598
4592 AbstractType& super_type = Type::Handle(Z); 4599 AbstractType& super_type = Type::Handle(Z);
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after
4952 // compiled. 4959 // compiled.
4953 ctors.Add(member); 4960 ctors.Add(member);
4954 member = class_desc->LookupMember(*member->redirect_name); 4961 member = class_desc->LookupMember(*member->redirect_name);
4955 } 4962 }
4956 } 4963 }
4957 } 4964 }
4958 4965
4959 4966
4960 void Parser::ParseMixinAppAlias( 4967 void Parser::ParseMixinAppAlias(
4961 const GrowableObjectArray& pending_classes, 4968 const GrowableObjectArray& pending_classes,
4962 const Class& toplevel_class, 4969 const PatchClass& tl_owner,
4963 intptr_t metadata_pos) { 4970 intptr_t metadata_pos) {
4964 TRACE_PARSER("ParseMixinAppAlias"); 4971 TRACE_PARSER("ParseMixinAppAlias");
4965 const intptr_t classname_pos = TokenPos(); 4972 const intptr_t classname_pos = TokenPos();
4966 String& class_name = *ExpectUserDefinedTypeIdentifier("class name expected"); 4973 String& class_name = *ExpectUserDefinedTypeIdentifier("class name expected");
4967 if (FLAG_trace_parser) { 4974 if (FLAG_trace_parser) {
4968 OS::Print("toplevel parsing mixin application alias class '%s'\n", 4975 OS::Print("toplevel parsing mixin application alias class '%s'\n",
4969 class_name.ToCString()); 4976 class_name.ToCString());
4970 } 4977 }
4971 const Object& obj = Object::Handle(Z, library_.LookupLocalObject(class_name)); 4978 const Object& obj = Object::Handle(Z, library_.LookupLocalObject(class_name));
4972 if (!obj.IsNull()) { 4979 if (!obj.IsNull()) {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
5006 5013
5007 // This mixin application alias needs an implicit constructor, but it is 5014 // This mixin application alias needs an implicit constructor, but it is
5008 // too early to call 'AddImplicitConstructor(mixin_application)' here, 5015 // too early to call 'AddImplicitConstructor(mixin_application)' here,
5009 // because this class should be lazily compiled. 5016 // because this class should be lazily compiled.
5010 if (CurrentToken() == Token::kIMPLEMENTS) { 5017 if (CurrentToken() == Token::kIMPLEMENTS) {
5011 ParseInterfaceList(mixin_application); 5018 ParseInterfaceList(mixin_application);
5012 } 5019 }
5013 ExpectSemicolon(); 5020 ExpectSemicolon();
5014 pending_classes.Add(mixin_application, Heap::kOld); 5021 pending_classes.Add(mixin_application, Heap::kOld);
5015 if (metadata_pos >= 0) { 5022 if (metadata_pos >= 0) {
5016 library_.AddClassMetadata(mixin_application, toplevel_class, metadata_pos); 5023 library_.AddClassMetadata(mixin_application, tl_owner, metadata_pos);
5017 } 5024 }
5018 } 5025 }
5019 5026
5020 5027
5021 // Look ahead to detect if we are seeing ident [ TypeParameters ] "(". 5028 // Look ahead to detect if we are seeing ident [ TypeParameters ] "(".
5022 // We need this lookahead to distinguish between the optional return type 5029 // We need this lookahead to distinguish between the optional return type
5023 // and the alias name of a function type alias. 5030 // and the alias name of a function type alias.
5024 // Token position remains unchanged. 5031 // Token position remains unchanged.
5025 bool Parser::IsFunctionTypeAliasName() { 5032 bool Parser::IsFunctionTypeAliasName() {
5026 if (IsIdentifier() && (LookaheadToken(1) == Token::kLPAREN)) { 5033 if (IsIdentifier() && (LookaheadToken(1) == Token::kLPAREN)) {
(...skipping 25 matching lines...) Expand all
5052 if (TryParseTypeParameters() && (CurrentToken() == Token::kASSIGN)) { 5059 if (TryParseTypeParameters() && (CurrentToken() == Token::kASSIGN)) {
5053 is_mixin_def = true; 5060 is_mixin_def = true;
5054 } 5061 }
5055 } 5062 }
5056 SetPosition(saved_pos); 5063 SetPosition(saved_pos);
5057 return is_mixin_def; 5064 return is_mixin_def;
5058 } 5065 }
5059 5066
5060 5067
5061 void Parser::ParseTypedef(const GrowableObjectArray& pending_classes, 5068 void Parser::ParseTypedef(const GrowableObjectArray& pending_classes,
5062 const Class& toplevel_class, 5069 const PatchClass& tl_owner,
5063 intptr_t metadata_pos) { 5070 intptr_t metadata_pos) {
5064 TRACE_PARSER("ParseTypedef"); 5071 TRACE_PARSER("ParseTypedef");
5065 intptr_t declaration_pos = (metadata_pos > 0) ? metadata_pos : TokenPos(); 5072 intptr_t declaration_pos = (metadata_pos > 0) ? metadata_pos : TokenPos();
5066 ExpectToken(Token::kTYPEDEF); 5073 ExpectToken(Token::kTYPEDEF);
5067 5074
5068 if (IsMixinAppAlias()) { 5075 if (IsMixinAppAlias()) {
5069 if (FLAG_warn_mixin_typedef) { 5076 if (FLAG_warn_mixin_typedef) {
5070 ReportWarning(TokenPos(), "deprecated mixin application typedef"); 5077 ReportWarning(TokenPos(), "deprecated mixin application typedef");
5071 } 5078 }
5072 ParseMixinAppAlias(pending_classes, toplevel_class, metadata_pos); 5079 ParseMixinAppAlias(pending_classes, tl_owner, metadata_pos);
5073 return; 5080 return;
5074 } 5081 }
5075 5082
5076 // Parse the result type of the function type. 5083 // Parse the result type of the function type.
5077 AbstractType& result_type = Type::Handle(Z, Type::DynamicType()); 5084 AbstractType& result_type = Type::Handle(Z, Type::DynamicType());
5078 if (CurrentToken() == Token::kVOID) { 5085 if (CurrentToken() == Token::kVOID) {
5079 ConsumeToken(); 5086 ConsumeToken();
5080 result_type = Type::VoidType(); 5087 result_type = Type::VoidType();
5081 } else if (!IsFunctionTypeAliasName()) { 5088 } else if (!IsFunctionTypeAliasName()) {
5082 // Type annotations in typedef are never ignored, even in production mode. 5089 // Type annotations in typedef are never ignored, even in production mode.
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
5173 } 5180 }
5174 ASSERT(signature_function.signature_class() == signature_class.raw()); 5181 ASSERT(signature_function.signature_class() == signature_class.raw());
5175 5182
5176 // The alias should not be marked as finalized yet, since it needs to be 5183 // The alias should not be marked as finalized yet, since it needs to be
5177 // checked in the class finalizer for illegal self references. 5184 // checked in the class finalizer for illegal self references.
5178 ASSERT(!function_type_alias.IsCanonicalSignatureClass()); 5185 ASSERT(!function_type_alias.IsCanonicalSignatureClass());
5179 ASSERT(!function_type_alias.is_finalized()); 5186 ASSERT(!function_type_alias.is_finalized());
5180 pending_classes.Add(function_type_alias, Heap::kOld); 5187 pending_classes.Add(function_type_alias, Heap::kOld);
5181 if (metadata_pos >= 0) { 5188 if (metadata_pos >= 0) {
5182 library_.AddClassMetadata(function_type_alias, 5189 library_.AddClassMetadata(function_type_alias,
5183 toplevel_class, 5190 tl_owner,
5184 metadata_pos); 5191 metadata_pos);
5185 } 5192 }
5186 } 5193 }
5187 5194
5188 5195
5189 // Consumes exactly one right angle bracket. If the current token is a single 5196 // Consumes exactly one right angle bracket. If the current token is a single
5190 // bracket token, it is consumed normally. However, if it is a double or triple 5197 // bracket token, it is consumed normally. However, if it is a double or triple
5191 // bracket, it is replaced by a single or double bracket token without 5198 // bracket, it is replaced by a single or double bracket token without
5192 // incrementing the token index. 5199 // incrementing the token index.
5193 void Parser::ConsumeRightAngleBracket() { 5200 void Parser::ConsumeRightAngleBracket() {
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
5410 String::Handle(Z, mixin_type.UserVisibleName()).ToCString()); 5417 String::Handle(Z, mixin_type.UserVisibleName()).ToCString());
5411 } 5418 }
5412 mixin_types.Add(mixin_type); 5419 mixin_types.Add(mixin_type);
5413 } while (CurrentToken() == Token::kCOMMA); 5420 } while (CurrentToken() == Token::kCOMMA);
5414 return MixinAppType::New(super_type, 5421 return MixinAppType::New(super_type,
5415 Array::Handle(Z, Array::MakeArray(mixin_types))); 5422 Array::Handle(Z, Array::MakeArray(mixin_types)));
5416 } 5423 }
5417 5424
5418 5425
5419 void Parser::ParseTopLevelVariable(TopLevel* top_level, 5426 void Parser::ParseTopLevelVariable(TopLevel* top_level,
5427 const PatchClass& owner,
5420 intptr_t metadata_pos) { 5428 intptr_t metadata_pos) {
5421 TRACE_PARSER("ParseTopLevelVariable"); 5429 TRACE_PARSER("ParseTopLevelVariable");
5422 const bool is_const = (CurrentToken() == Token::kCONST); 5430 const bool is_const = (CurrentToken() == Token::kCONST);
5423 // Const fields are implicitly final. 5431 // Const fields are implicitly final.
5424 const bool is_final = is_const || (CurrentToken() == Token::kFINAL); 5432 const bool is_final = is_const || (CurrentToken() == Token::kFINAL);
5425 const bool is_static = true; 5433 const bool is_static = true;
5426 const AbstractType& type = AbstractType::ZoneHandle(Z, 5434 const AbstractType& type = AbstractType::ZoneHandle(Z,
5427 ParseConstFinalVarOrType(ClassFinalizer::kResolveTypeParameters)); 5435 ParseConstFinalVarOrType(ClassFinalizer::kResolveTypeParameters));
5428 Field& field = Field::Handle(Z); 5436 Field& field = Field::Handle(Z);
5429 Function& getter = Function::Handle(Z); 5437 Function& getter = Function::Handle(Z);
(...skipping 15 matching lines...) Expand all
5445 var_name.ToCString()); 5453 var_name.ToCString());
5446 } 5454 }
5447 accessor_name = Field::SetterName(var_name); 5455 accessor_name = Field::SetterName(var_name);
5448 if (library_.LookupLocalObject(accessor_name) != Object::null()) { 5456 if (library_.LookupLocalObject(accessor_name) != Object::null()) {
5449 ReportError(name_pos, "setter for '%s' is already defined", 5457 ReportError(name_pos, "setter for '%s' is already defined",
5450 var_name.ToCString()); 5458 var_name.ToCString());
5451 } 5459 }
5452 5460
5453 const bool is_reflectable = 5461 const bool is_reflectable =
5454 !(library_.is_dart_scheme() && library_.IsPrivate(var_name)); 5462 !(library_.is_dart_scheme() && library_.IsPrivate(var_name));
5455 field = Field::New(var_name, is_static, is_final, is_const, is_reflectable, 5463
5456 current_class(), type, name_pos); 5464 field = Field::NewTopLevel(var_name, is_final, is_const, owner, name_pos);
5465 field.SetFieldType(type);
5466 field.set_is_reflectable(is_reflectable);
5457 field.SetStaticValue(Object::null_instance(), true); 5467 field.SetStaticValue(Object::null_instance(), true);
5458 top_level->AddField(field); 5468 top_level->AddField(field);
5459 library_.AddObject(field, var_name); 5469 library_.AddObject(field, var_name);
5460 if (metadata_pos >= 0) { 5470 if (metadata_pos >= 0) {
5461 library_.AddFieldMetadata(field, metadata_pos); 5471 library_.AddFieldMetadata(field, metadata_pos);
5462 } 5472 }
5463 if (CurrentToken() == Token::kASSIGN) { 5473 if (CurrentToken() == Token::kASSIGN) {
5464 ConsumeToken(); 5474 ConsumeToken();
5465 Instance& field_value = Instance::Handle(Z, Object::sentinel().raw()); 5475 Instance& field_value = Instance::Handle(Z, Object::sentinel().raw());
5466 bool has_simple_literal = false; 5476 bool has_simple_literal = false;
5467 if (LookaheadToken(1) == Token::kSEMICOLON) { 5477 if (LookaheadToken(1) == Token::kSEMICOLON) {
5468 has_simple_literal = IsSimpleLiteral(type, &field_value); 5478 has_simple_literal = IsSimpleLiteral(type, &field_value);
5469 } 5479 }
5470 SkipExpr(); 5480 SkipExpr();
5471 field.SetStaticValue(field_value, true); 5481 field.SetStaticValue(field_value, true);
5472 field.set_has_initializer(true); 5482 field.set_has_initializer(true);
5473 5483
5474 if (!has_simple_literal) { 5484 if (!has_simple_literal) {
5475 // Create a static final getter. 5485 // Create a static final getter.
5476 String& getter_name = String::Handle(Z, Field::GetterSymbol(var_name)); 5486 String& getter_name = String::Handle(Z, Field::GetterSymbol(var_name));
5477 getter = Function::New(getter_name, 5487 getter = Function::New(getter_name,
5478 RawFunction::kImplicitStaticFinalGetter, 5488 RawFunction::kImplicitStaticFinalGetter,
5479 is_static, 5489 is_static,
5480 is_const, 5490 is_const,
5481 /* is_abstract = */ false, 5491 /* is_abstract = */ false,
5482 /* is_external = */ false, 5492 /* is_external = */ false,
5483 /* is_native = */ false, 5493 /* is_native = */ false,
5484 current_class(), 5494 owner,
5485 name_pos); 5495 name_pos);
5486 getter.set_result_type(type); 5496 getter.set_result_type(type);
5487 getter.set_is_debuggable(false); 5497 getter.set_is_debuggable(false);
5488 if (library_.is_dart_scheme() && library_.IsPrivate(var_name)) { 5498 getter.set_is_reflectable(is_reflectable);
5489 getter.set_is_reflectable(false);
5490 }
5491 top_level->AddFunction(getter); 5499 top_level->AddFunction(getter);
5492 } 5500 }
5493 } else if (is_final) { 5501 } else if (is_final) {
5494 ReportError(name_pos, "missing initializer for final or const variable"); 5502 ReportError(name_pos, "missing initializer for final or const variable");
5495 } 5503 }
5496 5504
5497 if (CurrentToken() == Token::kCOMMA) { 5505 if (CurrentToken() == Token::kCOMMA) {
5498 ConsumeToken(); 5506 ConsumeToken();
5499 } else if (CurrentToken() == Token::kSEMICOLON) { 5507 } else if (CurrentToken() == Token::kSEMICOLON) {
5500 ConsumeToken(); 5508 ConsumeToken();
(...skipping 26 matching lines...) Expand all
5527 } 5535 }
5528 ConsumeToken(); 5536 ConsumeToken();
5529 ConsumeToken(); 5537 ConsumeToken();
5530 return RawFunction::kSyncGen; 5538 return RawFunction::kSyncGen;
5531 } 5539 }
5532 return RawFunction::kNoModifier; 5540 return RawFunction::kNoModifier;
5533 } 5541 }
5534 5542
5535 5543
5536 void Parser::ParseTopLevelFunction(TopLevel* top_level, 5544 void Parser::ParseTopLevelFunction(TopLevel* top_level,
5545 const PatchClass& owner,
5537 intptr_t metadata_pos) { 5546 intptr_t metadata_pos) {
5538 TRACE_PARSER("ParseTopLevelFunction"); 5547 TRACE_PARSER("ParseTopLevelFunction");
5539 const intptr_t decl_begin_pos = TokenPos(); 5548 const intptr_t decl_begin_pos = TokenPos();
5540 AbstractType& result_type = Type::Handle(Z, Type::DynamicType()); 5549 AbstractType& result_type = Type::Handle(Z, Type::DynamicType());
5541 const bool is_static = true; 5550 const bool is_static = true;
5542 bool is_external = false; 5551 bool is_external = false;
5543 bool is_patch = false; 5552 bool is_patch = false;
5544 if (is_patch_source() && 5553 if (is_patch_source() &&
5545 (CurrentToken() == Token::kIDENT) && 5554 (CurrentToken() == Token::kIDENT) &&
5546 CurrentLiteral()->Equals("patch") && 5555 CurrentLiteral()->Equals("patch") &&
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
5618 ReportError("function block expected"); 5627 ReportError("function block expected");
5619 } 5628 }
5620 Function& func = Function::Handle(Z, 5629 Function& func = Function::Handle(Z,
5621 Function::New(func_name, 5630 Function::New(func_name,
5622 RawFunction::kRegularFunction, 5631 RawFunction::kRegularFunction,
5623 is_static, 5632 is_static,
5624 /* is_const = */ false, 5633 /* is_const = */ false,
5625 /* is_abstract = */ false, 5634 /* is_abstract = */ false,
5626 is_external, 5635 is_external,
5627 is_native, 5636 is_native,
5628 current_class(), 5637 owner,
5629 decl_begin_pos)); 5638 decl_begin_pos));
5630 func.set_result_type(result_type); 5639 func.set_result_type(result_type);
5631 func.set_end_token_pos(function_end_pos); 5640 func.set_end_token_pos(function_end_pos);
5632 func.set_modifier(func_modifier); 5641 func.set_modifier(func_modifier);
5633 if (library_.is_dart_scheme() && library_.IsPrivate(func_name)) { 5642 if (library_.is_dart_scheme() && library_.IsPrivate(func_name)) {
5634 func.set_is_reflectable(false); 5643 func.set_is_reflectable(false);
5635 } 5644 }
5636 if (is_native) { 5645 if (is_native) {
5637 func.set_native_name(*native_name); 5646 func.set_native_name(*native_name);
5638 } 5647 }
5639 AddFormalParamsToFunction(&params, func); 5648 AddFormalParamsToFunction(&params, func);
5640 top_level->AddFunction(func); 5649 top_level->AddFunction(func);
5641 if (!is_patch) { 5650 if (!is_patch) {
5642 library_.AddObject(func, func_name); 5651 library_.AddObject(func, func_name);
5643 } else { 5652 } else {
5653 // Need to remove the previously added function that is being patched.
5654 const Class& toplevel_cls = Class::Handle(Z, library_.toplevel_class());
5655 const Function& replaced_func =
5656 Function::Handle(Z, toplevel_cls.LookupStaticFunction(func_name));
5657 ASSERT(!replaced_func.IsNull());
5658 toplevel_cls.RemoveFunction(replaced_func);
5644 library_.ReplaceObject(func, func_name); 5659 library_.ReplaceObject(func, func_name);
5645 } 5660 }
5646 if (metadata_pos >= 0) { 5661 if (metadata_pos >= 0) {
5647 library_.AddFunctionMetadata(func, metadata_pos); 5662 library_.AddFunctionMetadata(func, metadata_pos);
5648 } 5663 }
5649 } 5664 }
5650 5665
5651 5666
5652 void Parser::ParseTopLevelAccessor(TopLevel* top_level, 5667 void Parser::ParseTopLevelAccessor(TopLevel* top_level,
5668 const PatchClass& owner,
5653 intptr_t metadata_pos) { 5669 intptr_t metadata_pos) {
5654 TRACE_PARSER("ParseTopLevelAccessor"); 5670 TRACE_PARSER("ParseTopLevelAccessor");
5655 const intptr_t decl_begin_pos = TokenPos(); 5671 const intptr_t decl_begin_pos = TokenPos();
5656 const bool is_static = true; 5672 const bool is_static = true;
5657 bool is_external = false; 5673 bool is_external = false;
5658 bool is_patch = false; 5674 bool is_patch = false;
5659 AbstractType& result_type = AbstractType::Handle(Z); 5675 AbstractType& result_type = AbstractType::Handle(Z);
5660 if (is_patch_source() && 5676 if (is_patch_source() &&
5661 (CurrentToken() == Token::kIDENT) && 5677 (CurrentToken() == Token::kIDENT) &&
5662 CurrentLiteral()->Equals("patch")) { 5678 CurrentLiteral()->Equals("patch")) {
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
5773 } 5789 }
5774 Function& func = Function::Handle(Z, 5790 Function& func = Function::Handle(Z,
5775 Function::New(accessor_name, 5791 Function::New(accessor_name,
5776 is_getter ? RawFunction::kGetterFunction : 5792 is_getter ? RawFunction::kGetterFunction :
5777 RawFunction::kSetterFunction, 5793 RawFunction::kSetterFunction,
5778 is_static, 5794 is_static,
5779 /* is_const = */ false, 5795 /* is_const = */ false,
5780 /* is_abstract = */ false, 5796 /* is_abstract = */ false,
5781 is_external, 5797 is_external,
5782 is_native, 5798 is_native,
5783 current_class(), 5799 owner,
5784 decl_begin_pos)); 5800 decl_begin_pos));
5785 func.set_result_type(result_type); 5801 func.set_result_type(result_type);
5786 func.set_end_token_pos(accessor_end_pos); 5802 func.set_end_token_pos(accessor_end_pos);
5787 func.set_modifier(func_modifier); 5803 func.set_modifier(func_modifier);
5788 if (is_native) { 5804 if (is_native) {
5789 func.set_is_debuggable(false); 5805 func.set_is_debuggable(false);
5790 func.set_native_name(*native_name); 5806 func.set_native_name(*native_name);
5791 } 5807 }
5792 if (library_.is_dart_scheme() && library_.IsPrivate(accessor_name)) { 5808 if (library_.is_dart_scheme() && library_.IsPrivate(accessor_name)) {
5793 func.set_is_reflectable(false); 5809 func.set_is_reflectable(false);
5794 } 5810 }
5795 AddFormalParamsToFunction(&params, func); 5811 AddFormalParamsToFunction(&params, func);
5796 top_level->AddFunction(func); 5812 top_level->AddFunction(func);
5797 if (!is_patch) { 5813 if (!is_patch) {
5798 library_.AddObject(func, accessor_name); 5814 library_.AddObject(func, accessor_name);
5799 } else { 5815 } else {
5816 // Need to remove the previously added accessor that is being patched.
5817 const Class& toplevel_cls = Class::Handle(Z, owner.patched_class());
5818 const Function& replaced_func =
5819 Function::Handle(Z, toplevel_cls.LookupFunction(accessor_name));
5820 ASSERT(!replaced_func.IsNull());
5821 toplevel_cls.RemoveFunction(replaced_func);
5800 library_.ReplaceObject(func, accessor_name); 5822 library_.ReplaceObject(func, accessor_name);
5801 } 5823 }
5802 if (metadata_pos >= 0) { 5824 if (metadata_pos >= 0) {
5803 library_.AddFunctionMetadata(func, metadata_pos); 5825 library_.AddFunctionMetadata(func, metadata_pos);
5804 } 5826 }
5805 } 5827 }
5806 5828
5807 5829
5808 RawObject* Parser::CallLibraryTagHandler(Dart_LibraryTag tag, 5830 RawObject* Parser::CallLibraryTagHandler(Dart_LibraryTag tag,
5809 intptr_t token_pos, 5831 intptr_t token_pos,
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
5869 names->Add(*CurrentLiteral()); 5891 names->Add(*CurrentLiteral());
5870 ConsumeToken(); // Identifier. 5892 ConsumeToken(); // Identifier.
5871 if (CurrentToken() != Token::kCOMMA) { 5893 if (CurrentToken() != Token::kCOMMA) {
5872 return; 5894 return;
5873 } 5895 }
5874 ConsumeToken(); // Comma. 5896 ConsumeToken(); // Comma.
5875 } 5897 }
5876 } 5898 }
5877 5899
5878 5900
5879 void Parser::ParseLibraryImportExport(intptr_t metadata_pos) { 5901 void Parser::ParseLibraryImportExport(const PatchClass& tl_owner,
5902 intptr_t metadata_pos) {
5880 bool is_import = (CurrentToken() == Token::kIMPORT); 5903 bool is_import = (CurrentToken() == Token::kIMPORT);
5881 bool is_export = (CurrentToken() == Token::kEXPORT); 5904 bool is_export = (CurrentToken() == Token::kEXPORT);
5882 ASSERT(is_import || is_export); 5905 ASSERT(is_import || is_export);
5883 const intptr_t import_pos = TokenPos(); 5906 const intptr_t import_pos = TokenPos();
5884 ConsumeToken(); 5907 ConsumeToken();
5885 CheckToken(Token::kSTRING, "library url expected"); 5908 CheckToken(Token::kSTRING, "library url expected");
5886 AstNode* url_literal = ParseStringLiteral(false); 5909 AstNode* url_literal = ParseStringLiteral(false);
5887 ASSERT(url_literal->IsLiteralNode()); 5910 ASSERT(url_literal->IsLiteralNode());
5888 ASSERT(url_literal->AsLiteralNode()->literal().IsString()); 5911 ASSERT(url_literal->AsLiteralNode()->literal().IsString());
5889 const String& url = String::Cast(url_literal->AsLiteralNode()->literal()); 5912 const String& url = String::Cast(url_literal->AsLiteralNode()->literal());
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
5954 // the library. 5977 // the library.
5955 if (library.LoadNotStarted() && 5978 if (library.LoadNotStarted() &&
5956 (!is_deferred_import || FLAG_load_deferred_eagerly)) { 5979 (!is_deferred_import || FLAG_load_deferred_eagerly)) {
5957 library.SetLoadRequested(); 5980 library.SetLoadRequested();
5958 CallLibraryTagHandler(Dart_kImportTag, import_pos, canon_url); 5981 CallLibraryTagHandler(Dart_kImportTag, import_pos, canon_url);
5959 } 5982 }
5960 5983
5961 Namespace& ns = Namespace::Handle(Z, 5984 Namespace& ns = Namespace::Handle(Z,
5962 Namespace::New(library, show_names, hide_names)); 5985 Namespace::New(library, show_names, hide_names));
5963 if (metadata_pos >= 0) { 5986 if (metadata_pos >= 0) {
5964 ns.AddMetadata(metadata_pos, current_class()); 5987 ns.AddMetadata(tl_owner, metadata_pos);
5965 } 5988 }
5966 5989
5967 // Ensure that private dart:_ libraries are only imported into dart: 5990 // Ensure that private dart:_ libraries are only imported into dart:
5968 // libraries, including indirectly through exports. 5991 // libraries, including indirectly through exports.
5969 const String& lib_url = String::Handle(Z, library_.url()); 5992 const String& lib_url = String::Handle(Z, library_.url());
5970 if (canon_url.StartsWith(Symbols::DartSchemePrivate()) && 5993 if (canon_url.StartsWith(Symbols::DartSchemePrivate()) &&
5971 !lib_url.StartsWith(Symbols::DartScheme())) { 5994 !lib_url.StartsWith(Symbols::DartScheme())) {
5972 ReportError(import_pos, "private library is not accessible"); 5995 ReportError(import_pos, "private library is not accessible");
5973 } 5996 }
5974 5997
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
6017 ASSERT(url_literal->IsLiteralNode()); 6040 ASSERT(url_literal->IsLiteralNode());
6018 ASSERT(url_literal->AsLiteralNode()->literal().IsString()); 6041 ASSERT(url_literal->AsLiteralNode()->literal().IsString());
6019 const String& url = String::Cast(url_literal->AsLiteralNode()->literal()); 6042 const String& url = String::Cast(url_literal->AsLiteralNode()->literal());
6020 ExpectSemicolon(); 6043 ExpectSemicolon();
6021 const String& canon_url = String::CheckedHandle( 6044 const String& canon_url = String::CheckedHandle(
6022 CallLibraryTagHandler(Dart_kCanonicalizeUrl, source_pos, url)); 6045 CallLibraryTagHandler(Dart_kCanonicalizeUrl, source_pos, url));
6023 CallLibraryTagHandler(Dart_kSourceTag, source_pos, canon_url); 6046 CallLibraryTagHandler(Dart_kSourceTag, source_pos, canon_url);
6024 } 6047 }
6025 6048
6026 6049
6027 void Parser::ParseLibraryDefinition() { 6050 void Parser::ParseLibraryDefinition(const PatchClass& tl_owner) {
6028 TRACE_PARSER("ParseLibraryDefinition"); 6051 TRACE_PARSER("ParseLibraryDefinition");
6029 6052
6030 // Handle the script tag. 6053 // Handle the script tag.
6031 if (CurrentToken() == Token::kSCRIPTTAG) { 6054 if (CurrentToken() == Token::kSCRIPTTAG) {
6032 // Nothing to do for script tags except to skip them. 6055 // Nothing to do for script tags except to skip them.
6033 ConsumeToken(); 6056 ConsumeToken();
6034 } 6057 }
6035 6058
6036 ASSERT(script_.kind() != RawScript::kSourceTag); 6059 ASSERT(script_.kind() != RawScript::kSourceTag);
6037 6060
6038 // We may read metadata tokens that are part of the toplevel 6061 // We may read metadata tokens that are part of the toplevel
6039 // declaration that follows the library definitions. Therefore, we 6062 // declaration that follows the library definitions. Therefore, we
6040 // need to remember the position of the last token that was 6063 // need to remember the position of the last token that was
6041 // successfully consumed. 6064 // successfully consumed.
6042 intptr_t rewind_pos = TokenPos(); 6065 intptr_t rewind_pos = TokenPos();
6043 intptr_t metadata_pos = SkipMetadata(); 6066 intptr_t metadata_pos = SkipMetadata();
6044 if (CurrentToken() == Token::kLIBRARY) { 6067 if (CurrentToken() == Token::kLIBRARY) {
6045 if (is_patch_source()) { 6068 if (is_patch_source()) {
6046 ReportError("patch cannot override library name"); 6069 ReportError("patch cannot override library name");
6047 } 6070 }
6048 ParseLibraryName(); 6071 ParseLibraryName();
6049 if (metadata_pos >= 0) { 6072 if (metadata_pos >= 0) {
6050 library_.AddLibraryMetadata(current_class(), metadata_pos); 6073 library_.AddLibraryMetadata(tl_owner, metadata_pos);
6051 } 6074 }
6052 rewind_pos = TokenPos(); 6075 rewind_pos = TokenPos();
6053 metadata_pos = SkipMetadata(); 6076 metadata_pos = SkipMetadata();
6054 } 6077 }
6055 while ((CurrentToken() == Token::kIMPORT) || 6078 while ((CurrentToken() == Token::kIMPORT) ||
6056 (CurrentToken() == Token::kEXPORT)) { 6079 (CurrentToken() == Token::kEXPORT)) {
6057 ParseLibraryImportExport(metadata_pos); 6080 ParseLibraryImportExport(tl_owner, metadata_pos);
6058 rewind_pos = TokenPos(); 6081 rewind_pos = TokenPos();
6059 metadata_pos = SkipMetadata(); 6082 metadata_pos = SkipMetadata();
6060 } 6083 }
6061 // Core lib has not been explicitly imported, so we implicitly 6084 // Core lib has not been explicitly imported, so we implicitly
6062 // import it here. 6085 // import it here.
6063 if (!library_.ImportsCorelib()) { 6086 if (!library_.ImportsCorelib()) {
6064 Library& core_lib = Library::Handle(Z, Library::CoreLibrary()); 6087 Library& core_lib = Library::Handle(Z, Library::CoreLibrary());
6065 ASSERT(!core_lib.IsNull()); 6088 ASSERT(!core_lib.IsNull());
6066 const Namespace& core_ns = Namespace::Handle(Z, 6089 const Namespace& core_ns = Namespace::Handle(Z,
6067 Namespace::New(core_lib, Object::null_array(), Object::null_array())); 6090 Namespace::New(core_lib, Object::null_array(), Object::null_array()));
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
6099 TRACE_PARSER("ParseTopLevel"); 6122 TRACE_PARSER("ParseTopLevel");
6100 // Collect the classes found at the top level in this growable array. 6123 // Collect the classes found at the top level in this growable array.
6101 // They need to be registered with class finalization after parsing 6124 // They need to be registered with class finalization after parsing
6102 // has been completed. 6125 // has been completed.
6103 ObjectStore* object_store = I->object_store(); 6126 ObjectStore* object_store = I->object_store();
6104 const GrowableObjectArray& pending_classes = 6127 const GrowableObjectArray& pending_classes =
6105 GrowableObjectArray::Handle(Z, object_store->pending_classes()); 6128 GrowableObjectArray::Handle(Z, object_store->pending_classes());
6106 SetPosition(0); 6129 SetPosition(0);
6107 is_top_level_ = true; 6130 is_top_level_ = true;
6108 TopLevel top_level(Z); 6131 TopLevel top_level(Z);
6109 Class& toplevel_class = Class::Handle(Z, 6132
6110 Class::New(Symbols::TopLevel(), script_, TokenPos())); 6133 Class& toplevel_class = Class::Handle(Z, library_.toplevel_class());
6111 toplevel_class.set_library(library_); 6134 if (toplevel_class.IsNull()) {
6135 toplevel_class = Class::New(Symbols::TopLevel(), script_, TokenPos());
6136 toplevel_class.set_library(library_);
6137 library_.set_toplevel_class(toplevel_class);
Ivan Posva 2015/11/30 23:54:27 For this compilation unit we can use this top leve
hausner 2015/12/01 19:38:17 Done.
6138 }
6139
6140 const PatchClass& tl_owner =
6141 PatchClass::ZoneHandle(PatchClass::New(toplevel_class, script_));
6112 6142
6113 if (is_library_source() || is_patch_source()) { 6143 if (is_library_source() || is_patch_source()) {
6114 set_current_class(toplevel_class); 6144 set_current_class(toplevel_class);
6115 ParseLibraryDefinition(); 6145 ParseLibraryDefinition(tl_owner);
6116 } else if (is_part_source()) { 6146 } else if (is_part_source()) {
6117 ParsePartHeader(); 6147 ParsePartHeader();
6118 } 6148 }
6119 6149
6120 const Class& cls = Class::Handle(Z); 6150 const Class& cls = Class::Handle(Z);
6121 while (true) { 6151 while (true) {
6122 set_current_class(cls); // No current class. 6152 set_current_class(cls); // No current class.
6123 intptr_t metadata_pos = SkipMetadata(); 6153 intptr_t metadata_pos = SkipMetadata();
6124 if (CurrentToken() == Token::kCLASS) { 6154 if (CurrentToken() == Token::kCLASS) {
6125 ParseClassDeclaration(pending_classes, toplevel_class, metadata_pos); 6155 ParseClassDeclaration(pending_classes, tl_owner, metadata_pos);
6126 } else if (CurrentToken() == Token::kENUM) { 6156 } else if (CurrentToken() == Token::kENUM) {
6127 ParseEnumDeclaration(pending_classes, toplevel_class, metadata_pos); 6157 ParseEnumDeclaration(pending_classes, tl_owner, metadata_pos);
6128 } else if ((CurrentToken() == Token::kTYPEDEF) && 6158 } else if ((CurrentToken() == Token::kTYPEDEF) &&
6129 (LookaheadToken(1) != Token::kLPAREN)) { 6159 (LookaheadToken(1) != Token::kLPAREN)) {
6130 set_current_class(toplevel_class); 6160 set_current_class(toplevel_class);
6131 ParseTypedef(pending_classes, toplevel_class, metadata_pos); 6161 ParseTypedef(pending_classes, tl_owner, metadata_pos);
6132 } else if ((CurrentToken() == Token::kABSTRACT) && 6162 } else if ((CurrentToken() == Token::kABSTRACT) &&
6133 (LookaheadToken(1) == Token::kCLASS)) { 6163 (LookaheadToken(1) == Token::kCLASS)) {
6134 ParseClassDeclaration(pending_classes, toplevel_class, metadata_pos); 6164 ParseClassDeclaration(pending_classes, tl_owner, metadata_pos);
6135 } else if (is_patch_source() && IsSymbol(Symbols::Patch()) && 6165 } else if (is_patch_source() && IsSymbol(Symbols::Patch()) &&
6136 (LookaheadToken(1) == Token::kCLASS)) { 6166 (LookaheadToken(1) == Token::kCLASS)) {
6137 ParseClassDeclaration(pending_classes, toplevel_class, metadata_pos); 6167 ParseClassDeclaration(pending_classes, tl_owner, metadata_pos);
6138 } else { 6168 } else {
6139 set_current_class(toplevel_class); 6169 set_current_class(toplevel_class);
6140 if (IsVariableDeclaration()) { 6170 if (IsVariableDeclaration()) {
6141 ParseTopLevelVariable(&top_level, metadata_pos); 6171 ParseTopLevelVariable(&top_level, tl_owner, metadata_pos);
6142 } else if (IsFunctionDeclaration()) { 6172 } else if (IsFunctionDeclaration()) {
6143 ParseTopLevelFunction(&top_level, metadata_pos); 6173 ParseTopLevelFunction(&top_level, tl_owner, metadata_pos);
6144 } else if (IsTopLevelAccessor()) { 6174 } else if (IsTopLevelAccessor()) {
6145 ParseTopLevelAccessor(&top_level, metadata_pos); 6175 ParseTopLevelAccessor(&top_level, tl_owner, metadata_pos);
6146 } else if (CurrentToken() == Token::kEOS) { 6176 } else if (CurrentToken() == Token::kEOS) {
6147 break; 6177 break;
6148 } else { 6178 } else {
6149 UnexpectedToken(); 6179 UnexpectedToken();
6150 } 6180 }
6151 } 6181 }
6152 } 6182 }
6153 6183
6154 if ((library_.num_anonymous_classes() == 0) || 6184 if (top_level.fields().length() > 0) {
6155 (top_level.fields().length() > 0) ||
6156 (top_level.functions().length() > 0)) {
6157 toplevel_class.AddFields(top_level.fields()); 6185 toplevel_class.AddFields(top_level.fields());
6158 const intptr_t len = top_level.functions().length();
6159 const Array& array = Array::Handle(Z, Array::New(len, Heap::kOld));
6160 for (intptr_t i = 0; i < len; i++) {
6161 array.SetAt(i, *top_level.functions()[i]);
6162 }
6163 toplevel_class.SetFunctions(array);
6164 library_.AddAnonymousClass(toplevel_class);
6165 pending_classes.Add(toplevel_class, Heap::kOld);
6166 } 6186 }
6187 for (intptr_t i = 0; i < top_level.functions().length(); i++) {
6188 toplevel_class.AddFunction(*top_level.functions()[i]);
6189 }
6190 pending_classes.Add(toplevel_class, Heap::kOld);
6167 } 6191 }
6168 6192
6169 6193
6170 void Parser::ChainNewBlock(LocalScope* outer_scope) { 6194 void Parser::ChainNewBlock(LocalScope* outer_scope) {
6171 Block* block = new(Z) Block( 6195 Block* block = new(Z) Block(
6172 current_block_, 6196 current_block_,
6173 outer_scope, 6197 outer_scope,
6174 new(Z) SequenceNode(TokenPos(), outer_scope)); 6198 new(Z) SequenceNode(TokenPos(), outer_scope));
6175 current_block_ = block; 6199 current_block_ = block;
6176 } 6200 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
6215 new(Z) LocalScope(current_block_->scope, 6239 new(Z) LocalScope(current_block_->scope,
6216 current_block_->scope->function_level() + 1, 6240 current_block_->scope->function_level() + 1,
6217 0); 6241 0);
6218 } 6242 }
6219 ChainNewBlock(outer_scope); 6243 ChainNewBlock(outer_scope);
6220 } 6244 }
6221 6245
6222 6246
6223 void Parser::OpenAsyncClosure() { 6247 void Parser::OpenAsyncClosure() {
6224 TRACE_PARSER("OpenAsyncClosure"); 6248 TRACE_PARSER("OpenAsyncClosure");
6225
6226 async_temp_scope_ = current_block_->scope; 6249 async_temp_scope_ = current_block_->scope;
6227
6228 OpenAsyncTryBlock(); 6250 OpenAsyncTryBlock();
6229 } 6251 }
6230 6252
6231 6253
6232 SequenceNode* Parser::CloseAsyncGeneratorTryBlock(SequenceNode *body) { 6254 SequenceNode* Parser::CloseAsyncGeneratorTryBlock(SequenceNode *body) {
6233 TRACE_PARSER("CloseAsyncGeneratorTryBlock"); 6255 TRACE_PARSER("CloseAsyncGeneratorTryBlock");
6234 // The generated try-catch-finally that wraps the async generator function 6256 // The generated try-catch-finally that wraps the async generator function
6235 // body is the outermost try statement. 6257 // body is the outermost try statement.
6236 ASSERT(try_stack_ != NULL); 6258 ASSERT(try_stack_ != NULL);
6237 ASSERT(try_stack_->outer_try() == NULL); 6259 ASSERT(try_stack_->outer_try() == NULL);
(...skipping 8158 matching lines...) Expand 10 before | Expand all | Expand 10 after
14396 UNREACHABLE(); 14418 UNREACHABLE();
14397 return Object::null(); 14419 return Object::null();
14398 } 14420 }
14399 14421
14400 14422
14401 void Parser::ParseFunction(ParsedFunction* parsed_function) { 14423 void Parser::ParseFunction(ParsedFunction* parsed_function) {
14402 UNREACHABLE(); 14424 UNREACHABLE();
14403 } 14425 }
14404 14426
14405 14427
14406 RawObject* Parser::ParseMetadata(const Class& cls, intptr_t token_pos) { 14428 RawObject* Parser::ParseMetadata(const Field& meta_data) {
14407 UNREACHABLE(); 14429 UNREACHABLE();
14408 return Object::null(); 14430 return Object::null();
14409 } 14431 }
14410 14432
14411 14433
14412 ParsedFunction* Parser::ParseStaticFieldInitializer(const Field& field) { 14434 ParsedFunction* Parser::ParseStaticFieldInitializer(const Field& field) {
14413 UNREACHABLE(); 14435 UNREACHABLE();
14414 return NULL; 14436 return NULL;
14415 } 14437 }
14416 14438
14417 14439
14418 ArgumentListNode* Parser::BuildNoSuchMethodArguments( 14440 ArgumentListNode* Parser::BuildNoSuchMethodArguments(
14419 intptr_t call_pos, 14441 intptr_t call_pos,
14420 const String& function_name, 14442 const String& function_name,
14421 const ArgumentListNode& function_args, 14443 const ArgumentListNode& function_args,
14422 const LocalVariable* temp_for_last_arg, 14444 const LocalVariable* temp_for_last_arg,
14423 bool is_super_invocation) { 14445 bool is_super_invocation) {
14424 UNREACHABLE(); 14446 UNREACHABLE();
14425 return NULL; 14447 return NULL;
14426 } 14448 }
14427 14449
14428 } // namespace dart 14450 } // namespace dart
14429 14451
14430 #endif // DART_PRECOMPILED 14452 #endif // DART_PRECOMPILED
OLDNEW
« runtime/vm/object.cc ('K') | « runtime/vm/parser.h ('k') | runtime/vm/raw_object.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698