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

Unified Diff: runtime/bin/loader.cc

Issue 2475523002: Reload native extensions when starting from a snapshot. (Closed)
Patch Set: comment Created 4 years, 1 month 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
« no previous file with comments | « runtime/bin/loader.h ('k') | runtime/bin/main.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/bin/loader.cc
diff --git a/runtime/bin/loader.cc b/runtime/bin/loader.cc
index a7d99ccdd4670af7dbd599206456d10a7ecb8c8d..c94a21f0307770c1ae36019d6c9b7ee1c9d2418a 100644
--- a/runtime/bin/loader.cc
+++ b/runtime/bin/loader.cc
@@ -11,6 +11,7 @@
#include "bin/file.h"
#include "bin/lockers.h"
#include "bin/utils.h"
+#include "include/dart_tools_api.h"
namespace dart {
namespace bin {
@@ -353,6 +354,7 @@ bool Loader::ProcessResultLocked(Loader* loader, Loader::IOResult* result) {
loader->monitor_->Exit();
Dart_Handle dart_result = Dart_Null();
+ bool reload_extensions = false;
switch (tag) {
case Dart_kImportTag:
@@ -367,6 +369,7 @@ bool Loader::ProcessResultLocked(Loader* loader, Loader::IOResult* result) {
case Dart_kScriptTag:
if (payload_type == DartUtils::kSnapshotMagicNumber) {
dart_result = Dart_LoadScriptFromSnapshot(payload, payload_length);
+ reload_extensions = true;
} else if (payload_type == DartUtils::kKernelMagicNumber) {
dart_result = Dart_LoadKernel(payload, payload_length);
} else {
@@ -385,6 +388,15 @@ bool Loader::ProcessResultLocked(Loader* loader, Loader::IOResult* result) {
return false;
}
+ if (reload_extensions) {
+ dart_result = ReloadNativeExtensions();
+ if (Dart_IsError(dart_result)) {
+ // Remember the error if we encountered one.
+ loader->error_ = dart_result;
+ return false;
+ }
+ }
+
return true;
}
@@ -437,6 +449,51 @@ void Loader::InitForSnapshot(const char* snapshot_uri) {
}
+#define RETURN_ERROR(result) \
+ if (Dart_IsError(result)) return result;
+
+Dart_Handle Loader::ReloadNativeExtensions() {
+ Dart_Handle scheme =
+ Dart_NewStringFromCString(DartUtils::kDartExtensionScheme);
+ Dart_Handle extension_imports = Dart_GetImportsOfScheme(scheme);
+ RETURN_ERROR(extension_imports);
+
+ intptr_t length = -1;
+ Dart_Handle result = Dart_ListLength(extension_imports, &length);
+ RETURN_ERROR(result);
+ Dart_Handle* import_handles = reinterpret_cast<Dart_Handle*>(
+ Dart_ScopeAllocate(sizeof(Dart_Handle) * length));
+ result = Dart_ListGetRange(extension_imports, 0, length, import_handles);
+ RETURN_ERROR(result);
+ for (intptr_t i = 0; i < length; i += 2) {
+ Dart_Handle importer = import_handles[i];
+ Dart_Handle importee = import_handles[i + 1];
+
+ const char* extension_uri = NULL;
+ result = Dart_StringToCString(Dart_LibraryUrl(importee), &extension_uri);
+ RETURN_ERROR(result);
+ const char* extension_path = DartUtils::RemoveScheme(extension_uri);
+
+ const char* lib_uri = NULL;
+ result = Dart_StringToCString(Dart_LibraryUrl(importer), &lib_uri);
+ RETURN_ERROR(result);
+
+ char* lib_path = NULL;
+ if (strncmp(lib_uri, "file://", 7) == 0) {
+ lib_path = DartUtils::DirName(DartUtils::RemoveScheme(lib_uri));
+ } else {
+ lib_path = strdup(lib_uri);
+ }
+
+ result = Extensions::LoadExtension(lib_path, extension_path, importer);
+ free(lib_path);
+ RETURN_ERROR(result);
+ }
+
+ return Dart_True();
+}
+
+
Dart_Handle Loader::LoadUrlContents(Dart_Handle url,
uint8_t** payload,
intptr_t* payload_length) {
« no previous file with comments | « runtime/bin/loader.h ('k') | runtime/bin/main.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698