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

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

Issue 1752203002: Fix issues in name resolution (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | runtime/vm/parser.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/object.h" 5 #include "vm/object.h"
6 6
7 #include "include/dart_api.h" 7 #include "include/dart_api.h"
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "vm/assembler.h" 9 #include "vm/assembler.h"
10 #include "vm/cpu.h" 10 #include "vm/cpu.h"
(...skipping 9385 matching lines...) Expand 10 before | Expand all | Expand 10 after
9396 GrowDictionary(dict, dict_size); 9396 GrowDictionary(dict, dict_size);
9397 } 9397 }
9398 9398
9399 // Invalidate the cache of loaded scripts. 9399 // Invalidate the cache of loaded scripts.
9400 if (loaded_scripts() != Array::null()) { 9400 if (loaded_scripts() != Array::null()) {
9401 StorePointer(&raw_ptr()->loaded_scripts_, Array::null()); 9401 StorePointer(&raw_ptr()->loaded_scripts_, Array::null());
9402 } 9402 }
9403 } 9403 }
9404 9404
9405 9405
9406 // Lookup a name in the library's re-export namespace. The name is 9406 // Lookup a name in the library's re-export namespace.
9407 // unmangled, i.e. no getter or setter names should be looked up.
9408 RawObject* Library::LookupReExport(const String& name) const { 9407 RawObject* Library::LookupReExport(const String& name) const {
9409 if (HasExports()) { 9408 if (HasExports()) {
9410 const Array& exports = Array::Handle(this->exports()); 9409 const Array& exports = Array::Handle(this->exports());
9411 // Break potential export cycle while looking up name. 9410 // Break potential export cycle while looking up name.
9412 StorePointer(&raw_ptr()->exports_, Object::empty_array().raw()); 9411 StorePointer(&raw_ptr()->exports_, Object::empty_array().raw());
9413 Namespace& ns = Namespace::Handle(); 9412 Namespace& ns = Namespace::Handle();
9414 Object& obj = Object::Handle(); 9413 Object& obj = Object::Handle();
9415 for (int i = 0; i < exports.Length(); i++) { 9414 for (int i = 0; i < exports.Length(); i++) {
9416 ns ^= exports.At(i); 9415 ns ^= exports.At(i);
9417 obj = ns.Lookup(name); 9416 obj = ns.Lookup(name);
9418 if (!obj.IsNull()) { 9417 if (!obj.IsNull()) {
9419 break; 9418 // The Lookup call above may return a setter x= when we are looking
9419 // for the name x. Make sure we only return when a matching name
9420 // is found.
9421 String& obj_name = String::Handle(obj.DictionaryName());
9422 if (Field::IsSetterName(obj_name) == Field::IsSetterName(name)) {
9423 break;
9424 }
9420 } 9425 }
9421 } 9426 }
9422 StorePointer(&raw_ptr()->exports_, exports.raw()); 9427 StorePointer(&raw_ptr()->exports_, exports.raw());
9423 return obj.raw(); 9428 return obj.raw();
9424 } 9429 }
9425 return Object::null(); 9430 return Object::null();
9426 } 9431 }
9427 9432
9428 9433
9429 RawObject* Library::LookupEntry(const String& name, intptr_t *index) const { 9434 RawObject* Library::LookupEntry(const String& name, intptr_t *index) const {
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after
9724 // previously found object is exported from a Dart 9729 // previously found object is exported from a Dart
9725 // system library. The newly found object hides the one 9730 // system library. The newly found object hides the one
9726 // from the Dart library. 9731 // from the Dart library.
9727 first_import_lib_url = import_lib.url(); 9732 first_import_lib_url = import_lib.url();
9728 found_obj = obj.raw(); 9733 found_obj = obj.raw();
9729 found_obj_name = obj.DictionaryName(); 9734 found_obj_name = obj.DictionaryName();
9730 } else if (import_lib_url.StartsWith(Symbols::DartScheme())) { 9735 } else if (import_lib_url.StartsWith(Symbols::DartScheme())) {
9731 // The newly found object is exported from a Dart system 9736 // The newly found object is exported from a Dart system
9732 // library. It is hidden by the previously found object. 9737 // library. It is hidden by the previously found object.
9733 // We continue to search. 9738 // We continue to search.
9739 } else if (Field::IsSetterName(found_obj_name) &&
9740 !Field::IsSetterName(name)) {
9741 // We are looking for an unmangled name or a getter, but
9742 // the first object we found is a setter. Replace the first
9743 // object with the one we just found.
9744 first_import_lib_url = import_lib.url();
9745 found_obj = obj.raw();
9746 found_obj_name = found_obj.DictionaryName();
9734 } else { 9747 } else {
9735 // We found two different objects with the same name. 9748 // We found two different objects with the same name.
9736 // Note that we need to compare the names again because 9749 // Note that we need to compare the names again because
9737 // looking up an unmangled name can return a getter or a 9750 // looking up an unmangled name can return a getter or a
9738 // setter. A getter name is the same as the unmangled name, 9751 // setter. A getter name is the same as the unmangled name,
9739 // but a setter name is different from an unmangled name or a 9752 // but a setter name is different from an unmangled name or a
9740 // getter name. 9753 // getter name.
9741 if (Field::IsGetterName(found_obj_name)) { 9754 if (Field::IsGetterName(found_obj_name)) {
9742 found_obj_name = Field::NameFromGetter(found_obj_name); 9755 found_obj_name = Field::NameFromGetter(found_obj_name);
9743 } 9756 }
(...skipping 590 matching lines...) Expand 10 before | Expand all | Expand 10 after
10334 if (!is_loaded() && !FLAG_load_deferred_eagerly) { 10347 if (!is_loaded() && !FLAG_load_deferred_eagerly) {
10335 return Object::null(); 10348 return Object::null();
10336 } 10349 }
10337 Array& imports = Array::Handle(this->imports()); 10350 Array& imports = Array::Handle(this->imports());
10338 Object& obj = Object::Handle(); 10351 Object& obj = Object::Handle();
10339 Namespace& import = Namespace::Handle(); 10352 Namespace& import = Namespace::Handle();
10340 Library& import_lib = Library::Handle(); 10353 Library& import_lib = Library::Handle();
10341 String& import_lib_url = String::Handle(); 10354 String& import_lib_url = String::Handle();
10342 String& first_import_lib_url = String::Handle(); 10355 String& first_import_lib_url = String::Handle();
10343 Object& found_obj = Object::Handle(); 10356 Object& found_obj = Object::Handle();
10357 String& found_obj_name = String::Handle();
10344 for (intptr_t i = 0; i < num_imports(); i++) { 10358 for (intptr_t i = 0; i < num_imports(); i++) {
10345 import ^= imports.At(i); 10359 import ^= imports.At(i);
10346 obj = import.Lookup(name); 10360 obj = import.Lookup(name);
10347 if (!obj.IsNull()) { 10361 if (!obj.IsNull()) {
10348 import_lib = import.library(); 10362 import_lib = import.library();
10349 import_lib_url = import_lib.url(); 10363 import_lib_url = import_lib.url();
10350 if (found_obj.raw() != obj.raw()) { 10364 if (found_obj.raw() != obj.raw()) {
10351 if (first_import_lib_url.IsNull() || 10365 if (first_import_lib_url.IsNull() ||
10352 first_import_lib_url.StartsWith(Symbols::DartScheme())) { 10366 first_import_lib_url.StartsWith(Symbols::DartScheme())) {
10353 // This is the first object we found, or the 10367 // This is the first object we found, or the
10354 // previously found object is exported from a Dart 10368 // previously found object is exported from a Dart
10355 // system library. The newly found object hides the one 10369 // system library. The newly found object hides the one
10356 // from the Dart library. 10370 // from the Dart library.
10357 first_import_lib_url = import_lib.url(); 10371 first_import_lib_url = import_lib.url();
10358 found_obj = obj.raw(); 10372 found_obj = obj.raw();
10373 found_obj_name = found_obj.DictionaryName();
10359 } else if (import_lib_url.StartsWith(Symbols::DartScheme())) { 10374 } else if (import_lib_url.StartsWith(Symbols::DartScheme())) {
10360 // The newly found object is exported from a Dart system 10375 // The newly found object is exported from a Dart system
10361 // library. It is hidden by the previously found object. 10376 // library. It is hidden by the previously found object.
10362 // We continue to search. 10377 // We continue to search.
10378 } else if (Field::IsSetterName(found_obj_name) &&
10379 !Field::IsSetterName(name)) {
10380 // We are looking for an unmangled name or a getter, but
10381 // the first object we found is a setter. Replace the first
10382 // object with the one we just found.
10383 first_import_lib_url = import_lib.url();
10384 found_obj = obj.raw();
10385 found_obj_name = found_obj.DictionaryName();
10363 } else { 10386 } else {
10364 // We found two different objects with the same name. 10387 // We found two different objects with the same name.
10365 return Object::null(); 10388 // Note that we need to compare the names again because
10389 // looking up an unmangled name can return a getter or a
10390 // setter. A getter name is the same as the unmangled name,
10391 // but a setter name is different from an unmangled name or a
10392 // getter name.
10393 if (Field::IsGetterName(found_obj_name)) {
10394 found_obj_name = Field::NameFromGetter(found_obj_name);
10395 }
10396 String& second_obj_name = String::Handle(obj.DictionaryName());
10397 if (Field::IsGetterName(second_obj_name)) {
10398 second_obj_name = Field::NameFromGetter(second_obj_name);
10399 }
10400 if (found_obj_name.Equals(second_obj_name)) {
10401 return Object::null();
10402 }
10366 } 10403 }
10367 } 10404 }
10368 } 10405 }
10369 } 10406 }
10370 return found_obj.raw(); 10407 return found_obj.raw();
10371 } 10408 }
10372 10409
10373 10410
10374 RawClass* LibraryPrefix::LookupClass(const String& class_name) const { 10411 RawClass* LibraryPrefix::LookupClass(const String& class_name) const {
10375 const Object& obj = Object::Handle(LookupObject(class_name)); 10412 const Object& obj = Object::Handle(LookupObject(class_name));
(...skipping 11325 matching lines...) Expand 10 before | Expand all | Expand 10 after
21701 return UserTag::null(); 21738 return UserTag::null();
21702 } 21739 }
21703 21740
21704 21741
21705 const char* UserTag::ToCString() const { 21742 const char* UserTag::ToCString() const {
21706 const String& tag_label = String::Handle(label()); 21743 const String& tag_label = String::Handle(label());
21707 return tag_label.ToCString(); 21744 return tag_label.ToCString();
21708 } 21745 }
21709 21746
21710 } // namespace dart 21747 } // namespace dart
OLDNEW
« no previous file with comments | « no previous file | runtime/vm/parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698