| OLD | NEW |
| 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 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 V(CoreLibrary, int, _parse) \ | 162 V(CoreLibrary, int, _parse) \ |
| 163 V(CoreLibrary, StackTrace, _setupFullStackTrace) \ | 163 V(CoreLibrary, StackTrace, _setupFullStackTrace) \ |
| 164 V(CoreLibrary, _OneByteString, _setAt) \ | 164 V(CoreLibrary, _OneByteString, _setAt) \ |
| 165 | 165 |
| 166 | 166 |
| 167 static void MarkFunctionAsInvisible(const Library& lib, | 167 static void MarkFunctionAsInvisible(const Library& lib, |
| 168 const char* class_name, | 168 const char* class_name, |
| 169 const char* function_name) { | 169 const char* function_name) { |
| 170 ASSERT(!lib.IsNull()); | 170 ASSERT(!lib.IsNull()); |
| 171 const Class& cls = Class::Handle( | 171 const Class& cls = Class::Handle( |
| 172 lib.LookupClassAllowPrivate(String::Handle(String::New(class_name)), | 172 lib.LookupClassAllowPrivate(String::Handle(String::New(class_name)))); |
| 173 NULL)); // No ambiguity error expected. | |
| 174 ASSERT(!cls.IsNull()); | 173 ASSERT(!cls.IsNull()); |
| 175 const Function& function = | 174 const Function& function = |
| 176 Function::Handle( | 175 Function::Handle( |
| 177 cls.LookupFunctionAllowPrivate( | 176 cls.LookupFunctionAllowPrivate( |
| 178 String::Handle(String::New(function_name)))); | 177 String::Handle(String::New(function_name)))); |
| 179 ASSERT(!function.IsNull()); | 178 ASSERT(!function.IsNull()); |
| 180 function.set_is_visible(false); | 179 function.set_is_visible(false); |
| 181 } | 180 } |
| 182 | 181 |
| 183 | 182 |
| (...skipping 2032 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2216 signature_function.set_signature_class(*this); | 2215 signature_function.set_signature_class(*this); |
| 2217 ASSERT(IsCanonicalSignatureClass()); | 2216 ASSERT(IsCanonicalSignatureClass()); |
| 2218 } | 2217 } |
| 2219 set_is_prefinalized(); | 2218 set_is_prefinalized(); |
| 2220 } | 2219 } |
| 2221 | 2220 |
| 2222 | 2221 |
| 2223 RawClass* Class::NewNativeWrapper(const Library& library, | 2222 RawClass* Class::NewNativeWrapper(const Library& library, |
| 2224 const String& name, | 2223 const String& name, |
| 2225 int field_count) { | 2224 int field_count) { |
| 2226 String& ambiguity_error_msg = String::Handle(); | 2225 Class& cls = Class::Handle(library.LookupClass(name)); |
| 2227 Class& cls = Class::Handle(library.LookupClass(name, &ambiguity_error_msg)); | |
| 2228 if (cls.IsNull()) { | 2226 if (cls.IsNull()) { |
| 2229 if (!ambiguity_error_msg.IsNull()) { | |
| 2230 return Class::null(); | |
| 2231 } | |
| 2232 cls = New(name, Script::Handle(), Scanner::kDummyTokenIndex); | 2227 cls = New(name, Script::Handle(), Scanner::kDummyTokenIndex); |
| 2233 cls.SetFields(Object::empty_array()); | 2228 cls.SetFields(Object::empty_array()); |
| 2234 cls.SetFunctions(Object::empty_array()); | 2229 cls.SetFunctions(Object::empty_array()); |
| 2235 // Set super class to Object. | 2230 // Set super class to Object. |
| 2236 cls.set_super_type(Type::Handle(Type::ObjectType())); | 2231 cls.set_super_type(Type::Handle(Type::ObjectType())); |
| 2237 // Compute instance size. First word contains a pointer to a properly | 2232 // Compute instance size. First word contains a pointer to a properly |
| 2238 // sized typed array once the first native field has been set. | 2233 // sized typed array once the first native field has been set. |
| 2239 intptr_t instance_size = sizeof(RawObject) + kWordSize; | 2234 intptr_t instance_size = sizeof(RawObject) + kWordSize; |
| 2240 cls.set_instance_size(RoundedAllocationSize(instance_size)); | 2235 cls.set_instance_size(RoundedAllocationSize(instance_size)); |
| 2241 cls.set_next_field_offset(instance_size); | 2236 cls.set_next_field_offset(instance_size); |
| (...skipping 4486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6728 GrowDictionary(dict, dict_size); | 6723 GrowDictionary(dict, dict_size); |
| 6729 } | 6724 } |
| 6730 | 6725 |
| 6731 // Invalidate the cache of loaded scripts. | 6726 // Invalidate the cache of loaded scripts. |
| 6732 if (loaded_scripts() != Array::null()) { | 6727 if (loaded_scripts() != Array::null()) { |
| 6733 StorePointer(&raw_ptr()->loaded_scripts_, Array::null()); | 6728 StorePointer(&raw_ptr()->loaded_scripts_, Array::null()); |
| 6734 } | 6729 } |
| 6735 } | 6730 } |
| 6736 | 6731 |
| 6737 | 6732 |
| 6738 // Lookup a name in the library's export namespace. | 6733 // Lookup a name in the library's re-export namespace. The name is |
| 6739 RawObject* Library::LookupExport(const String& name) const { | 6734 // unmangled, i.e. no getter or setter names should be looked up. |
| 6735 RawObject* Library::LookupReExport(const String& name) const { |
| 6740 if (HasExports()) { | 6736 if (HasExports()) { |
| 6741 const Array& exports = Array::Handle(this->exports()); | 6737 const Array& exports = Array::Handle(this->exports()); |
| 6742 // Break potential export cycle while looking up name. | 6738 // Break potential export cycle while looking up name. |
| 6743 StorePointer(&raw_ptr()->exports_, Object::empty_array().raw()); | 6739 StorePointer(&raw_ptr()->exports_, Object::empty_array().raw()); |
| 6744 Namespace& ns = Namespace::Handle(); | 6740 Namespace& ns = Namespace::Handle(); |
| 6745 Object& obj = Object::Handle(); | 6741 Object& obj = Object::Handle(); |
| 6746 for (int i = 0; i < exports.Length(); i++) { | 6742 for (int i = 0; i < exports.Length(); i++) { |
| 6747 ns ^= exports.At(i); | 6743 ns ^= exports.At(i); |
| 6748 obj = ns.Lookup(name); | 6744 obj = ns.Lookup(name); |
| 6749 if (!obj.IsNull()) { | 6745 if (!obj.IsNull()) { |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6907 name.CharAt(0) == '_') || | 6903 name.CharAt(0) == '_') || |
| 6908 (name.Length() >= 5 && | 6904 (name.Length() >= 5 && |
| 6909 (name.CharAt(4) == '_' && | 6905 (name.CharAt(4) == '_' && |
| 6910 (name.CharAt(0) == 'g' || name.CharAt(0) == 's') && | 6906 (name.CharAt(0) == 'g' || name.CharAt(0) == 's') && |
| 6911 name.CharAt(1) == 'e' && | 6907 name.CharAt(1) == 'e' && |
| 6912 name.CharAt(2) == 't' && | 6908 name.CharAt(2) == 't' && |
| 6913 name.CharAt(3) == ':')); | 6909 name.CharAt(3) == ':')); |
| 6914 } | 6910 } |
| 6915 | 6911 |
| 6916 | 6912 |
| 6917 RawField* Library::LookupFieldAllowPrivate(const String& name, | 6913 RawField* Library::LookupFieldAllowPrivate(const String& name) const { |
| 6918 String* ambiguity_error_msg) const { | 6914 Object& obj = Object::Handle(LookupObjectAllowPrivate(name)); |
| 6919 Object& obj = Object::Handle( | |
| 6920 LookupObjectAllowPrivate(name, ambiguity_error_msg)); | |
| 6921 if (obj.IsField()) { | 6915 if (obj.IsField()) { |
| 6922 return Field::Cast(obj).raw(); | 6916 return Field::Cast(obj).raw(); |
| 6923 } | 6917 } |
| 6924 return Field::null(); | 6918 return Field::null(); |
| 6925 } | 6919 } |
| 6926 | 6920 |
| 6927 | 6921 |
| 6928 RawField* Library::LookupLocalField(const String& name) const { | 6922 RawField* Library::LookupLocalField(const String& name) const { |
| 6929 Object& obj = Object::Handle(LookupLocalObjectAllowPrivate(name)); | 6923 Object& obj = Object::Handle(LookupLocalObjectAllowPrivate(name)); |
| 6930 if (obj.IsField()) { | 6924 if (obj.IsField()) { |
| 6931 return Field::Cast(obj).raw(); | 6925 return Field::Cast(obj).raw(); |
| 6932 } | 6926 } |
| 6933 return Field::null(); | 6927 return Field::null(); |
| 6934 } | 6928 } |
| 6935 | 6929 |
| 6936 | 6930 |
| 6937 RawFunction* Library::LookupFunctionAllowPrivate( | 6931 RawFunction* Library::LookupFunctionAllowPrivate(const String& name) const { |
| 6938 const String& name, | 6932 Object& obj = Object::Handle(LookupObjectAllowPrivate(name)); |
| 6939 String* ambiguity_error_msg) const { | |
| 6940 Object& obj = Object::Handle( | |
| 6941 LookupObjectAllowPrivate(name, ambiguity_error_msg)); | |
| 6942 if (obj.IsFunction()) { | 6933 if (obj.IsFunction()) { |
| 6943 return Function::Cast(obj).raw(); | 6934 return Function::Cast(obj).raw(); |
| 6944 } | 6935 } |
| 6945 return Function::null(); | 6936 return Function::null(); |
| 6946 } | 6937 } |
| 6947 | 6938 |
| 6948 | 6939 |
| 6949 RawFunction* Library::LookupLocalFunction(const String& name) const { | 6940 RawFunction* Library::LookupLocalFunction(const String& name) const { |
| 6950 Object& obj = Object::Handle(LookupLocalObjectAllowPrivate(name)); | 6941 Object& obj = Object::Handle(LookupLocalObjectAllowPrivate(name)); |
| 6951 if (obj.IsFunction()) { | 6942 if (obj.IsFunction()) { |
| 6952 return Function::Cast(obj).raw(); | 6943 return Function::Cast(obj).raw(); |
| 6953 } | 6944 } |
| 6954 return Function::null(); | 6945 return Function::null(); |
| 6955 } | 6946 } |
| 6956 | 6947 |
| 6957 | 6948 |
| 6958 RawObject* Library::LookupLocalObjectAllowPrivate(const String& name) const { | 6949 RawObject* Library::LookupLocalObjectAllowPrivate(const String& name) const { |
| 6959 Isolate* isolate = Isolate::Current(); | 6950 Isolate* isolate = Isolate::Current(); |
| 6960 Object& obj = Object::Handle(isolate, Object::null()); | 6951 Object& obj = Object::Handle(isolate, Object::null()); |
| 6961 obj = LookupLocalObject(name); | 6952 obj = LookupLocalObject(name); |
| 6962 if (obj.IsNull() && ShouldBePrivate(name)) { | 6953 if (obj.IsNull() && ShouldBePrivate(name)) { |
| 6963 String& private_name = String::Handle(isolate, PrivateName(name)); | 6954 String& private_name = String::Handle(isolate, PrivateName(name)); |
| 6964 obj = LookupLocalObject(private_name); | 6955 obj = LookupLocalObject(private_name); |
| 6965 } | 6956 } |
| 6966 return obj.raw(); | 6957 return obj.raw(); |
| 6967 } | 6958 } |
| 6968 | 6959 |
| 6969 | 6960 |
| 6970 RawObject* Library::LookupObjectAllowPrivate( | 6961 RawObject* Library::LookupObjectAllowPrivate(const String& name) const { |
| 6971 const String& name, | |
| 6972 String* ambiguity_error_msg) const { | |
| 6973 // First check if name is found in the local scope of the library. | 6962 // First check if name is found in the local scope of the library. |
| 6974 Object& obj = Object::Handle(LookupLocalObjectAllowPrivate(name)); | 6963 Object& obj = Object::Handle(LookupLocalObjectAllowPrivate(name)); |
| 6975 if (!obj.IsNull()) { | 6964 if (!obj.IsNull()) { |
| 6976 return obj.raw(); | 6965 return obj.raw(); |
| 6977 } | 6966 } |
| 6978 | 6967 |
| 6979 // Do not look up private names in imported libraries. | 6968 // Do not look up private names in imported libraries. |
| 6980 if (ShouldBePrivate(name)) { | 6969 if (ShouldBePrivate(name)) { |
| 6981 return Object::null(); | 6970 return Object::null(); |
| 6982 } | 6971 } |
| 6983 | 6972 |
| 6984 // Now check if name is found in any imported libs. It is a compile-time error | 6973 // Now check if name is found in any imported libs. |
| 6985 // if the name is found in more than one import and actually used. | 6974 return LookupImportedObject(name); |
| 6986 return LookupImportedObject(name, ambiguity_error_msg); | |
| 6987 } | 6975 } |
| 6988 | 6976 |
| 6989 | 6977 |
| 6990 RawObject* Library::LookupObject(const String& name, | 6978 RawObject* Library::LookupObject(const String& name) const { |
| 6991 String* ambiguity_error_msg) const { | |
| 6992 // First check if name is found in the local scope of the library. | 6979 // First check if name is found in the local scope of the library. |
| 6993 Object& obj = Object::Handle(LookupLocalObject(name)); | 6980 Object& obj = Object::Handle(LookupLocalObject(name)); |
| 6994 if (!obj.IsNull()) { | 6981 if (!obj.IsNull()) { |
| 6995 return obj.raw(); | 6982 return obj.raw(); |
| 6996 } | 6983 } |
| 6997 // Now check if name is found in any imported libs. It is a compile-time error | 6984 // Now check if name is found in any imported libs. |
| 6998 // if the name is found in more than one import and actually used. | 6985 return LookupImportedObject(name); |
| 6999 return LookupImportedObject(name, ambiguity_error_msg); | |
| 7000 } | 6986 } |
| 7001 | 6987 |
| 7002 | 6988 |
| 7003 RawObject* Library::LookupImportedObject(const String& name, | 6989 RawObject* Library::LookupImportedObject(const String& name) const { |
| 7004 String* ambiguity_error_msg) const { | |
| 7005 Object& obj = Object::Handle(); | 6990 Object& obj = Object::Handle(); |
| 7006 Namespace& import = Namespace::Handle(); | 6991 Namespace& import = Namespace::Handle(); |
| 7007 Library& import_lib = Library::Handle(); | 6992 Library& import_lib = Library::Handle(); |
| 6993 String& import_lib_url = String::Handle(); |
| 7008 String& first_import_lib_url = String::Handle(); | 6994 String& first_import_lib_url = String::Handle(); |
| 7009 Object& found_obj = Object::Handle(); | 6995 Object& found_obj = Object::Handle(); |
| 7010 for (intptr_t i = 0; i < num_imports(); i++) { | 6996 for (intptr_t i = 0; i < num_imports(); i++) { |
| 7011 import ^= ImportAt(i); | 6997 import ^= ImportAt(i); |
| 7012 obj = import.Lookup(name); | 6998 obj = import.Lookup(name); |
| 7013 if (!obj.IsNull()) { | 6999 if (!obj.IsNull()) { |
| 7014 import_lib = import.library(); | 7000 import_lib = import.library(); |
| 7015 if (!first_import_lib_url.IsNull()) { | 7001 import_lib_url = import_lib.url(); |
| 7016 // Found duplicate definition. | 7002 if (found_obj.raw() != obj.raw()) { |
| 7017 const intptr_t kMessageBufferSize = 512; | 7003 if (first_import_lib_url.IsNull() || |
| 7018 char message_buffer[kMessageBufferSize]; | 7004 first_import_lib_url.StartsWith(Symbols::DartScheme())) { |
| 7019 if (first_import_lib_url.raw() == url()) { | 7005 // This is the first object we found, or the |
| 7020 OS::SNPrint(message_buffer, | 7006 // previously found object is exported from a Dart |
| 7021 kMessageBufferSize, | 7007 // system library. The newly found object hides the one |
| 7022 "ambiguous reference to '%s', " | 7008 // from the Dart library. |
| 7023 "as library '%s' is imported multiple times", | 7009 first_import_lib_url = import_lib.url(); |
| 7024 name.ToCString(), | 7010 found_obj = obj.raw(); |
| 7025 first_import_lib_url.ToCString()); | 7011 } else if (import_lib_url.StartsWith(Symbols::DartScheme())) { |
| 7012 // The newly found object is exported from a Dart system |
| 7013 // library. It is hidden by the previously found object. |
| 7014 // We continue to search. |
| 7026 } else { | 7015 } else { |
| 7027 OS::SNPrint(message_buffer, | 7016 // We found two different objects with the same name. |
| 7028 kMessageBufferSize, | 7017 return Object::null(); |
| 7029 "ambiguous reference: " | |
| 7030 "'%s' is defined in library '%s' and also in '%s'", | |
| 7031 name.ToCString(), | |
| 7032 first_import_lib_url.ToCString(), | |
| 7033 String::Handle(url()).ToCString()); | |
| 7034 } | 7018 } |
| 7035 // If the caller does not expect an ambiguity error, it may pass NULL as | |
| 7036 // ambiguity_error_msg in order to avoid the allocation of a handle. | |
| 7037 // It typically does so when looking up an object in the core library, | |
| 7038 // which is guaranteed not to contain ambiguities, unless the core lib | |
| 7039 // is under development, in which case the assert below may fail. | |
| 7040 ASSERT(ambiguity_error_msg != NULL); // No ambiguity error expected. | |
| 7041 *ambiguity_error_msg = String::New(message_buffer); | |
| 7042 return Object::null(); | |
| 7043 } | 7019 } |
| 7044 first_import_lib_url = url(); | |
| 7045 found_obj = obj.raw(); | |
| 7046 } | 7020 } |
| 7047 } | 7021 } |
| 7048 return found_obj.raw(); | 7022 return found_obj.raw(); |
| 7049 } | 7023 } |
| 7050 | 7024 |
| 7051 | 7025 |
| 7052 RawClass* Library::LookupClass(const String& name, | 7026 RawClass* Library::LookupClass(const String& name) const { |
| 7053 String* ambiguity_error_msg) const { | 7027 Object& obj = Object::Handle(LookupObject(name)); |
| 7054 Object& obj = Object::Handle(LookupObject(name, ambiguity_error_msg)); | |
| 7055 if (obj.IsClass()) { | 7028 if (obj.IsClass()) { |
| 7056 return Class::Cast(obj).raw(); | 7029 return Class::Cast(obj).raw(); |
| 7057 } | 7030 } |
| 7058 return Class::null(); | 7031 return Class::null(); |
| 7059 } | 7032 } |
| 7060 | 7033 |
| 7061 | 7034 |
| 7062 RawClass* Library::LookupLocalClass(const String& name) const { | 7035 RawClass* Library::LookupLocalClass(const String& name) const { |
| 7063 Object& obj = Object::Handle(LookupLocalObject(name)); | 7036 Object& obj = Object::Handle(LookupLocalObject(name)); |
| 7064 if (obj.IsClass()) { | 7037 if (obj.IsClass()) { |
| 7065 return Class::Cast(obj).raw(); | 7038 return Class::Cast(obj).raw(); |
| 7066 } | 7039 } |
| 7067 return Class::null(); | 7040 return Class::null(); |
| 7068 } | 7041 } |
| 7069 | 7042 |
| 7070 | 7043 |
| 7071 RawClass* Library::LookupClassAllowPrivate(const String& name, | 7044 RawClass* Library::LookupClassAllowPrivate(const String& name) const { |
| 7072 String* ambiguity_error_msg) const { | |
| 7073 // See if the class is available in this library or in the top level | 7045 // See if the class is available in this library or in the top level |
| 7074 // scope of any imported library. | 7046 // scope of any imported library. |
| 7075 Isolate* isolate = Isolate::Current(); | 7047 Isolate* isolate = Isolate::Current(); |
| 7076 const Class& cls = Class::Handle(isolate, LookupClass(name, | 7048 const Class& cls = Class::Handle(isolate, LookupClass(name)); |
| 7077 ambiguity_error_msg)); | |
| 7078 if (!cls.IsNull()) { | 7049 if (!cls.IsNull()) { |
| 7079 return cls.raw(); | 7050 return cls.raw(); |
| 7080 } | 7051 } |
| 7081 | 7052 |
| 7082 // Now try to lookup the class using its private name, but only in | 7053 // Now try to lookup the class using its private name, but only in |
| 7083 // this library (not in imported libraries). | 7054 // this library (not in imported libraries). |
| 7084 if (ShouldBePrivate(name)) { | 7055 if (ShouldBePrivate(name)) { |
| 7085 String& private_name = String::Handle(isolate, PrivateName(name)); | 7056 String& private_name = String::Handle(isolate, PrivateName(name)); |
| 7086 const Object& obj = Object::Handle(LookupLocalObject(private_name)); | 7057 const Object& obj = Object::Handle(LookupLocalObject(private_name)); |
| 7087 if (obj.IsClass()) { | 7058 if (obj.IsClass()) { |
| (...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7549 if (num_current_imports >= length) { | 7520 if (num_current_imports >= length) { |
| 7550 const intptr_t new_length = length + kIncrementSize; | 7521 const intptr_t new_length = length + kIncrementSize; |
| 7551 imports = Array::Grow(imports, new_length, Heap::kOld); | 7522 imports = Array::Grow(imports, new_length, Heap::kOld); |
| 7552 set_imports(imports); | 7523 set_imports(imports); |
| 7553 } | 7524 } |
| 7554 imports.SetAt(num_current_imports, import); | 7525 imports.SetAt(num_current_imports, import); |
| 7555 set_num_imports(num_current_imports + 1); | 7526 set_num_imports(num_current_imports + 1); |
| 7556 } | 7527 } |
| 7557 | 7528 |
| 7558 | 7529 |
| 7559 RawClass* LibraryPrefix::LookupClass(const String& class_name, | 7530 RawObject* LibraryPrefix::LookupObject(const String& name) const { |
| 7560 String* ambiguity_error_msg) const { | |
| 7561 Array& imports = Array::Handle(this->imports()); | 7531 Array& imports = Array::Handle(this->imports()); |
| 7562 Object& obj = Object::Handle(); | 7532 Object& obj = Object::Handle(); |
| 7563 Namespace& import = Namespace::Handle(); | 7533 Namespace& import = Namespace::Handle(); |
| 7564 Library& import_lib = Library::Handle(); | 7534 Library& import_lib = Library::Handle(); |
| 7535 String& import_lib_url = String::Handle(); |
| 7565 String& first_import_lib_url = String::Handle(); | 7536 String& first_import_lib_url = String::Handle(); |
| 7566 Object& found_obj = Object::Handle(); | 7537 Object& found_obj = Object::Handle(); |
| 7567 for (intptr_t i = 0; i < num_imports(); i++) { | 7538 for (intptr_t i = 0; i < num_imports(); i++) { |
| 7568 import ^= imports.At(i); | 7539 import ^= imports.At(i); |
| 7569 obj = import.Lookup(class_name); | 7540 obj = import.Lookup(name); |
| 7570 if (!obj.IsNull()) { | 7541 if (!obj.IsNull()) { |
| 7571 import_lib = import.library(); | 7542 import_lib = import.library(); |
| 7572 if (!first_import_lib_url.IsNull()) { | 7543 import_lib_url = import_lib.url(); |
| 7573 // Found duplicate definition. | 7544 if (found_obj.raw() != obj.raw()) { |
| 7574 const intptr_t kMessageBufferSize = 512; | 7545 if (first_import_lib_url.IsNull() || |
| 7575 char message_buffer[kMessageBufferSize]; | 7546 first_import_lib_url.StartsWith(Symbols::DartScheme())) { |
| 7576 if (first_import_lib_url.raw() == import_lib.url()) { | 7547 // This is the first object we found, or the |
| 7577 OS::SNPrint(message_buffer, | 7548 // previously found object is exported from a Dart |
| 7578 kMessageBufferSize, | 7549 // system library. The newly found object hides the one |
| 7579 "ambiguous reference to '%s', " | 7550 // from the Dart library. |
| 7580 "as library '%s' is imported multiple times via " | 7551 first_import_lib_url = import_lib.url(); |
| 7581 "prefix '%s'", | 7552 found_obj = obj.raw(); |
| 7582 class_name.ToCString(), | 7553 } else if (import_lib_url.StartsWith(Symbols::DartScheme())) { |
| 7583 first_import_lib_url.ToCString(), | 7554 // The newly found object is exported from a Dart system |
| 7584 String::Handle(name()).ToCString()); | 7555 // library. It is hidden by the previously found object. |
| 7556 // We continue to search. |
| 7585 } else { | 7557 } else { |
| 7586 OS::SNPrint(message_buffer, | 7558 // We found two different objects with the same name. |
| 7587 kMessageBufferSize, | 7559 return Object::null(); |
| 7588 "ambiguous reference: " | |
| 7589 "'%s' is defined in library '%s' and also in '%s', " | |
| 7590 "both imported via prefix '%s'", | |
| 7591 class_name.ToCString(), | |
| 7592 first_import_lib_url.ToCString(), | |
| 7593 String::Handle(import_lib.url()).ToCString(), | |
| 7594 String::Handle(name()).ToCString()); | |
| 7595 } | 7560 } |
| 7596 // If the caller does not expect an ambiguity error, it may pass NULL as | |
| 7597 // ambiguity_error_msg in order to avoid the allocation of a handle. | |
| 7598 // It typically does so when looking up a class in the core library, | |
| 7599 // which is guaranteed not to contain ambiguities, unless the core lib | |
| 7600 // is under development, in which case the assert below may fail. | |
| 7601 ASSERT(ambiguity_error_msg != NULL); // No ambiguity error expected. | |
| 7602 *ambiguity_error_msg = String::New(message_buffer); | |
| 7603 return Class::null(); | |
| 7604 } | 7561 } |
| 7605 first_import_lib_url = import_lib.url(); | |
| 7606 found_obj = obj.raw(); | |
| 7607 } | 7562 } |
| 7608 } | 7563 } |
| 7609 if (found_obj.IsClass()) { | 7564 return found_obj.raw(); |
| 7610 return Class::Cast(found_obj).raw(); | 7565 } |
| 7566 |
| 7567 |
| 7568 RawClass* LibraryPrefix::LookupClass(const String& class_name) const { |
| 7569 const Object& obj = Object::Handle(LookupObject(class_name)); |
| 7570 if (obj.IsClass()) { |
| 7571 return Class::Cast(obj).raw(); |
| 7611 } | 7572 } |
| 7612 return Class::null(); | 7573 return Class::null(); |
| 7613 } | 7574 } |
| 7614 | 7575 |
| 7615 | 7576 |
| 7616 RawLibraryPrefix* LibraryPrefix::New() { | 7577 RawLibraryPrefix* LibraryPrefix::New() { |
| 7617 ASSERT(Object::library_prefix_class() != Class::null()); | 7578 ASSERT(Object::library_prefix_class() != Class::null()); |
| 7618 RawObject* raw = Object::Allocate(LibraryPrefix::kClassId, | 7579 RawObject* raw = Object::Allocate(LibraryPrefix::kClassId, |
| 7619 LibraryPrefix::InstanceSize(), | 7580 LibraryPrefix::InstanceSize(), |
| 7620 Heap::kOld); | 7581 Heap::kOld); |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7719 } | 7680 } |
| 7720 // There is a list of visible names. The name we're looking for is not | 7681 // There is a list of visible names. The name we're looking for is not |
| 7721 // contained in the list, so it is hidden. | 7682 // contained in the list, so it is hidden. |
| 7722 return true; | 7683 return true; |
| 7723 } | 7684 } |
| 7724 // The name is not filtered out. | 7685 // The name is not filtered out. |
| 7725 return false; | 7686 return false; |
| 7726 } | 7687 } |
| 7727 | 7688 |
| 7728 | 7689 |
| 7690 // Look up object with given name in library and filter out hidden |
| 7691 // names. Also look up getters and setters. |
| 7729 RawObject* Namespace::Lookup(const String& name) const { | 7692 RawObject* Namespace::Lookup(const String& name) const { |
| 7730 Isolate* isolate = Isolate::Current(); | 7693 Isolate* isolate = Isolate::Current(); |
| 7731 const Library& lib = Library::Handle(isolate, library()); | 7694 const Library& lib = Library::Handle(isolate, library()); |
| 7732 intptr_t ignore = 0; | 7695 intptr_t ignore = 0; |
| 7696 |
| 7733 // Lookup the name in the library's symbols. | 7697 // Lookup the name in the library's symbols. |
| 7698 const String* filter_name = &name; |
| 7734 Object& obj = Object::Handle(isolate, lib.LookupEntry(name, &ignore)); | 7699 Object& obj = Object::Handle(isolate, lib.LookupEntry(name, &ignore)); |
| 7700 if (Field::IsGetterName(name)) { |
| 7701 filter_name = &String::Handle(Field::NameFromGetter(name)); |
| 7702 } else if (Field::IsSetterName(name)) { |
| 7703 filter_name = &String::Handle(Field::NameFromGetter(name)); |
| 7704 } else { |
| 7705 if (obj.IsNull() || obj.IsLibraryPrefix()) { |
| 7706 obj = lib.LookupEntry(String::Handle(Field::GetterName(name)), &ignore); |
| 7707 if (obj.IsNull()) { |
| 7708 obj = lib.LookupEntry(String::Handle(Field::SetterName(name)), &ignore); |
| 7709 } |
| 7710 } |
| 7711 } |
| 7712 |
| 7735 // Library prefixes are not exported. | 7713 // Library prefixes are not exported. |
| 7736 if (obj.IsNull() || obj.IsLibraryPrefix()) { | 7714 if (obj.IsNull() || obj.IsLibraryPrefix()) { |
| 7737 // Lookup in the re-exported symbols. | 7715 // Lookup in the re-exported symbols. |
| 7738 obj = lib.LookupExport(name); | 7716 obj = lib.LookupReExport(name); |
| 7739 } | 7717 } |
| 7740 if (obj.IsNull() || HidesName(name) || obj.IsLibraryPrefix()) { | 7718 if (obj.IsNull() || HidesName(*filter_name) || obj.IsLibraryPrefix()) { |
| 7741 return Object::null(); | 7719 return Object::null(); |
| 7742 } | 7720 } |
| 7743 return obj.raw(); | 7721 return obj.raw(); |
| 7744 } | 7722 } |
| 7745 | 7723 |
| 7746 | 7724 |
| 7747 RawNamespace* Namespace::New() { | 7725 RawNamespace* Namespace::New() { |
| 7748 ASSERT(Object::namespace_class() != Class::null()); | 7726 ASSERT(Object::namespace_class() != Class::null()); |
| 7749 RawObject* raw = Object::Allocate(Namespace::kClassId, | 7727 RawObject* raw = Object::Allocate(Namespace::kClassId, |
| 7750 Namespace::InstanceSize(), | 7728 Namespace::InstanceSize(), |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7804 const char* class_name, | 7782 const char* class_name, |
| 7805 const char* function_name) { | 7783 const char* function_name) { |
| 7806 Function& func = Function::Handle(); | 7784 Function& func = Function::Handle(); |
| 7807 String& class_str = String::Handle(); | 7785 String& class_str = String::Handle(); |
| 7808 String& func_str = String::Handle(); | 7786 String& func_str = String::Handle(); |
| 7809 Class& cls = Class::Handle(); | 7787 Class& cls = Class::Handle(); |
| 7810 for (intptr_t l = 0; l < libs.length(); l++) { | 7788 for (intptr_t l = 0; l < libs.length(); l++) { |
| 7811 const Library& lib = *libs[l]; | 7789 const Library& lib = *libs[l]; |
| 7812 if (strcmp(class_name, "::") == 0) { | 7790 if (strcmp(class_name, "::") == 0) { |
| 7813 func_str = Symbols::New(function_name); | 7791 func_str = Symbols::New(function_name); |
| 7814 func = lib.LookupFunctionAllowPrivate(func_str, NULL); | 7792 func = lib.LookupFunctionAllowPrivate(func_str); |
| 7815 } else { | 7793 } else { |
| 7816 class_str = String::New(class_name); | 7794 class_str = String::New(class_name); |
| 7817 cls = lib.LookupClassAllowPrivate(class_str, NULL); | 7795 cls = lib.LookupClassAllowPrivate(class_str); |
| 7818 if (!cls.IsNull()) { | 7796 if (!cls.IsNull()) { |
| 7819 func_str = String::New(function_name); | 7797 func_str = String::New(function_name); |
| 7820 if (function_name[0] == '.') { | 7798 if (function_name[0] == '.') { |
| 7821 func_str = String::Concat(class_str, func_str); | 7799 func_str = String::Concat(class_str, func_str); |
| 7822 } | 7800 } |
| 7823 func = cls.LookupFunctionAllowPrivate(func_str); | 7801 func = cls.LookupFunctionAllowPrivate(func_str); |
| 7824 } | 7802 } |
| 7825 } | 7803 } |
| 7826 if (!func.IsNull()) { | 7804 if (!func.IsNull()) { |
| 7827 return func.raw(); | 7805 return func.raw(); |
| (...skipping 7119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14947 } | 14925 } |
| 14948 | 14926 |
| 14949 | 14927 |
| 14950 void MirrorReference::PrintToJSONStream(JSONStream* stream, bool ref) const { | 14928 void MirrorReference::PrintToJSONStream(JSONStream* stream, bool ref) const { |
| 14951 stream->OpenObject(); | 14929 stream->OpenObject(); |
| 14952 stream->CloseObject(); | 14930 stream->CloseObject(); |
| 14953 } | 14931 } |
| 14954 | 14932 |
| 14955 | 14933 |
| 14956 } // namespace dart | 14934 } // namespace dart |
| OLD | NEW |