| Index: runtime/vm/object.cc
|
| diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
|
| index 4ceb70f39407412a19e071aa0682b219e3ba3f94..477d7cefdb850ca1f1900c42c844176c5d17cffd 100644
|
| --- a/runtime/vm/object.cc
|
| +++ b/runtime/vm/object.cc
|
| @@ -3041,6 +3041,7 @@ static RawFunction* EvaluateHelper(const Class& cls,
|
| RawObject* Class::Evaluate(const String& expr,
|
| const Array& param_names,
|
| const Array& param_values) const {
|
| + ASSERT(Thread::Current()->IsMutatorThread());
|
| const Function& eval_func =
|
| Function::Handle(EvaluateHelper(*this, expr, param_names, true));
|
| const Object& result =
|
| @@ -9315,6 +9316,7 @@ RawInstance* Library::TransitiveLoadError() const {
|
|
|
|
|
| void Library::AddPatchClass(const Class& cls) const {
|
| + ASSERT(Thread::Current()->IsMutatorThread());
|
| ASSERT(cls.is_patch());
|
| ASSERT(GetPatchClass(String::Handle(cls.Name())) == Class::null());
|
| const GrowableObjectArray& patch_classes =
|
| @@ -9324,6 +9326,7 @@ void Library::AddPatchClass(const Class& cls) const {
|
|
|
|
|
| RawClass* Library::GetPatchClass(const String& name) const {
|
| + ASSERT(Thread::Current()->IsMutatorThread());
|
| const GrowableObjectArray& patch_classes =
|
| GrowableObjectArray::Handle(this->patch_classes());
|
| Object& obj = Object::Handle();
|
| @@ -9339,6 +9342,7 @@ RawClass* Library::GetPatchClass(const String& name) const {
|
|
|
|
|
| void Library::RemovePatchClass(const Class& cls) const {
|
| + ASSERT(Thread::Current()->IsMutatorThread());
|
| ASSERT(cls.is_patch());
|
| const GrowableObjectArray& patch_classes =
|
| GrowableObjectArray::Handle(this->patch_classes());
|
| @@ -9406,6 +9410,7 @@ void Library::AddMetadata(const Object& owner,
|
| const String& name,
|
| TokenPosition token_pos) const {
|
| Thread* thread = Thread::Current();
|
| + ASSERT(thread->IsMutatorThread());
|
| Zone* zone = thread->zone();
|
| const String& metaname = String::Handle(zone, Symbols::New(thread, name));
|
| const Field& field = Field::Handle(zone,
|
| @@ -9493,6 +9498,7 @@ RawString* Library::MakeMetadataName(const Object& obj) const {
|
|
|
|
|
| RawField* Library::GetMetadataField(const String& metaname) const {
|
| + ASSERT(Thread::Current()->IsMutatorThread());
|
| const GrowableObjectArray& metadata =
|
| GrowableObjectArray::Handle(this->metadata());
|
| Field& entry = Field::Handle();
|
| @@ -9599,8 +9605,15 @@ bool Library::LookupResolvedNamesCache(const String& name,
|
| *obj = cache.GetOrNull(name, &present);
|
| // Mutator compiler thread may add entries and therefore
|
| // change 'resolved_names()' while running a background compilation;
|
| - // do not ASSERT that 'resolved_names()' has not changed.
|
| - cache.Release();
|
| + // ASSERT that 'resolved_names()' has not changed only in mutator.
|
| +#if defined(DEBUG)
|
| + if (Thread::Current()->IsMutatorThread()) {
|
| + ASSERT(cache.Release().raw() == resolved_names());
|
| + } else {
|
| + // Release must be called in debug mode.
|
| + cache.Release();
|
| + }
|
| +#endif
|
| return present;
|
| }
|
|
|
| @@ -9669,7 +9682,7 @@ void Library::GrowDictionary(const Array& dict, intptr_t dict_size) const {
|
|
|
|
|
| void Library::AddObject(const Object& obj, const String& name) const {
|
| - ASSERT(!Compiler::IsBackgroundCompilation());
|
| + ASSERT(Thread::Current()->IsMutatorThread());
|
| ASSERT(obj.IsClass() ||
|
| obj.IsFunction() ||
|
| obj.IsField() ||
|
| @@ -9789,8 +9802,10 @@ void Library::ReplaceObject(const Object& obj, const String& name) const {
|
|
|
|
|
| bool Library::RemoveObject(const Object& obj, const String& name) const {
|
| - ASSERT(!Compiler::IsBackgroundCompilation());
|
| - Object& entry = Object::Handle();
|
| + Thread* thread = Thread::Current();
|
| + ASSERT(thread->IsMutatorThread());
|
| + Zone* zone = thread->zone();
|
| + Object& entry = Object::Handle(zone);
|
|
|
| intptr_t index;
|
| entry = LookupEntry(name, &index);
|
| @@ -9798,12 +9813,12 @@ bool Library::RemoveObject(const Object& obj, const String& name) const {
|
| return false;
|
| }
|
|
|
| - const Array& dict = Array::Handle(dictionary());
|
| + const Array& dict = Array::Handle(zone, dictionary());
|
| dict.SetAt(index, Object::null_object());
|
| intptr_t dict_size = dict.Length() - 1;
|
|
|
| // Fix any downstream collisions.
|
| - String& key = String::Handle();
|
| + String& key = String::Handle(zone);
|
| for (;;) {
|
| index = (index + 1) % dict_size;
|
| entry = dict.At(index);
|
| @@ -9826,7 +9841,7 @@ bool Library::RemoveObject(const Object& obj, const String& name) const {
|
|
|
| // Update used count.
|
| intptr_t used_elements = Smi::Value(Smi::RawCast(dict.At(dict_size))) - 1;
|
| - dict.SetAt(dict_size, Smi::Handle(Smi::New(used_elements)));
|
| + dict.SetAt(dict_size, Smi::Handle(zone, Smi::New(used_elements)));
|
|
|
| InvalidateResolvedNamesCache();
|
|
|
| @@ -9864,6 +9879,7 @@ static void AddScriptIfUnique(const GrowableObjectArray& scripts,
|
|
|
|
|
| RawArray* Library::LoadedScripts() const {
|
| + ASSERT(Thread::Current()->IsMutatorThread());
|
| // We compute the list of loaded scripts lazily. The result is
|
| // cached in loaded_scripts_.
|
| if (loaded_scripts() == Array::null()) {
|
| @@ -10242,6 +10258,7 @@ static RawArray* NewDictionary(intptr_t initial_size) {
|
|
|
| void Library::InitResolvedNamesCache(intptr_t size,
|
| SnapshotReader* reader) const {
|
| + ASSERT(Thread::Current()->IsMutatorThread());
|
| if (reader == NULL) {
|
| StorePointer(&raw_ptr()->resolved_names_,
|
| HashTables::New<ResolvedNamesMap>(size));
|
| @@ -10280,7 +10297,10 @@ RawLibrary* Library::New() {
|
|
|
| RawLibrary* Library::NewLibraryHelper(const String& url,
|
| bool import_core_lib) {
|
| - const Library& result = Library::Handle(Library::New());
|
| + Thread* thread = Thread::Current();
|
| + Zone* zone = thread->zone();
|
| + ASSERT(thread->IsMutatorThread());
|
| + 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_,
|
| @@ -10314,9 +10334,9 @@ RawLibrary* Library::NewLibraryHelper(const String& url,
|
| result.InitImportList();
|
| result.AllocatePrivateKey();
|
| if (import_core_lib) {
|
| - const Library& core_lib = Library::Handle(Library::CoreLibrary());
|
| + const Library& core_lib = Library::Handle(zone, Library::CoreLibrary());
|
| ASSERT(!core_lib.IsNull());
|
| - const Namespace& ns = Namespace::Handle(
|
| + const Namespace& ns = Namespace::Handle(zone,
|
| Namespace::New(core_lib, Object::null_array(), Object::null_array()));
|
| result.AddImport(ns);
|
| }
|
|
|