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_ |