Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1044)

Unified Diff: runtime/vm/isolate_reload.h

Issue 1965823002: Initial isolate reload support (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/vm/isolate_reload.h
diff --git a/runtime/vm/isolate_reload.h b/runtime/vm/isolate_reload.h
new file mode 100644
index 0000000000000000000000000000000000000000..75b9843e479ba9c6c945127dcb167a1d7d4bf986
--- /dev/null
+++ b/runtime/vm/isolate_reload.h
@@ -0,0 +1,175 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef VM_ISOLATE_RELOAD_H_
+#define VM_ISOLATE_RELOAD_H_
+
+#include "vm/globals.h"
+#include "vm/growable_array.h"
+#include "vm/log.h"
+
+DECLARE_FLAG(bool, trace_reload);
+
+// 'Trace Isolate Reload' TIR_Print
+#if defined(_MSC_VER)
+#define TIR_Print(format, ...) \
+ if (FLAG_trace_reload) Log::Current()->Print(format, __VA_ARGS__)
+#else
+#define TIR_Print(format, ...) \
+ if (FLAG_trace_reload) Log::Current()->Print(format, ##__VA_ARGS__)
+#endif
+
+namespace dart {
+
+class GrowableObjectArray;
+class Isolate;
+class Library;
+class RawError;
+class RawGrowableObjectArray;
+class RawLibrary;
+class RawObject;
+class RawString;
+class ObjectPointerVisitor;
+class ObjectStore;
+class UpdateClassesVisitor;
+
+class IsolateReloadContext {
+ public:
+ explicit IsolateReloadContext(Isolate* isolate, bool test_mode = false);
+ ~IsolateReloadContext();
+
+ void StartReload();
+ void FinishReload();
+ void AbortReload(const Error& error);
+
+ RawLibrary* saved_root_library() const;
+
+ RawGrowableObjectArray* saved_libraries() const;
+
+ void ReportError(const Error& error);
+ void ReportError(const String& error_msg);
+ void ReportSuccess();
+
+ bool has_error() const { return has_error_; }
+ RawError* error() const { return error_; }
+ bool test_mode() const { return test_mode_; }
+
+ static bool IsSameField(const Field& a, const Field& b);
+ static bool IsSameLibrary(const Library& a_lib, const Library& b_lib);
+ static bool IsSameClass(const Class& a, const Class& b);
+
+ RawClass* FindOriginalClass(const Class& cls);
+
+ bool IsDirty(const Library& lib);
+
+ // Prefers old classes when we are in the middle of a reload.
+ RawClass* GetClassForHeapWalkAt(intptr_t cid);
+
+ void RegisterClass(const Class& new_cls);
+
+ int64_t start_time_micros() const { return start_time_micros_; }
+
+ private:
+ void set_saved_root_library(const Library& value);
+
+ void set_saved_libraries(const GrowableObjectArray& value);
+
+ void VisitObjectPointers(ObjectPointerVisitor* visitor);
+
+ Isolate* isolate() { return isolate_; }
+ ObjectStore* object_store();
+
+ void EnsuredUnoptimizedCodeForStack();
+ void DeoptimizeDependentCode();
+
+ void Checkpoint();
+
+ void CheckpointClasses();
+
+ // Is |lib| a library whose sources have not changed?
+ bool IsCleanLibrary(const Library& lib);
+ void CheckpointLibraries();
+
+ bool ValidateReload();
+
+ void Rollback();
+
+ void RollbackClasses();
+ void RollbackLibraries();
+
+#ifdef DEBUG
+ void VerifyMaps();
+ void VerifyCanonicalTypeArguments();
+#endif
+
+ void Commit();
+
+ void PostCommit();
+
+ void ClearReplacedObjectBits();
+
+ void BuildCleanScriptSet();
+ void FilterCompileTimeConstants();
+
+ // atomic_install:
+ void MarkAllFunctionsForRecompilation();
+ void ResetUnoptimizedICsOnStack();
+ void ResetMegamorphicCaches();
+ void InvalidateWorld();
+
+ int64_t start_time_micros_;
+ Isolate* isolate_;
+ bool test_mode_;
+ bool has_error_;
+
+ intptr_t saved_num_cids_;
+ RawClass** saved_class_table_;
+
+ intptr_t num_saved_libs_;
+ struct LibraryInfo {
+ bool dirty;
+ };
+ MallocGrowableArray<LibraryInfo> library_infos_;
+
+ RawClass* OldClassOrNull(const Class& replacement_or_new);
+
+ RawLibrary* OldLibraryOrNull(const Library& replacement_or_new);
+ void BuildLibraryMapping();
+
+ void AddClassMapping(const Class& replacement_or_new,
+ const Class& original);
+
+ void AddLibraryMapping(const Library& replacement_or_new,
+ const Library& original);
+
+ void AddStaticFieldMapping(const Field& old_field, const Field& new_field);
+
+ void AddBecomeMapping(const Object& old, const Object& nue);
+
+ void RebuildDirectSubclasses();
+
+ RawClass* MappedClass(const Class& replacement_or_new);
+ RawLibrary* MappedLibrary(const Library& replacement_or_new);
+
+ RawObject** from() { return reinterpret_cast<RawObject**>(&script_uri_); }
+ RawString* script_uri_;
+ RawError* error_;
+ RawArray* clean_scripts_set_storage_;
+ RawArray* compile_time_constants_;
+ RawArray* old_classes_set_storage_;
+ RawArray* class_map_storage_;
+ RawArray* old_libraries_set_storage_;
+ RawArray* library_map_storage_;
+ RawArray* become_map_storage_;
+ RawLibrary* saved_root_library_;
+ RawGrowableObjectArray* saved_libraries_;
+ RawObject** to() { return reinterpret_cast<RawObject**>(&saved_libraries_); }
+
+ friend class Isolate;
+ friend class Class; // AddStaticFieldMapping.
+};
+
+} // namespace dart
+
+#endif // VM_ISOLATE_RELOAD_H_

Powered by Google App Engine
This is Rietveld 408576698