Index: runtime/vm/object.cc |
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc |
index b012e5a80fe6bba680491c37853f7619fb627382..080d0e5550aaf632507b3ee2a2b459bbdecd8a6d 100644 |
--- a/runtime/vm/object.cc |
+++ b/runtime/vm/object.cc |
@@ -10093,6 +10093,9 @@ typedef UnorderedHashMap<StringEqualsTraits> ResolvedNamesMap; |
// obj is set to the cached entry. It may be null, indicating that the |
// name does not resolve to anything in this library. |
bool Library::LookupResolvedNamesCache(const String& name, Object* obj) const { |
+ if (resolved_names() == Array::null()) { |
+ return false; |
+ } |
ResolvedNamesMap cache(resolved_names()); |
bool present = false; |
*obj = cache.GetOrNull(name, &present); |
@@ -10119,6 +10122,9 @@ void Library::AddToResolvedNamesCache(const String& name, |
if (!FLAG_use_lib_cache || Compiler::IsBackgroundCompilation()) { |
return; |
} |
+ if (resolved_names() == Array::null()) { |
+ InitResolvedNamesCache(); |
+ } |
ResolvedNamesMap cache(resolved_names()); |
cache.UpdateOrInsert(name, obj); |
StorePointer(&raw_ptr()->resolved_names_, cache.Release().raw()); |
@@ -10153,7 +10159,7 @@ void Library::AddToExportedNamesCache(const String& name, |
return; |
} |
if (exported_names() == Array::null()) { |
- AllocateExportedNamesCache(); |
+ InitExportedNamesCache(); |
} |
ResolvedNamesMap cache(exported_names()); |
cache.UpdateOrInsert(name, obj); |
@@ -10167,7 +10173,7 @@ void Library::InvalidateResolvedName(const String& name) const { |
Object& entry = Object::Handle(zone); |
if (LookupResolvedNamesCache(name, &entry)) { |
// TODO(koda): Support deleted sentinel in snapshots and remove only 'name'. |
- InvalidateResolvedNamesCache(); |
+ ClearResolvedNamesCache(); |
} |
// When a new name is added to a library, we need to invalidate all |
// caches that contain an entry for this name. If the name was previously |
@@ -10179,18 +10185,12 @@ void Library::InvalidateResolvedName(const String& name) const { |
for (intptr_t i = 0; i < num_libs; i++) { |
lib ^= libs.At(i); |
if (lib.LookupExportedNamesCache(name, &entry)) { |
- lib.InitExportedNamesCache(); |
+ lib.ClearExportedNamesCache(); |
} |
} |
} |
-void Library::InvalidateResolvedNamesCache() const { |
- const intptr_t kInvalidatedCacheSize = 16; |
- InitResolvedNamesCache(kInvalidatedCacheSize); |
-} |
- |
- |
// Invalidate all exported names caches in the isolate. |
void Library::InvalidateExportedNamesCaches() { |
GrowableObjectArray& libs = GrowableObjectArray::Handle( |
@@ -10199,7 +10199,7 @@ void Library::InvalidateExportedNamesCaches() { |
intptr_t num_libs = libs.Length(); |
for (intptr_t i = 0; i < num_libs; i++) { |
lib ^= libs.At(i); |
- lib.InitExportedNamesCache(); |
+ lib.ClearExportedNamesCache(); |
} |
} |
@@ -10398,7 +10398,7 @@ bool Library::RemoveObject(const Object& obj, const String& name) const { |
intptr_t used_elements = Smi::Value(Smi::RawCast(dict.At(dict_size))) - 1; |
dict.SetAt(dict_size, Smi::Handle(zone, Smi::New(used_elements))); |
- InvalidateResolvedNamesCache(); |
+ ClearResolvedNamesCache(); |
InvalidateExportedNamesCaches(); |
return true; |
@@ -10811,24 +10811,27 @@ static RawArray* NewDictionary(intptr_t initial_size) { |
} |
-void Library::InitResolvedNamesCache(intptr_t size) const { |
+void Library::InitResolvedNamesCache() const { |
ASSERT(Thread::Current()->IsMutatorThread()); |
StorePointer(&raw_ptr()->resolved_names_, |
- HashTables::New<ResolvedNamesMap>(size)); |
+ HashTables::New<ResolvedNamesMap>(64)); |
+} |
+ |
+ |
+void Library::ClearResolvedNamesCache() const { |
+ ASSERT(Thread::Current()->IsMutatorThread()); |
+ StorePointer(&raw_ptr()->resolved_names_, Array::null()); |
} |
-void Library::AllocateExportedNamesCache() const { |
+void Library::InitExportedNamesCache() const { |
StorePointer(&raw_ptr()->exported_names_, |
HashTables::New<ResolvedNamesMap>(16)); |
} |
-void Library::InitExportedNamesCache() const { |
- if (exported_names() != Array::null()) { |
- StorePointer(&raw_ptr()->exported_names_, |
- HashTables::New<ResolvedNamesMap>(16)); |
- } |
+void Library::ClearExportedNamesCache() const { |
+ StorePointer(&raw_ptr()->exported_names_, Array::null()); |
} |
@@ -10867,8 +10870,7 @@ RawLibrary* Library::NewLibraryHelper(const String& url, bool import_core_lib) { |
const Library& result = Library::Handle(zone, Library::New()); |
result.StorePointer(&result.raw_ptr()->name_, Symbols::Empty().raw()); |
result.StorePointer(&result.raw_ptr()->url_, url.raw()); |
- result.StorePointer(&result.raw_ptr()->resolved_names_, |
- Object::empty_array().raw()); |
+ result.StorePointer(&result.raw_ptr()->resolved_names_, Array::null()); |
result.StorePointer(&result.raw_ptr()->exported_names_, Array::null()); |
result.StorePointer(&result.raw_ptr()->dictionary_, |
Object::empty_array().raw()); |
@@ -10901,8 +10903,6 @@ RawLibrary* Library::NewLibraryHelper(const String& url, bool import_core_lib) { |
result.StoreNonPointer(&result.raw_ptr()->load_state_, |
RawLibrary::kAllocated); |
result.StoreNonPointer(&result.raw_ptr()->index_, -1); |
- const intptr_t kInitialNameCacheSize = 64; |
- result.InitResolvedNamesCache(kInitialNameCacheSize); |
result.InitClassDictionary(); |
result.InitImportList(); |
result.AllocatePrivateKey(); |