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

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

Issue 135123011: Introduce cache of resolved names in library (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 10 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
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/bootstrap.h" 9 #include "vm/bootstrap.h"
10 #include "vm/class_finalizer.h" 10 #include "vm/class_finalizer.h"
(...skipping 9084 matching lines...) Expand 10 before | Expand all | Expand 10 after
9095 } 9095 }
9096 9096
9097 // Nothing found in scope of current class. 9097 // Nothing found in scope of current class.
9098 if (node != NULL) { 9098 if (node != NULL) {
9099 *node = NULL; 9099 *node = NULL;
9100 } 9100 }
9101 return false; // Not an unqualified identifier. 9101 return false; // Not an unqualified identifier.
9102 } 9102 }
9103 9103
9104 9104
9105 static RawObject* LookupNameInLibrary(Isolate* isolate,
9106 const Library& lib,
9107 const String& name) {
9108 Object& obj = Object::Handle(isolate);
9109 obj = lib.LookupLocalObject(name);
9110 if (!obj.IsNull()) {
9111 return obj.raw();
9112 }
9113 String& accessor_name = String::Handle(isolate, Field::GetterName(name));
9114 obj = lib.LookupLocalObject(accessor_name);
9115 if (!obj.IsNull()) {
9116 return obj.raw();
9117 }
9118 accessor_name = Field::SetterName(name);
9119 obj = lib.LookupLocalObject(accessor_name);
9120 return obj.raw();
9121 }
9122
9123
9124 // Resolve a name by checking the global scope of the current
9125 // library. If not found in the current library, then look in the scopes
9126 // of all libraries that are imported without a library prefix.
9127 RawObject* Parser::ResolveNameInCurrentLibraryScope(const String& name) {
9128 TRACE_PARSER("ResolveNameInCurrentLibraryScope");
9129 HANDLESCOPE(isolate());
9130 Object& obj = Object::Handle(isolate(),
9131 LookupNameInLibrary(isolate(), library_, name));
9132 if (!obj.IsNull()) {
9133 return obj.raw();
9134 }
9135 return library_.LookupImportedObject(name);
9136 }
9137
9138
9139 RawClass* Parser::ResolveClassInCurrentLibraryScope(const String& name) { 9105 RawClass* Parser::ResolveClassInCurrentLibraryScope(const String& name) {
9140 const Object& obj = 9106 HANDLESCOPE(isolate());
9141 Object::Handle(ResolveNameInCurrentLibraryScope(name)); 9107 const Object& obj = Object::Handle(library_.ResolveName(name));
9142 if (obj.IsClass()) { 9108 if (obj.IsClass()) {
9143 return Class::Cast(obj).raw(); 9109 return Class::Cast(obj).raw();
9144 } 9110 }
9145 return Class::null(); 9111 return Class::null();
9146 } 9112 }
9147 9113
9148 9114
9149 // Resolve an identifier by checking the global scope of the current 9115 // Resolve an identifier by checking the global scope of the current
9150 // library. If not found in the current library, then look in the scopes 9116 // library. If not found in the current library, then look in the scopes
9151 // of all libraries that are imported without a library prefix. 9117 // of all libraries that are imported without a library prefix.
9152 AstNode* Parser::ResolveIdentInCurrentLibraryScope(intptr_t ident_pos, 9118 AstNode* Parser::ResolveIdentInCurrentLibraryScope(intptr_t ident_pos,
9153 const String& ident) { 9119 const String& ident) {
9154 TRACE_PARSER("ResolveIdentInCurrentLibraryScope"); 9120 TRACE_PARSER("ResolveIdentInCurrentLibraryScope");
9155 const Object& obj = 9121 HANDLESCOPE(isolate());
9156 Object::Handle(ResolveNameInCurrentLibraryScope(ident)); 9122 const Object& obj = Object::Handle(library_.ResolveName(ident));
9157 if (obj.IsClass()) { 9123 if (obj.IsClass()) {
9158 const Class& cls = Class::Cast(obj); 9124 const Class& cls = Class::Cast(obj);
9159 return new PrimaryNode(ident_pos, Class::ZoneHandle(cls.raw())); 9125 return new PrimaryNode(ident_pos, Class::ZoneHandle(cls.raw()));
9160 } else if (obj.IsField()) { 9126 } else if (obj.IsField()) {
9161 const Field& field = Field::Cast(obj); 9127 const Field& field = Field::Cast(obj);
9162 ASSERT(field.is_static()); 9128 ASSERT(field.is_static());
9163 return GenerateStaticFieldLookup(field, ident_pos); 9129 return GenerateStaticFieldLookup(field, ident_pos);
9164 } else if (obj.IsFunction()) { 9130 } else if (obj.IsFunction()) {
9165 const Function& func = Function::Cast(obj); 9131 const Function& func = Function::Cast(obj);
9166 ASSERT(func.is_static()); 9132 ASSERT(func.is_static());
9167 if (func.IsGetterFunction() || func.IsSetterFunction()) { 9133 if (func.IsGetterFunction() || func.IsSetterFunction()) {
9168 return new StaticGetterNode(ident_pos, 9134 return new StaticGetterNode(ident_pos,
9169 /* receiver */ NULL, 9135 /* receiver */ NULL,
9170 /* is_super_getter */ false, 9136 /* is_super_getter */ false,
9171 Class::ZoneHandle(func.Owner()), 9137 Class::ZoneHandle(func.Owner()),
9172 ident); 9138 ident);
9173 9139
9174 } else { 9140 } else {
9175 return new PrimaryNode(ident_pos, Function::ZoneHandle(func.raw())); 9141 return new PrimaryNode(ident_pos, Function::ZoneHandle(func.raw()));
9176 } 9142 }
9177 } else { 9143 } else {
9178 ASSERT(obj.IsNull() || obj.IsLibraryPrefix()); 9144 ASSERT(obj.IsNull() || obj.IsLibraryPrefix());
9179 } 9145 }
9180 // Lexically unresolved primary identifiers are referenced by their name. 9146 // Lexically unresolved primary identifiers are referenced by their name.
9181 return new PrimaryNode(ident_pos, ident); 9147 return new PrimaryNode(ident_pos, ident);
9182 } 9148 }
9183 9149
9184 9150
9185 RawObject* Parser::ResolveNameInPrefixScope(const LibraryPrefix& prefix,
9186 const String& name) {
9187 HANDLESCOPE(isolate());
9188 return prefix.LookupObject(name);
9189 }
9190
9191
9192 RawClass* Parser::ResolveClassInPrefixScope(const LibraryPrefix& prefix, 9151 RawClass* Parser::ResolveClassInPrefixScope(const LibraryPrefix& prefix,
9193 const String& name) { 9152 const String& name) {
9194 const Object& obj = 9153 HANDLESCOPE(isolate());
9195 Object::Handle(ResolveNameInPrefixScope(prefix, name)); 9154 const Object& obj = Object::Handle(prefix.LookupObject(name));
9196 if (obj.IsClass()) { 9155 if (obj.IsClass()) {
9197 return Class::Cast(obj).raw(); 9156 return Class::Cast(obj).raw();
9198 } 9157 }
9199 return Class::null(); 9158 return Class::null();
9200 } 9159 }
9201 9160
9202 9161
9203 // Do a lookup for the identifier in the scope of the specified 9162 // Do a lookup for the identifier in the scope of the specified
9204 // library prefix. This means trying to resolve it locally in all of the 9163 // library prefix. This means trying to resolve it locally in all of the
9205 // libraries present in the library prefix. 9164 // libraries present in the library prefix.
9206 AstNode* Parser::ResolveIdentInPrefixScope(intptr_t ident_pos, 9165 AstNode* Parser::ResolveIdentInPrefixScope(intptr_t ident_pos,
9207 const LibraryPrefix& prefix, 9166 const LibraryPrefix& prefix,
9208 const String& ident) { 9167 const String& ident) {
9209 TRACE_PARSER("ResolveIdentInPrefixScope"); 9168 TRACE_PARSER("ResolveIdentInPrefixScope");
9210 Object& obj = Object::Handle(ResolveNameInPrefixScope(prefix, ident)); 9169 HANDLESCOPE(isolate());
9170 Object& obj = Object::Handle(prefix.LookupObject(ident));
9211 if (obj.IsNull()) { 9171 if (obj.IsNull()) {
9212 // Unresolved prefixed primary identifier. 9172 // Unresolved prefixed primary identifier.
9213 String& qualified_name = String::ZoneHandle(prefix.name()); 9173 String& qualified_name = String::ZoneHandle(prefix.name());
9214 qualified_name = String::Concat(qualified_name, Symbols::Dot()); 9174 qualified_name = String::Concat(qualified_name, Symbols::Dot());
9215 qualified_name = String::Concat(qualified_name, ident); 9175 qualified_name = String::Concat(qualified_name, ident);
9216 qualified_name = Symbols::New(qualified_name); 9176 qualified_name = Symbols::New(qualified_name);
9217 return new PrimaryNode(ident_pos, qualified_name); 9177 return new PrimaryNode(ident_pos, qualified_name);
9218 } else if (obj.IsClass()) { 9178 } else if (obj.IsClass()) {
9219 const Class& cls = Class::Cast(obj); 9179 const Class& cls = Class::Cast(obj);
9220 return new PrimaryNode(ident_pos, Class::ZoneHandle(cls.raw())); 9180 return new PrimaryNode(ident_pos, Class::ZoneHandle(cls.raw()));
(...skipping 1579 matching lines...) Expand 10 before | Expand all | Expand 10 after
10800 void Parser::SkipQualIdent() { 10760 void Parser::SkipQualIdent() {
10801 ASSERT(IsIdentifier()); 10761 ASSERT(IsIdentifier());
10802 ConsumeToken(); 10762 ConsumeToken();
10803 if (CurrentToken() == Token::kPERIOD) { 10763 if (CurrentToken() == Token::kPERIOD) {
10804 ConsumeToken(); // Consume the kPERIOD token. 10764 ConsumeToken(); // Consume the kPERIOD token.
10805 ExpectIdentifier("identifier expected after '.'"); 10765 ExpectIdentifier("identifier expected after '.'");
10806 } 10766 }
10807 } 10767 }
10808 10768
10809 } // namespace dart 10769 } // namespace dart
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