Index: runtime/vm/kernel_reader.cc |
diff --git a/runtime/vm/kernel_reader.cc b/runtime/vm/kernel_reader.cc |
index 490474c2f444a9dfc1235a5e89f7a0c06da4cd43..bbb439a7267cdc866c32cb785b7d13c20521b14b 100644 |
--- a/runtime/vm/kernel_reader.cc |
+++ b/runtime/vm/kernel_reader.cc |
@@ -211,6 +211,43 @@ Object& KernelReader::ReadProgram() { |
return error; |
} |
+void KernelReader::FindModifiedLibraries(Isolate* isolate, |
+ BitVector* modified_libs, |
+ bool force_reload) { |
+ LongJumpScope jump; |
+ if (setjmp(*jump.Set()) == 0) { |
+ if (force_reload) { |
+ // If a reload is being forced we mark all libraries as having |
+ // been modified. |
+ const GrowableObjectArray& libs = |
+ GrowableObjectArray::Handle(isolate->object_store()->libraries()); |
+ intptr_t num_libs = libs.Length(); |
+ Library& lib = dart::Library::Handle(Z); |
+ for (intptr_t i = 0; i < num_libs; i++) { |
+ lib ^= libs.At(i); |
+ if (!lib.is_dart_scheme()) { |
+ modified_libs->Add(lib.index()); |
+ } |
+ } |
+ return; |
+ } |
+ // Now go through all the libraries that are present in the incremental |
+ // kernel files, these will constitute the modified libraries. |
+ intptr_t length = program_->library_count(); |
+ for (intptr_t i = 0; i < length; i++) { |
+ intptr_t kernel_offset = library_offset(i); |
+ builder_.SetOffset(kernel_offset); |
+ LibraryHelper library_helper(&builder_); |
+ library_helper.ReadUntilIncluding(LibraryHelper::kCanonicalName); |
+ dart::Library& lib = LookupLibrary(library_helper.canonical_name_); |
+ if (!lib.IsNull() && !lib.is_dart_scheme()) { |
+ // This is a library that already exists so mark it as being modified. |
+ modified_libs->Add(lib.index()); |
+ } |
+ } |
+ } |
+} |
+ |
void KernelReader::ReadLibrary(intptr_t kernel_offset) { |
builder_.SetOffset(kernel_offset); |
LibraryHelper library_helper(&builder_); |