Index: runtime/vm/isolate_reload.cc |
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc |
index 76882ec991a6018831d7ece9a27b9375b4425567..5537b5adc9e0e7288d1bf456c9859f8ef52a10fa 100644 |
--- a/runtime/vm/isolate_reload.cc |
+++ b/runtime/vm/isolate_reload.cc |
@@ -6,7 +6,6 @@ |
#include "vm/become.h" |
#include "vm/bit_vector.h" |
-#include "vm/runtime_entry.h" |
#include "vm/compiler.h" |
#include "vm/dart_api_impl.h" |
#include "vm/hash_table.h" |
@@ -15,6 +14,7 @@ |
#include "vm/object.h" |
#include "vm/object_store.h" |
#include "vm/parser.h" |
+#include "vm/runtime_entry.h" |
#include "vm/safepoint.h" |
#include "vm/service_event.h" |
#include "vm/stack_frame.h" |
@@ -53,7 +53,6 @@ DEFINE_FLAG(bool, |
TimelineDurationScope tds##name(Thread::Current(), \ |
Timeline::GetIsolateStream(), #name) |
- |
InstanceMorpher::InstanceMorpher(Zone* zone, const Class& from, const Class& to) |
: from_(Class::Handle(zone, from.raw())), |
to_(Class::Handle(zone, to.raw())), |
@@ -66,14 +65,12 @@ InstanceMorpher::InstanceMorpher(Zone* zone, const Class& from, const Class& to) |
ComputeMapping(); |
} |
- |
void InstanceMorpher::AddObject(RawObject* object) const { |
ASSERT(object->GetClassId() == cid()); |
const Instance& instance = Instance::Cast(Object::Handle(object)); |
before_->Add(&instance); |
} |
- |
void InstanceMorpher::ComputeMapping() { |
if (from_.NumTypeArguments()) { |
// Add copying of the optional type argument field. |
@@ -136,7 +133,6 @@ void InstanceMorpher::ComputeMapping() { |
} |
} |
- |
RawInstance* InstanceMorpher::Morph(const Instance& instance) const { |
const Instance& result = Instance::Handle(Instance::New(to_)); |
// Morph the context from instance to result using mapping_. |
@@ -152,7 +148,6 @@ RawInstance* InstanceMorpher::Morph(const Instance& instance) const { |
return result.raw(); |
} |
- |
void InstanceMorpher::RunNewFieldInitializers() const { |
if ((new_fields_->length() == 0) || (after_->length() == 0)) { |
return; |
@@ -194,7 +189,6 @@ void InstanceMorpher::RunNewFieldInitializers() const { |
} |
} |
- |
void InstanceMorpher::CreateMorphedCopies() const { |
for (intptr_t i = 0; i < before()->length(); i++) { |
const Instance& copy = Instance::Handle(Morph(*before()->At(i))); |
@@ -202,7 +196,6 @@ void InstanceMorpher::CreateMorphedCopies() const { |
} |
} |
- |
void InstanceMorpher::DumpFormatFor(const Class& cls) const { |
THR_Print("%s\n", cls.ToCString()); |
if (cls.NumTypeArguments()) { |
@@ -229,7 +222,6 @@ void InstanceMorpher::DumpFormatFor(const Class& cls) const { |
THR_Print("\n"); |
} |
- |
void InstanceMorpher::Dump() const { |
LogBlock blocker; |
THR_Print("Morphing from "); |
@@ -239,7 +231,6 @@ void InstanceMorpher::Dump() const { |
THR_Print("\n"); |
} |
- |
void InstanceMorpher::AppendTo(JSONArray* array) { |
JSONObject jsobj(array); |
jsobj.AddProperty("type", "ShapeChangeMapping"); |
@@ -253,26 +244,22 @@ void InstanceMorpher::AppendTo(JSONArray* array) { |
} |
} |
- |
void ReasonForCancelling::Report(IsolateReloadContext* context) { |
const Error& error = Error::Handle(ToError()); |
context->ReportError(error); |
} |
- |
RawError* ReasonForCancelling::ToError() { |
// By default create the error returned from ToString. |
const String& message = String::Handle(ToString()); |
return LanguageError::New(message); |
} |
- |
RawString* ReasonForCancelling::ToString() { |
UNREACHABLE(); |
return NULL; |
} |
- |
void ReasonForCancelling::AppendTo(JSONArray* array) { |
JSONObject jsobj(array); |
jsobj.AddProperty("type", "ReasonForCancelling"); |
@@ -280,7 +267,6 @@ void ReasonForCancelling::AppendTo(JSONArray* array) { |
jsobj.AddProperty("message", message.ToCString()); |
} |
- |
ClassReasonForCancelling::ClassReasonForCancelling(Zone* zone, |
const Class& from, |
const Class& to) |
@@ -288,7 +274,6 @@ ClassReasonForCancelling::ClassReasonForCancelling(Zone* zone, |
from_(Class::ZoneHandle(zone, from.raw())), |
to_(Class::ZoneHandle(zone, to.raw())) {} |
- |
void ClassReasonForCancelling::AppendTo(JSONArray* array) { |
JSONObject jsobj(array); |
jsobj.AddProperty("type", "ReasonForCancelling"); |
@@ -297,14 +282,12 @@ void ClassReasonForCancelling::AppendTo(JSONArray* array) { |
jsobj.AddProperty("message", message.ToCString()); |
} |
- |
RawError* IsolateReloadContext::error() const { |
ASSERT(reload_aborted()); |
// Report the first error to the surroundings. |
return reasons_to_cancel_reload_.At(0)->ToError(); |
} |
- |
class ScriptUrlSetTraits { |
public: |
static bool ReportStats() { return false; } |
@@ -321,7 +304,6 @@ class ScriptUrlSetTraits { |
static uword Hash(const Object& obj) { return String::Cast(obj).Hash(); } |
}; |
- |
class ClassMapTraits { |
public: |
static bool ReportStats() { return false; } |
@@ -339,7 +321,6 @@ class ClassMapTraits { |
} |
}; |
- |
class LibraryMapTraits { |
public: |
static bool ReportStats() { return false; } |
@@ -356,7 +337,6 @@ class LibraryMapTraits { |
static uword Hash(const Object& obj) { return Library::Cast(obj).UrlHash(); } |
}; |
- |
class BecomeMapTraits { |
public: |
static bool ReportStats() { return false; } |
@@ -383,7 +363,6 @@ class BecomeMapTraits { |
} |
}; |
- |
bool IsolateReloadContext::IsSameField(const Field& a, const Field& b) { |
if (a.is_static() != b.is_static()) { |
return false; |
@@ -401,7 +380,6 @@ bool IsolateReloadContext::IsSameField(const Field& a, const Field& b) { |
return a_name.Equals(b_name); |
} |
- |
bool IsolateReloadContext::IsSameClass(const Class& a, const Class& b) { |
if (a.is_patch() != b.is_patch()) { |
// TODO(johnmccutchan): Should we just check the class kind bits? |
@@ -427,7 +405,6 @@ bool IsolateReloadContext::IsSameClass(const Class& a, const Class& b) { |
return (a_lib.private_key() == b_lib.private_key()); |
} |
- |
bool IsolateReloadContext::IsSameLibrary(const Library& a_lib, |
const Library& b_lib) { |
const String& a_lib_url = |
@@ -437,7 +414,6 @@ bool IsolateReloadContext::IsSameLibrary(const Library& a_lib, |
return a_lib_url.Equals(b_lib_url); |
} |
- |
IsolateReloadContext::IsolateReloadContext(Isolate* isolate, JSONStream* js) |
: zone_(Thread::Current()->zone()), |
start_time_micros_(OS::GetCurrentMonotonicMicros()), |
@@ -472,12 +448,10 @@ IsolateReloadContext::IsolateReloadContext(Isolate* isolate, JSONStream* js) |
ASSERT(zone_ != NULL); |
} |
- |
IsolateReloadContext::~IsolateReloadContext() { |
ASSERT(saved_class_table_ == NULL); |
} |
- |
void IsolateReloadContext::ReportError(const Error& error) { |
if (FLAG_trace_reload) { |
THR_Print("ISO-RELOAD: Error: %s\n", error.ToErrorCString()); |
@@ -487,13 +461,11 @@ void IsolateReloadContext::ReportError(const Error& error) { |
Service::HandleEvent(&service_event); |
} |
- |
void IsolateReloadContext::ReportSuccess() { |
ServiceEvent service_event(I, ServiceEvent::kIsolateReload); |
Service::HandleEvent(&service_event); |
} |
- |
class Aborted : public ReasonForCancelling { |
public: |
Aborted(Zone* zone, const Error& error) |
@@ -509,7 +481,6 @@ class Aborted : public ReasonForCancelling { |
} |
}; |
- |
static intptr_t CommonSuffixLength(const char* a, const char* b) { |
const intptr_t a_length = strlen(a); |
const intptr_t b_length = strlen(b); |
@@ -528,7 +499,6 @@ static intptr_t CommonSuffixLength(const char* a, const char* b) { |
return (a_length - a_cursor); |
} |
- |
// NOTE: This function returns *after* FinalizeLoading is called. |
void IsolateReloadContext::Reload(bool force_reload, |
const char* root_script_url, |
@@ -660,7 +630,6 @@ void IsolateReloadContext::Reload(bool force_reload, |
} |
} |
- |
void IsolateReloadContext::RegisterClass(const Class& new_cls) { |
const Class& old_cls = Class::Handle(OldClassOrNull(new_cls)); |
if (old_cls.IsNull()) { |
@@ -687,7 +656,6 @@ void IsolateReloadContext::RegisterClass(const Class& new_cls) { |
AddClassMapping(new_cls, old_cls); |
} |
- |
// FinalizeLoading will be called *before* Reload() returns but will not be |
// called if the embedder fails to load sources. |
void IsolateReloadContext::FinalizeLoading() { |
@@ -712,7 +680,6 @@ void IsolateReloadContext::FinalizeLoading() { |
CommonFinalizeTail(); |
} |
- |
// FinalizeFailedLoad will be called *before* Reload() returns and will only |
// be called if the embedder fails to load sources. |
void IsolateReloadContext::FinalizeFailedLoad(const Error& error) { |
@@ -725,13 +692,11 @@ void IsolateReloadContext::FinalizeFailedLoad(const Error& error) { |
CommonFinalizeTail(); |
} |
- |
void IsolateReloadContext::CommonFinalizeTail() { |
ReportOnJSON(js_); |
reload_finalized_ = true; |
} |
- |
void IsolateReloadContext::ReportOnJSON(JSONStream* stream) { |
JSONObject jsobj(stream); |
jsobj.AddProperty("type", "ReloadReport"); |
@@ -771,7 +736,6 @@ void IsolateReloadContext::ReportOnJSON(JSONStream* stream) { |
} |
} |
- |
void IsolateReloadContext::EnsuredUnoptimizedCodeForStack() { |
TIMELINE_SCOPE(EnsuredUnoptimizedCodeForStack); |
StackFrameIterator it(StackFrameIterator::kDontValidateFrames, |
@@ -789,7 +753,6 @@ void IsolateReloadContext::EnsuredUnoptimizedCodeForStack() { |
} |
} |
- |
void IsolateReloadContext::DeoptimizeDependentCode() { |
TIMELINE_SCOPE(DeoptimizeDependentCode); |
ClassTable* class_table = I->class_table(); |
@@ -824,7 +787,6 @@ void IsolateReloadContext::DeoptimizeDependentCode() { |
// TODO(johnmccutchan): Also call LibraryPrefix::InvalidateDependentCode. |
} |
- |
void IsolateReloadContext::CheckpointClasses() { |
TIMELINE_SCOPE(CheckpointClasses); |
TIR_Print("---- CHECKPOINTING CLASSES\n"); |
@@ -865,10 +827,8 @@ void IsolateReloadContext::CheckpointClasses() { |
TIR_Print("---- System had %" Pd " classes\n", saved_num_cids_); |
} |
- |
Dart_FileModifiedCallback IsolateReloadContext::file_modified_callback_ = NULL; |
- |
bool IsolateReloadContext::ScriptModifiedSince(const Script& script, |
int64_t since) { |
if (file_modified_callback_ == NULL) { |
@@ -880,7 +840,6 @@ bool IsolateReloadContext::ScriptModifiedSince(const Script& script, |
return (*file_modified_callback_)(url_chars, since); |
} |
- |
static void PropagateLibraryModified( |
const ZoneGrowableArray<ZoneGrowableArray<intptr_t>*>* imported_by, |
intptr_t lib_index, |
@@ -895,7 +854,6 @@ static void PropagateLibraryModified( |
} |
} |
- |
BitVector* IsolateReloadContext::FindModifiedLibraries(bool force_reload) { |
Thread* thread = Thread::Current(); |
int64_t last_reload = I->last_reload_timestamp(); |
@@ -991,7 +949,6 @@ BitVector* IsolateReloadContext::FindModifiedLibraries(bool force_reload) { |
return modified_libs; |
} |
- |
void IsolateReloadContext::CheckpointLibraries() { |
TIMELINE_SCOPE(CheckpointLibraries); |
TIR_Print("---- CHECKPOINTING LIBRARIES\n"); |
@@ -1036,7 +993,6 @@ void IsolateReloadContext::CheckpointLibraries() { |
object_store()->set_root_library(Library::Handle()); |
} |
- |
// While reloading everything we do must be reversible so that we can abort |
// safely if the reload fails. This function stashes things to the side and |
// prepares the isolate for the reload attempt. |
@@ -1046,7 +1002,6 @@ void IsolateReloadContext::Checkpoint() { |
CheckpointLibraries(); |
} |
- |
void IsolateReloadContext::RollbackClasses() { |
TIR_Print("---- ROLLING BACK CLASS TABLE\n"); |
ASSERT(saved_num_cids_ > 0); |
@@ -1068,7 +1023,6 @@ void IsolateReloadContext::RollbackClasses() { |
class_table->AddOldTable(local_saved_class_table); |
} |
- |
void IsolateReloadContext::RollbackLibraries() { |
TIR_Print("---- ROLLING BACK LIBRARY CHANGES\n"); |
Thread* thread = Thread::Current(); |
@@ -1095,14 +1049,12 @@ void IsolateReloadContext::RollbackLibraries() { |
set_saved_libraries(GrowableObjectArray::Handle()); |
} |
- |
void IsolateReloadContext::Rollback() { |
TIR_Print("---- ROLLING BACK"); |
RollbackClasses(); |
RollbackLibraries(); |
} |
- |
#ifdef DEBUG |
void IsolateReloadContext::VerifyMaps() { |
TIMELINE_SCOPE(VerifyMaps); |
@@ -1139,7 +1091,6 @@ void IsolateReloadContext::VerifyMaps() { |
} |
#endif |
- |
void IsolateReloadContext::Commit() { |
TIMELINE_SCOPE(Commit); |
TIR_Print("---- COMMITTING RELOAD\n"); |
@@ -1307,7 +1258,6 @@ void IsolateReloadContext::Commit() { |
#endif // DEBUG |
} |
- |
void IsolateReloadContext::RehashConstants() { |
TIMELINE_SCOPE(RehashConstants); |
ClassTable* class_table = I->class_table(); |
@@ -1329,7 +1279,6 @@ void IsolateReloadContext::RehashConstants() { |
} |
} |
- |
bool IsolateReloadContext::IsDirty(const Library& lib) { |
const intptr_t index = lib.index(); |
if (index == static_cast<classid_t>(-1)) { |
@@ -1340,7 +1289,6 @@ bool IsolateReloadContext::IsDirty(const Library& lib) { |
return library_infos_[index].dirty; |
} |
- |
void IsolateReloadContext::PostCommit() { |
TIMELINE_SCOPE(PostCommit); |
set_saved_root_library(Library::Handle()); |
@@ -1349,19 +1297,16 @@ void IsolateReloadContext::PostCommit() { |
TIR_Print("---- DONE COMMIT\n"); |
} |
- |
void IsolateReloadContext::AddReasonForCancelling(ReasonForCancelling* reason) { |
reload_aborted_ = true; |
reasons_to_cancel_reload_.Add(reason); |
} |
- |
void IsolateReloadContext::AddInstanceMorpher(InstanceMorpher* morpher) { |
instance_morphers_.Add(morpher); |
cid_mapper_.Insert(morpher); |
} |
- |
void IsolateReloadContext::ReportReasonsForCancelling() { |
ASSERT(FLAG_reload_force_rollback || HasReasonsForCancelling()); |
for (int i = 0; i < reasons_to_cancel_reload_.length(); i++) { |
@@ -1369,7 +1314,6 @@ void IsolateReloadContext::ReportReasonsForCancelling() { |
} |
} |
- |
// The ObjectLocator is used for collecting instances that |
// needs to be morphed. |
class ObjectLocator : public ObjectVisitor { |
@@ -1394,7 +1338,6 @@ class ObjectLocator : public ObjectVisitor { |
intptr_t count_; |
}; |
- |
void IsolateReloadContext::MorphInstances() { |
TIMELINE_SCOPE(MorphInstances); |
ASSERT(HasInstanceMorphers()); |
@@ -1448,7 +1391,6 @@ void IsolateReloadContext::MorphInstances() { |
Become::ElementsForwardIdentity(before, after); |
} |
- |
void IsolateReloadContext::RunNewFieldInitializers() { |
// Run new field initializers on all instances. |
for (intptr_t i = 0; i < instance_morphers_.length(); i++) { |
@@ -1456,7 +1398,6 @@ void IsolateReloadContext::RunNewFieldInitializers() { |
} |
} |
- |
bool IsolateReloadContext::ValidateReload() { |
TIMELINE_SCOPE(ValidateReload); |
if (reload_aborted()) return false; |
@@ -1502,12 +1443,10 @@ bool IsolateReloadContext::ValidateReload() { |
return !FLAG_reload_force_rollback && !HasReasonsForCancelling(); |
} |
- |
RawClass* IsolateReloadContext::FindOriginalClass(const Class& cls) { |
return MappedClass(cls); |
} |
- |
RawClass* IsolateReloadContext::GetClassForHeapWalkAt(intptr_t cid) { |
RawClass** class_table = AtomicOperations::LoadRelaxed(&saved_class_table_); |
if (class_table != NULL) { |
@@ -1519,28 +1458,23 @@ RawClass* IsolateReloadContext::GetClassForHeapWalkAt(intptr_t cid) { |
} |
} |
- |
RawLibrary* IsolateReloadContext::saved_root_library() const { |
return saved_root_library_; |
} |
- |
void IsolateReloadContext::set_saved_root_library(const Library& value) { |
saved_root_library_ = value.raw(); |
} |
- |
RawGrowableObjectArray* IsolateReloadContext::saved_libraries() const { |
return saved_libraries_; |
} |
- |
void IsolateReloadContext::set_saved_libraries( |
const GrowableObjectArray& value) { |
saved_libraries_ = value.raw(); |
} |
- |
void IsolateReloadContext::VisitObjectPointers(ObjectPointerVisitor* visitor) { |
visitor->VisitPointers(from(), to()); |
if (saved_class_table_ != NULL) { |
@@ -1549,12 +1483,10 @@ void IsolateReloadContext::VisitObjectPointers(ObjectPointerVisitor* visitor) { |
} |
} |
- |
ObjectStore* IsolateReloadContext::object_store() { |
return isolate_->object_store(); |
} |
- |
void IsolateReloadContext::ResetUnoptimizedICsOnStack() { |
Thread* thread = Thread::Current(); |
StackZone stack_zone(thread); |
@@ -1582,7 +1514,6 @@ void IsolateReloadContext::ResetUnoptimizedICsOnStack() { |
} |
} |
- |
void IsolateReloadContext::ResetMegamorphicCaches() { |
object_store()->set_megamorphic_cache_table(GrowableObjectArray::Handle()); |
// Since any current optimized code will not make any more calls, it may be |
@@ -1591,7 +1522,6 @@ void IsolateReloadContext::ResetMegamorphicCaches() { |
// new ones. |
} |
- |
class MarkFunctionsForRecompilation : public ObjectVisitor { |
public: |
MarkFunctionsForRecompilation(Isolate* isolate, |
@@ -1676,7 +1606,6 @@ class MarkFunctionsForRecompilation : public ObjectVisitor { |
Zone* zone_; |
}; |
- |
void IsolateReloadContext::MarkAllFunctionsForRecompilation() { |
TIMELINE_SCOPE(MarkAllFunctionsForRecompilation); |
TIR_Print("---- MARKING ALL FUNCTIONS FOR RECOMPILATION\n"); |
@@ -1689,7 +1618,6 @@ void IsolateReloadContext::MarkAllFunctionsForRecompilation() { |
isolate_->heap()->VisitObjects(&visitor); |
} |
- |
void IsolateReloadContext::InvalidateWorld() { |
TIR_Print("---- INVALIDATING WORLD\n"); |
ResetMegamorphicCaches(); |
@@ -1698,7 +1626,6 @@ void IsolateReloadContext::InvalidateWorld() { |
MarkAllFunctionsForRecompilation(); |
} |
- |
RawClass* IsolateReloadContext::MappedClass(const Class& replacement_or_new) { |
UnorderedHashMap<ClassMapTraits> map(class_map_storage_); |
Class& cls = Class::Handle(); |
@@ -1708,13 +1635,11 @@ RawClass* IsolateReloadContext::MappedClass(const Class& replacement_or_new) { |
return cls.raw(); |
} |
- |
RawLibrary* IsolateReloadContext::MappedLibrary( |
const Library& replacement_or_new) { |
return Library::null(); |
} |
- |
RawClass* IsolateReloadContext::OldClassOrNull( |
const Class& replacement_or_new) { |
UnorderedHashSet<ClassMapTraits> old_classes_set(old_classes_set_storage_); |
@@ -1724,7 +1649,6 @@ RawClass* IsolateReloadContext::OldClassOrNull( |
return cls.raw(); |
} |
- |
RawString* IsolateReloadContext::FindLibraryPrivateKey( |
const Library& replacement_or_new) { |
const Library& old = Library::Handle(OldLibraryOrNull(replacement_or_new)); |
@@ -1739,7 +1663,6 @@ RawString* IsolateReloadContext::FindLibraryPrivateKey( |
return old.private_key(); |
} |
- |
RawLibrary* IsolateReloadContext::OldLibraryOrNull( |
const Library& replacement_or_new) { |
UnorderedHashSet<LibraryMapTraits> old_libraries_set( |
@@ -1754,7 +1677,6 @@ RawLibrary* IsolateReloadContext::OldLibraryOrNull( |
return lib.raw(); |
} |
- |
// Attempt to find the pair to |replacement_or_new| with the knowledge that |
// the base url prefix has moved. |
RawLibrary* IsolateReloadContext::OldLibraryOrNullBaseMoved( |
@@ -1794,7 +1716,6 @@ RawLibrary* IsolateReloadContext::OldLibraryOrNullBaseMoved( |
return Library::null(); |
} |
- |
void IsolateReloadContext::BuildLibraryMapping() { |
const GrowableObjectArray& libs = |
GrowableObjectArray::Handle(object_store()->libraries()); |
@@ -1822,7 +1743,6 @@ void IsolateReloadContext::BuildLibraryMapping() { |
} |
} |
- |
void IsolateReloadContext::AddClassMapping(const Class& replacement_or_new, |
const Class& original) { |
UnorderedHashMap<ClassMapTraits> map(class_map_storage_); |
@@ -1833,7 +1753,6 @@ void IsolateReloadContext::AddClassMapping(const Class& replacement_or_new, |
class_map_storage_ = map.Release().raw(); |
} |
- |
void IsolateReloadContext::AddLibraryMapping(const Library& replacement_or_new, |
const Library& original) { |
UnorderedHashMap<LibraryMapTraits> map(library_map_storage_); |
@@ -1844,7 +1763,6 @@ void IsolateReloadContext::AddLibraryMapping(const Library& replacement_or_new, |
library_map_storage_ = map.Release().raw(); |
} |
- |
void IsolateReloadContext::AddStaticFieldMapping(const Field& old_field, |
const Field& new_field) { |
ASSERT(old_field.is_static()); |
@@ -1853,7 +1771,6 @@ void IsolateReloadContext::AddStaticFieldMapping(const Field& old_field, |
AddBecomeMapping(old_field, new_field); |
} |
- |
void IsolateReloadContext::AddBecomeMapping(const Object& old, |
const Object& neu) { |
ASSERT(become_map_storage_ != Array::null()); |
@@ -1863,7 +1780,6 @@ void IsolateReloadContext::AddBecomeMapping(const Object& old, |
become_map_storage_ = become_map.Release().raw(); |
} |
- |
void IsolateReloadContext::AddEnumBecomeMapping(const Object& old, |
const Object& neu) { |
const GrowableObjectArray& become_enum_mappings = |
@@ -1873,7 +1789,6 @@ void IsolateReloadContext::AddEnumBecomeMapping(const Object& old, |
ASSERT((become_enum_mappings.Length() % 2) == 0); |
} |
- |
void IsolateReloadContext::RebuildDirectSubclasses() { |
ClassTable* class_table = I->class_table(); |
intptr_t num_cids = class_table->NumCids(); |