| Index: runtime/vm/isolate_reload.cc
|
| diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
|
| index 139c6d4dbe38863c7a0dd8085390a88eadc1d2f5..cc9e113cae0dca2afe17e3fbe0fcd283477a6a11 100644
|
| --- a/runtime/vm/isolate_reload.cc
|
| +++ b/runtime/vm/isolate_reload.cc
|
| @@ -25,16 +25,24 @@
|
| namespace dart {
|
|
|
| DEFINE_FLAG(bool, trace_reload, false, "Trace isolate reloading");
|
| -DEFINE_FLAG(bool, trace_reload_verbose, false,
|
| +DEFINE_FLAG(bool,
|
| + trace_reload_verbose,
|
| + false,
|
| "trace isolate reloading verbose");
|
| DEFINE_FLAG(bool, identity_reload, false, "Enable checks for identity reload.");
|
| DEFINE_FLAG(int, reload_every, 0, "Reload every N stack overflow checks.");
|
| DEFINE_FLAG(bool, reload_every_optimized, true, "Only from optimized code.");
|
| -DEFINE_FLAG(bool, reload_every_back_off, false,
|
| +DEFINE_FLAG(bool,
|
| + reload_every_back_off,
|
| + false,
|
| "Double the --reload-every value after each reload.");
|
| -DEFINE_FLAG(bool, reload_force_rollback, false,
|
| +DEFINE_FLAG(bool,
|
| + reload_force_rollback,
|
| + false,
|
| "Force all reloads to fail and rollback.");
|
| -DEFINE_FLAG(bool, check_reloaded, false,
|
| +DEFINE_FLAG(bool,
|
| + check_reloaded,
|
| + false,
|
| "Assert that an isolate has reloaded at least once.")
|
| #ifndef PRODUCT
|
|
|
| @@ -42,9 +50,8 @@ DEFINE_FLAG(bool, check_reloaded, false,
|
| #define Z (thread->zone())
|
|
|
| #define TIMELINE_SCOPE(name) \
|
| - TimelineDurationScope tds##name(Thread::Current(), \
|
| - Timeline::GetIsolateStream(), \
|
| - #name)
|
| + TimelineDurationScope tds##name(Thread::Current(), \
|
| + Timeline::GetIsolateStream(), #name)
|
|
|
|
|
| InstanceMorpher::InstanceMorpher(Zone* zone, const Class& from, const Class& to)
|
| @@ -52,8 +59,8 @@ InstanceMorpher::InstanceMorpher(Zone* zone, const Class& from, const Class& to)
|
| to_(Class::Handle(zone, to.raw())),
|
| mapping_(zone, 0) {
|
| ComputeMapping();
|
| - before_ = new(zone) ZoneGrowableArray<const Instance*>(zone, 0);
|
| - after_ = new(zone) ZoneGrowableArray<const Instance*>(zone, 0);
|
| + before_ = new (zone) ZoneGrowableArray<const Instance*>(zone, 0);
|
| + after_ = new (zone) ZoneGrowableArray<const Instance*>(zone, 0);
|
| ASSERT(from_.id() == to_.id());
|
| cid_ = from_.id();
|
| }
|
| @@ -109,9 +116,9 @@ 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_.
|
| - for (intptr_t i = 0; i < mapping_.length(); i +=2) {
|
| + for (intptr_t i = 0; i < mapping_.length(); i += 2) {
|
| intptr_t from_offset = mapping_.At(i);
|
| - intptr_t to_offset = mapping_.At(i+1);
|
| + intptr_t to_offset = mapping_.At(i + 1);
|
| const Object& value =
|
| Object::Handle(instance.RawGetFieldAtOffset(from_offset));
|
| result.RawSetFieldAtOffset(to_offset, value);
|
| @@ -150,8 +157,8 @@ void InstanceMorpher::DumpFormatFor(const Class& cls) const {
|
| }
|
|
|
| THR_Print("Mapping: ");
|
| - for (int i = 0; i < mapping_.length(); i +=2) {
|
| - THR_Print(" %" Pd "->%" Pd, mapping_.At(i), mapping_.At(i+1));
|
| + for (int i = 0; i < mapping_.length(); i += 2) {
|
| + THR_Print(" %" Pd "->%" Pd, mapping_.At(i), mapping_.At(i + 1));
|
| }
|
| THR_Print("\n");
|
| }
|
| @@ -176,7 +183,7 @@ void InstanceMorpher::AppendTo(JSONArray* array) {
|
| for (int i = 0; i < mapping_.length(); i += 2) {
|
| JSONArray pair(&map);
|
| pair.AddValue(mapping_.At(i));
|
| - pair.AddValue(mapping_.At(i+1));
|
| + pair.AddValue(mapping_.At(i + 1));
|
| }
|
| }
|
|
|
| @@ -213,8 +220,7 @@ ClassReasonForCancelling::ClassReasonForCancelling(Zone* zone,
|
| const Class& to)
|
| : ReasonForCancelling(zone),
|
| from_(Class::ZoneHandle(zone, from.raw())),
|
| - to_(Class::ZoneHandle(zone, to.raw())) {
|
| -}
|
| + to_(Class::ZoneHandle(zone, to.raw())) {}
|
|
|
|
|
| void ClassReasonForCancelling::AppendTo(JSONArray* array) {
|
| @@ -246,9 +252,7 @@ class ScriptUrlSetTraits {
|
| return String::Cast(a).Equals(String::Cast(b));
|
| }
|
|
|
| - static uword Hash(const Object& obj) {
|
| - return String::Cast(obj).Hash();
|
| - }
|
| + static uword Hash(const Object& obj) { return String::Cast(obj).Hash(); }
|
| };
|
|
|
|
|
| @@ -279,13 +283,11 @@ class LibraryMapTraits {
|
| if (!a.IsLibrary() || !b.IsLibrary()) {
|
| return false;
|
| }
|
| - return IsolateReloadContext::IsSameLibrary(
|
| - Library::Cast(a), Library::Cast(b));
|
| + return IsolateReloadContext::IsSameLibrary(Library::Cast(a),
|
| + Library::Cast(b));
|
| }
|
|
|
| - static uword Hash(const Object& obj) {
|
| - return Library::Cast(obj).UrlHash();
|
| - }
|
| + static uword Hash(const Object& obj) { return Library::Cast(obj).UrlHash(); }
|
| };
|
|
|
|
|
| @@ -356,8 +358,8 @@ bool IsolateReloadContext::IsSameClass(const Class& a, const Class& b) {
|
| }
|
|
|
|
|
| -bool IsolateReloadContext::IsSameLibrary(
|
| - const Library& a_lib, const Library& b_lib) {
|
| +bool IsolateReloadContext::IsSameLibrary(const Library& a_lib,
|
| + const Library& b_lib) {
|
| const String& a_lib_url =
|
| String::Handle(a_lib.IsNull() ? String::null() : a_lib.url());
|
| const String& b_lib_url =
|
| @@ -366,8 +368,7 @@ bool IsolateReloadContext::IsSameLibrary(
|
| }
|
|
|
|
|
| -IsolateReloadContext::IsolateReloadContext(Isolate* isolate,
|
| - JSONStream* js)
|
| +IsolateReloadContext::IsolateReloadContext(Isolate* isolate, JSONStream* js)
|
| : zone_(Thread::Current()->zone()),
|
| start_time_micros_(OS::GetCurrentMonotonicMicros()),
|
| reload_timestamp_(OS::GetCurrentTimeMillis()),
|
| @@ -400,8 +401,7 @@ IsolateReloadContext::IsolateReloadContext(Isolate* isolate,
|
| }
|
|
|
|
|
| -IsolateReloadContext::~IsolateReloadContext() {
|
| -}
|
| +IsolateReloadContext::~IsolateReloadContext() {}
|
|
|
|
|
| void IsolateReloadContext::ReportError(const Error& error) {
|
| @@ -424,8 +424,7 @@ class Aborted : public ReasonForCancelling {
|
| public:
|
| Aborted(Zone* zone, const Error& error)
|
| : ReasonForCancelling(zone),
|
| - error_(Error::ZoneHandle(zone, error.raw())) {
|
| - }
|
| + error_(Error::ZoneHandle(zone, error.raw())) {}
|
|
|
| private:
|
| const Error& error_;
|
| @@ -463,14 +462,12 @@ void IsolateReloadContext::Reload(bool force_reload) {
|
| // Preallocate storage for maps.
|
| old_classes_set_storage_ =
|
| HashTables::New<UnorderedHashSet<ClassMapTraits> >(4);
|
| - class_map_storage_ =
|
| - HashTables::New<UnorderedHashMap<ClassMapTraits> >(4);
|
| + class_map_storage_ = HashTables::New<UnorderedHashMap<ClassMapTraits> >(4);
|
| old_libraries_set_storage_ =
|
| HashTables::New<UnorderedHashSet<LibraryMapTraits> >(4);
|
| library_map_storage_ =
|
| HashTables::New<UnorderedHashMap<LibraryMapTraits> >(4);
|
| - become_map_storage_ =
|
| - HashTables::New<UnorderedHashMap<BecomeMapTraits> >(4);
|
| + become_map_storage_ = HashTables::New<UnorderedHashMap<BecomeMapTraits> >(4);
|
| // Keep a separate array for enum mappings to avoid having to invoke
|
| // hashCode on the instances.
|
| become_enum_mappings_ = GrowableObjectArray::New(Heap::kOld);
|
| @@ -511,10 +508,9 @@ void IsolateReloadContext::Reload(bool force_reload) {
|
| TransitionVMToNative transition(thread);
|
| Api::Scope api_scope(thread);
|
|
|
| - Dart_Handle retval =
|
| - (I->library_tag_handler())(Dart_kScriptTag,
|
| - Api::NewHandle(thread, Library::null()),
|
| - Api::NewHandle(thread, root_lib_url.raw()));
|
| + Dart_Handle retval = (I->library_tag_handler())(
|
| + Dart_kScriptTag, Api::NewHandle(thread, Library::null()),
|
| + Api::NewHandle(thread, root_lib_url.raw()));
|
| result = Api::UnwrapHandle(retval);
|
| }
|
| //
|
| @@ -522,8 +518,7 @@ void IsolateReloadContext::Reload(bool force_reload) {
|
|
|
| BackgroundCompiler::Enable();
|
|
|
| - if (result.IsUnwindError() ||
|
| - result.IsUnhandledException()) {
|
| + if (result.IsUnwindError() || result.IsUnhandledException()) {
|
| // If the tag handler returns with an UnwindError or an UnhandledException
|
| // error, propagate it and give up.
|
| Exceptions::PropagateError(Error::Cast(result));
|
| @@ -719,8 +714,7 @@ void IsolateReloadContext::CheckpointClasses() {
|
| Class& cls = Class::Handle();
|
| UnorderedHashSet<ClassMapTraits> old_classes_set(old_classes_set_storage_);
|
| for (intptr_t i = 0; i < saved_num_cids_; i++) {
|
| - if (class_table->IsValidIndex(i) &&
|
| - class_table->HasValidClassAt(i)) {
|
| + if (class_table->IsValidIndex(i) && class_table->HasValidClassAt(i)) {
|
| // Copy the class into the saved class table and add it to the set.
|
| local_saved_class_table[i] = class_table->At(i);
|
| if (i != kFreeListElement && i != kForwardingCorpse) {
|
| @@ -756,7 +750,7 @@ bool IsolateReloadContext::ScriptModifiedSince(const Script& script,
|
|
|
|
|
| static void PropagateLibraryModified(
|
| - const ZoneGrowableArray<ZoneGrowableArray<intptr_t>* >* imported_by,
|
| + const ZoneGrowableArray<ZoneGrowableArray<intptr_t>*>* imported_by,
|
| intptr_t lib_index,
|
| BitVector* modified_libs) {
|
| ZoneGrowableArray<intptr_t>* dep_libs = (*imported_by)[lib_index];
|
| @@ -782,12 +776,11 @@ BitVector* IsolateReloadContext::FindModifiedLibraries(bool force_reload) {
|
| intptr_t num_libs = libs.Length();
|
|
|
| // Construct the imported-by graph.
|
| - ZoneGrowableArray<ZoneGrowableArray<intptr_t>* >* imported_by =
|
| - new(zone_) ZoneGrowableArray<ZoneGrowableArray<intptr_t>* >(
|
| - zone_, num_libs);
|
| + ZoneGrowableArray<ZoneGrowableArray<intptr_t>*>* imported_by = new (zone_)
|
| + ZoneGrowableArray<ZoneGrowableArray<intptr_t>*>(zone_, num_libs);
|
| imported_by->SetLength(num_libs);
|
| for (intptr_t i = 0; i < num_libs; i++) {
|
| - (*imported_by)[i] = new(zone_) ZoneGrowableArray<intptr_t>(zone_, 0);
|
| + (*imported_by)[i] = new (zone_) ZoneGrowableArray<intptr_t>(zone_, 0);
|
| }
|
| Array& ports = Array::Handle();
|
| Namespace& ns = Namespace::Handle();
|
| @@ -842,7 +835,7 @@ BitVector* IsolateReloadContext::FindModifiedLibraries(bool force_reload) {
|
| }
|
| }
|
|
|
| - BitVector* modified_libs = new(Z) BitVector(Z, num_libs);
|
| + BitVector* modified_libs = new (Z) BitVector(Z, num_libs);
|
|
|
| for (intptr_t lib_idx = 0; lib_idx < num_libs; lib_idx++) {
|
| lib ^= libs.At(lib_idx);
|
| @@ -871,8 +864,7 @@ void IsolateReloadContext::CheckpointLibraries() {
|
| TIMELINE_SCOPE(CheckpointLibraries);
|
| TIR_Print("---- CHECKPOINTING LIBRARIES\n");
|
| // Save the root library in case we abort the reload.
|
| - const Library& root_lib =
|
| - Library::Handle(object_store()->root_library());
|
| + const Library& root_lib = Library::Handle(object_store()->root_library());
|
| set_saved_root_library(root_lib);
|
|
|
| // Save the old libraries array in case we abort the reload.
|
| @@ -882,11 +874,11 @@ void IsolateReloadContext::CheckpointLibraries() {
|
|
|
| // Make a filtered copy of the old libraries array. Keep "clean" libraries
|
| // that we will use instead of reloading.
|
| - const GrowableObjectArray& new_libs = GrowableObjectArray::Handle(
|
| - GrowableObjectArray::New(Heap::kOld));
|
| + const GrowableObjectArray& new_libs =
|
| + GrowableObjectArray::Handle(GrowableObjectArray::New(Heap::kOld));
|
| Library& lib = Library::Handle();
|
| - UnorderedHashSet<LibraryMapTraits>
|
| - old_libraries_set(old_libraries_set_storage_);
|
| + UnorderedHashSet<LibraryMapTraits> old_libraries_set(
|
| + old_libraries_set_storage_);
|
| num_saved_libs_ = 0;
|
| for (intptr_t i = 0; i < libs.Length(); i++) {
|
| lib ^= libs.At(i);
|
| @@ -949,8 +941,8 @@ void IsolateReloadContext::RollbackLibraries() {
|
| TIR_Print("---- ROLLING BACK LIBRARY CHANGES\n");
|
| Thread* thread = Thread::Current();
|
| Library& lib = Library::Handle();
|
| - GrowableObjectArray& saved_libs = GrowableObjectArray::Handle(
|
| - Z, saved_libraries());
|
| + GrowableObjectArray& saved_libs =
|
| + GrowableObjectArray::Handle(Z, saved_libraries());
|
| if (!saved_libs.IsNull()) {
|
| for (intptr_t i = 0; i < saved_libs.Length(); i++) {
|
| lib = Library::RawCast(saved_libs.At(i));
|
| @@ -991,7 +983,7 @@ void IsolateReloadContext::VerifyMaps() {
|
| UnorderedHashMap<ClassMapTraits> class_map(class_map_storage_);
|
| UnorderedHashMap<ClassMapTraits> reverse_class_map(
|
| HashTables::New<UnorderedHashMap<ClassMapTraits> >(
|
| - class_map.NumOccupied()));
|
| + class_map.NumOccupied()));
|
| {
|
| UnorderedHashMap<ClassMapTraits>::Iterator it(&class_map);
|
| while (it.MoveNext()) {
|
| @@ -1000,9 +992,10 @@ void IsolateReloadContext::VerifyMaps() {
|
| cls = Class::RawCast(class_map.GetPayload(entry, 0));
|
| cls2 ^= reverse_class_map.GetOrNull(new_cls);
|
| if (!cls2.IsNull()) {
|
| - OS::PrintErr("Classes '%s' and '%s' are distinct classes but both map "
|
| - " to class '%s'\n",
|
| - cls.ToCString(), cls2.ToCString(), new_cls.ToCString());
|
| + OS::PrintErr(
|
| + "Classes '%s' and '%s' are distinct classes but both map "
|
| + " to class '%s'\n",
|
| + cls.ToCString(), cls2.ToCString(), new_cls.ToCString());
|
| UNREACHABLE();
|
| }
|
| bool update = reverse_class_map.UpdateOrInsert(cls, new_cls);
|
| @@ -1097,8 +1090,8 @@ void IsolateReloadContext::Commit() {
|
| TIMELINE_SCOPE(UpdateLibrariesArray);
|
| // Update the libraries array.
|
| Library& lib = Library::Handle();
|
| - const GrowableObjectArray& libs = GrowableObjectArray::Handle(
|
| - I->object_store()->libraries());
|
| + const GrowableObjectArray& libs =
|
| + GrowableObjectArray::Handle(I->object_store()->libraries());
|
| for (intptr_t i = 0; i < libs.Length(); i++) {
|
| lib = Library::RawCast(libs.At(i));
|
| VTIR_Print("Lib '%s' at index %" Pd "\n", lib.ToCString(), i);
|
| @@ -1118,8 +1111,8 @@ void IsolateReloadContext::Commit() {
|
| const GrowableObjectArray& become_enum_mappings =
|
| GrowableObjectArray::Handle(become_enum_mappings_);
|
| UnorderedHashMap<BecomeMapTraits> become_map(become_map_storage_);
|
| - intptr_t replacement_count = become_map.NumOccupied() +
|
| - become_enum_mappings.Length() / 2;
|
| + intptr_t replacement_count =
|
| + become_map.NumOccupied() + become_enum_mappings.Length() / 2;
|
| const Array& before =
|
| Array::Handle(Array::New(replacement_count, Heap::kOld));
|
| const Array& after =
|
| @@ -1151,17 +1144,15 @@ void IsolateReloadContext::Commit() {
|
| if (FLAG_identity_reload) {
|
| if (saved_num_cids_ != I->class_table()->NumCids()) {
|
| TIR_Print("Identity reload failed! B#C=%" Pd " A#C=%" Pd "\n",
|
| - saved_num_cids_,
|
| - I->class_table()->NumCids());
|
| + saved_num_cids_, I->class_table()->NumCids());
|
| }
|
| const GrowableObjectArray& saved_libs =
|
| GrowableObjectArray::Handle(saved_libraries());
|
| const GrowableObjectArray& libs =
|
| GrowableObjectArray::Handle(I->object_store()->libraries());
|
| if (saved_libs.Length() != libs.Length()) {
|
| - TIR_Print("Identity reload failed! B#L=%" Pd " A#L=%" Pd "\n",
|
| - saved_libs.Length(),
|
| - libs.Length());
|
| + TIR_Print("Identity reload failed! B#L=%" Pd " A#L=%" Pd "\n",
|
| + saved_libs.Length(), libs.Length());
|
| }
|
| }
|
| }
|
| @@ -1212,8 +1203,7 @@ void IsolateReloadContext::ReportReasonsForCancelling() {
|
| class ObjectLocator : public ObjectVisitor {
|
| public:
|
| explicit ObjectLocator(IsolateReloadContext* context)
|
| - : context_(context), count_(0) {
|
| - }
|
| + : context_(context), count_(0) {}
|
|
|
| void VisitObject(RawObject* obj) {
|
| InstanceMorpher* morpher =
|
| @@ -1252,12 +1242,12 @@ void IsolateReloadContext::MorphInstances() {
|
| intptr_t count = locator.count();
|
| if (count == 0) return;
|
|
|
| - TIR_Print("Found %" Pd " object%s subject to morphing.\n",
|
| - count, (count > 1) ? "s" : "");
|
| + TIR_Print("Found %" Pd " object%s subject to morphing.\n", count,
|
| + (count > 1) ? "s" : "");
|
|
|
| Array& before = Array::Handle();
|
| Array& after = Array::Handle();
|
| - { // Prevent GC to take place due object format confusion.
|
| + { // Prevent GC to take place due object format confusion.
|
| // Hint: More than one class share the same cid.
|
| NoHeapGrowthControlScope scope;
|
| for (intptr_t i = 0; i < instance_morphers_.length(); i++) {
|
| @@ -1426,14 +1416,13 @@ class MarkFunctionsForRecompilation : public ObjectVisitor {
|
| MarkFunctionsForRecompilation(Isolate* isolate,
|
| IsolateReloadContext* reload_context,
|
| Zone* zone)
|
| - : ObjectVisitor(),
|
| - handle_(Object::Handle(zone)),
|
| - owning_class_(Class::Handle(zone)),
|
| - owning_lib_(Library::Handle(zone)),
|
| - code_(Code::Handle(zone)),
|
| - reload_context_(reload_context),
|
| - zone_(zone) {
|
| - }
|
| + : ObjectVisitor(),
|
| + handle_(Object::Handle(zone)),
|
| + owning_class_(Class::Handle(zone)),
|
| + owning_lib_(Library::Handle(zone)),
|
| + code_(Code::Handle(zone)),
|
| + reload_context_(reload_context),
|
| + zone_(zone) {}
|
|
|
| virtual void VisitObject(RawObject* obj) {
|
| if (obj->IsPseudoObject()) {
|
| @@ -1459,7 +1448,7 @@ class MarkFunctionsForRecompilation : public ObjectVisitor {
|
| if (!stub_code) {
|
| if (clear_code) {
|
| VTIR_Print("Marking %s for recompilation, clearning code\n",
|
| - func.ToCString());
|
| + func.ToCString());
|
| ClearAllCode(func);
|
| } else {
|
| PreserveUnoptimizedCode();
|
| @@ -1564,8 +1553,8 @@ RawString* IsolateReloadContext::FindLibraryPrivateKey(
|
|
|
| RawLibrary* IsolateReloadContext::OldLibraryOrNull(
|
| const Library& replacement_or_new) {
|
| - UnorderedHashSet<LibraryMapTraits>
|
| - old_libraries_set(old_libraries_set_storage_);
|
| + UnorderedHashSet<LibraryMapTraits> old_libraries_set(
|
| + old_libraries_set_storage_);
|
| Library& lib = Library::Handle();
|
| lib ^= old_libraries_set.GetOrNull(replacement_or_new);
|
| old_libraries_set.Release();
|
| @@ -1623,8 +1612,8 @@ void IsolateReloadContext::AddLibraryMapping(const Library& replacement_or_new,
|
| }
|
|
|
|
|
| -void IsolateReloadContext::AddStaticFieldMapping(
|
| - const Field& old_field, const Field& new_field) {
|
| +void IsolateReloadContext::AddStaticFieldMapping(const Field& old_field,
|
| + const Field& new_field) {
|
| ASSERT(old_field.is_static());
|
| ASSERT(new_field.is_static());
|
|
|
|
|