OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #ifndef VM_ISOLATE_RELOAD_H_ | 5 #ifndef VM_ISOLATE_RELOAD_H_ |
6 #define VM_ISOLATE_RELOAD_H_ | 6 #define VM_ISOLATE_RELOAD_H_ |
7 | 7 |
| 8 #include "include/dart_tools_api.h" |
| 9 |
8 #include "vm/globals.h" | 10 #include "vm/globals.h" |
9 #include "vm/growable_array.h" | 11 #include "vm/growable_array.h" |
10 #include "vm/log.h" | 12 #include "vm/log.h" |
11 | 13 |
12 DECLARE_FLAG(bool, trace_reload); | 14 DECLARE_FLAG(bool, trace_reload); |
13 DECLARE_FLAG(bool, trace_reload_verbose); | 15 DECLARE_FLAG(bool, trace_reload_verbose); |
14 | 16 |
15 // 'Trace Isolate Reload' TIR_Print | 17 // 'Trace Isolate Reload' TIR_Print |
16 #if defined(_MSC_VER) | 18 #if defined(_MSC_VER) |
17 #define TIR_Print(format, ...) \ | 19 #define TIR_Print(format, ...) \ |
18 if (FLAG_trace_reload) Log::Current()->Print(format, __VA_ARGS__) | 20 if (FLAG_trace_reload) Log::Current()->Print(format, __VA_ARGS__) |
19 #else | 21 #else |
20 #define TIR_Print(format, ...) \ | 22 #define TIR_Print(format, ...) \ |
21 if (FLAG_trace_reload) Log::Current()->Print(format, ##__VA_ARGS__) | 23 if (FLAG_trace_reload) Log::Current()->Print(format, ##__VA_ARGS__) |
22 #endif | 24 #endif |
23 | 25 |
24 // 'Verbose Trace Isolate Reload' VTIR_Print | 26 // 'Verbose Trace Isolate Reload' VTIR_Print |
25 #if defined(_MSC_VER) | 27 #if defined(_MSC_VER) |
26 #define VTIR_Print(format, ...) \ | 28 #define VTIR_Print(format, ...) \ |
27 if (FLAG_trace_reload_verbose) Log::Current()->Print(format, __VA_ARGS__) | 29 if (FLAG_trace_reload_verbose) Log::Current()->Print(format, __VA_ARGS__) |
28 #else | 30 #else |
29 #define VTIR_Print(format, ...) \ | 31 #define VTIR_Print(format, ...) \ |
30 if (FLAG_trace_reload_verbose) Log::Current()->Print(format, ##__VA_ARGS__) | 32 if (FLAG_trace_reload_verbose) Log::Current()->Print(format, ##__VA_ARGS__) |
31 #endif | 33 #endif |
32 | 34 |
33 namespace dart { | 35 namespace dart { |
34 | 36 |
| 37 class BitVector; |
35 class GrowableObjectArray; | 38 class GrowableObjectArray; |
36 class Isolate; | 39 class Isolate; |
37 class Library; | 40 class Library; |
| 41 class ObjectPointerVisitor; |
| 42 class ObjectStore; |
38 class RawError; | 43 class RawError; |
39 class RawGrowableObjectArray; | 44 class RawGrowableObjectArray; |
40 class RawLibrary; | 45 class RawLibrary; |
41 class RawObject; | 46 class RawObject; |
42 class RawString; | 47 class RawString; |
43 class ObjectPointerVisitor; | 48 class Script; |
44 class ObjectStore; | |
45 class UpdateClassesVisitor; | 49 class UpdateClassesVisitor; |
46 | 50 |
47 class IsolateReloadContext { | 51 class IsolateReloadContext { |
48 public: | 52 public: |
49 explicit IsolateReloadContext(Isolate* isolate); | 53 explicit IsolateReloadContext(Isolate* isolate); |
50 ~IsolateReloadContext(); | 54 ~IsolateReloadContext(); |
51 | 55 |
52 void StartReload(); | 56 void StartReload(bool force_reload); |
53 void FinishReload(); | 57 void FinishReload(); |
54 void AbortReload(const Error& error); | 58 void AbortReload(const Error& error); |
55 | 59 |
56 RawLibrary* saved_root_library() const; | 60 RawLibrary* saved_root_library() const; |
57 | 61 |
58 RawGrowableObjectArray* saved_libraries() const; | 62 RawGrowableObjectArray* saved_libraries() const; |
59 | 63 |
60 void ReportError(const Error& error); | 64 void ReportError(const Error& error); |
61 void ReportError(const String& error_msg); | 65 void ReportError(const String& error_msg); |
62 void ReportSuccess(); | 66 void ReportSuccess(); |
63 | 67 |
| 68 bool reload_skipped() const { return reload_skipped_; } |
| 69 |
64 bool has_error() const { return has_error_; } | 70 bool has_error() const { return has_error_; } |
65 RawError* error() const { return error_; } | 71 RawError* error() const { return error_; } |
66 | 72 |
| 73 int64_t reload_timestamp() const { return reload_timestamp_; } |
| 74 |
67 static bool IsSameField(const Field& a, const Field& b); | 75 static bool IsSameField(const Field& a, const Field& b); |
68 static bool IsSameLibrary(const Library& a_lib, const Library& b_lib); | 76 static bool IsSameLibrary(const Library& a_lib, const Library& b_lib); |
69 static bool IsSameClass(const Class& a, const Class& b); | 77 static bool IsSameClass(const Class& a, const Class& b); |
70 | 78 |
71 RawClass* FindOriginalClass(const Class& cls); | 79 RawClass* FindOriginalClass(const Class& cls); |
72 | 80 |
73 bool IsDirty(const Library& lib); | 81 bool IsDirty(const Library& lib); |
74 | 82 |
75 // Prefers old classes when we are in the middle of a reload. | 83 // Prefers old classes when we are in the middle of a reload. |
76 RawClass* GetClassForHeapWalkAt(intptr_t cid); | 84 RawClass* GetClassForHeapWalkAt(intptr_t cid); |
77 | 85 |
78 void RegisterClass(const Class& new_cls); | 86 void RegisterClass(const Class& new_cls); |
79 | 87 |
80 // Finds the library private key for |replacement_or_new| or return null | 88 // Finds the library private key for |replacement_or_new| or return null |
81 // if |replacement_or_new| is new. | 89 // if |replacement_or_new| is new. |
82 RawString* FindLibraryPrivateKey(const Library& replacement_or_new); | 90 RawString* FindLibraryPrivateKey(const Library& replacement_or_new); |
83 | 91 |
84 int64_t start_time_micros() const { return start_time_micros_; } | 92 int64_t start_time_micros() const { return start_time_micros_; } |
85 | 93 |
| 94 static Dart_FileModifiedCallback file_modified_callback() { |
| 95 return file_modified_callback_; |
| 96 } |
| 97 static void SetFileModifiedCallback(Dart_FileModifiedCallback callback) { |
| 98 file_modified_callback_ = callback; |
| 99 } |
| 100 |
86 private: | 101 private: |
87 void set_saved_root_library(const Library& value); | 102 void set_saved_root_library(const Library& value); |
88 | 103 |
89 void set_saved_libraries(const GrowableObjectArray& value); | 104 void set_saved_libraries(const GrowableObjectArray& value); |
90 | 105 |
91 void VisitObjectPointers(ObjectPointerVisitor* visitor); | 106 void VisitObjectPointers(ObjectPointerVisitor* visitor); |
92 | 107 |
93 Isolate* isolate() { return isolate_; } | 108 Isolate* isolate() { return isolate_; } |
94 ObjectStore* object_store(); | 109 ObjectStore* object_store(); |
95 | 110 |
96 void EnsuredUnoptimizedCodeForStack(); | 111 void EnsuredUnoptimizedCodeForStack(); |
97 void DeoptimizeDependentCode(); | 112 void DeoptimizeDependentCode(); |
98 | 113 |
99 void Checkpoint(); | 114 void Checkpoint(); |
100 | 115 |
101 void CheckpointClasses(); | 116 void CheckpointClasses(); |
102 | 117 |
103 // Is |lib| a library whose sources have not changed? | 118 bool ScriptModifiedSince(const Script& script, int64_t since); |
104 bool IsCleanLibrary(const Library& lib); | 119 BitVector* FindModifiedLibraries(bool force_reload); |
| 120 |
105 void CheckpointLibraries(); | 121 void CheckpointLibraries(); |
106 | 122 |
107 bool ValidateReload(); | 123 bool ValidateReload(); |
108 | 124 |
109 void Rollback(); | 125 void Rollback(); |
110 | 126 |
111 void RollbackClasses(); | 127 void RollbackClasses(); |
112 void RollbackLibraries(); | 128 void RollbackLibraries(); |
113 | 129 |
114 #ifdef DEBUG | 130 #ifdef DEBUG |
115 void VerifyMaps(); | 131 void VerifyMaps(); |
116 #endif | 132 #endif |
117 | 133 |
118 void Commit(); | 134 void Commit(); |
119 | 135 |
120 void PostCommit(); | 136 void PostCommit(); |
121 | 137 |
122 void ClearReplacedObjectBits(); | 138 void ClearReplacedObjectBits(); |
123 | 139 |
124 // atomic_install: | 140 // atomic_install: |
125 void MarkAllFunctionsForRecompilation(); | 141 void MarkAllFunctionsForRecompilation(); |
126 void ResetUnoptimizedICsOnStack(); | 142 void ResetUnoptimizedICsOnStack(); |
127 void ResetMegamorphicCaches(); | 143 void ResetMegamorphicCaches(); |
128 void InvalidateWorld(); | 144 void InvalidateWorld(); |
129 | 145 |
130 int64_t start_time_micros_; | 146 int64_t start_time_micros_; |
| 147 int64_t reload_timestamp_; |
131 Isolate* isolate_; | 148 Isolate* isolate_; |
| 149 bool reload_skipped_; |
132 bool has_error_; | 150 bool has_error_; |
133 | 151 |
134 intptr_t saved_num_cids_; | 152 intptr_t saved_num_cids_; |
135 RawClass** saved_class_table_; | 153 RawClass** saved_class_table_; |
136 | 154 |
137 intptr_t num_saved_libs_; | 155 intptr_t num_saved_libs_; |
138 struct LibraryInfo { | 156 struct LibraryInfo { |
139 bool dirty; | 157 bool dirty; |
140 }; | 158 }; |
141 MallocGrowableArray<LibraryInfo> library_infos_; | 159 MallocGrowableArray<LibraryInfo> library_infos_; |
142 | 160 |
| 161 // A bit vector indicating which of the original libraries were modified. |
| 162 BitVector* modified_libs_; |
| 163 |
143 RawClass* OldClassOrNull(const Class& replacement_or_new); | 164 RawClass* OldClassOrNull(const Class& replacement_or_new); |
144 | 165 |
145 RawLibrary* OldLibraryOrNull(const Library& replacement_or_new); | 166 RawLibrary* OldLibraryOrNull(const Library& replacement_or_new); |
146 void BuildLibraryMapping(); | 167 void BuildLibraryMapping(); |
147 | 168 |
148 void AddClassMapping(const Class& replacement_or_new, | 169 void AddClassMapping(const Class& replacement_or_new, |
149 const Class& original); | 170 const Class& original); |
150 | 171 |
151 void AddLibraryMapping(const Library& replacement_or_new, | 172 void AddLibraryMapping(const Library& replacement_or_new, |
152 const Library& original); | 173 const Library& original); |
(...skipping 16 matching lines...) Expand all Loading... |
169 RawArray* old_libraries_set_storage_; | 190 RawArray* old_libraries_set_storage_; |
170 RawArray* library_map_storage_; | 191 RawArray* library_map_storage_; |
171 RawArray* become_map_storage_; | 192 RawArray* become_map_storage_; |
172 RawGrowableObjectArray* become_enum_mappings_; | 193 RawGrowableObjectArray* become_enum_mappings_; |
173 RawLibrary* saved_root_library_; | 194 RawLibrary* saved_root_library_; |
174 RawGrowableObjectArray* saved_libraries_; | 195 RawGrowableObjectArray* saved_libraries_; |
175 RawObject** to() { return reinterpret_cast<RawObject**>(&saved_libraries_); } | 196 RawObject** to() { return reinterpret_cast<RawObject**>(&saved_libraries_); } |
176 | 197 |
177 friend class Isolate; | 198 friend class Isolate; |
178 friend class Class; // AddStaticFieldMapping, AddEnumBecomeMapping. | 199 friend class Class; // AddStaticFieldMapping, AddEnumBecomeMapping. |
| 200 |
| 201 static Dart_FileModifiedCallback file_modified_callback_; |
179 }; | 202 }; |
180 | 203 |
181 } // namespace dart | 204 } // namespace dart |
182 | 205 |
183 #endif // VM_ISOLATE_RELOAD_H_ | 206 #endif // VM_ISOLATE_RELOAD_H_ |
OLD | NEW |