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

Unified Diff: runtime/bin/loader.cc

Issue 2475523002: Reload native extensions when starting from a snapshot. (Closed)
Patch Set: Use temp directory for snapshot 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
Index: runtime/bin/loader.cc
diff --git a/runtime/bin/loader.cc b/runtime/bin/loader.cc
index d69def19f857ba943deb0db4c61c938685151b54..67fc94aeb2446319b308f5e4fc6b4e3b9d574a5a 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 {
@@ -361,6 +362,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:
@@ -376,6 +378,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 {
@@ -394,6 +397,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;
}
@@ -448,6 +460,70 @@ void Loader::InitForSnapshot(const char* snapshot_uri) {
}
+#define RETURN_ERROR(result) \
+ if (Dart_IsError(result)) return result;
+
+Dart_Handle Loader::ReloadNativeExtensions() {
+ // For each library
+ Dart_Handle library_ids = Dart_GetLibraryIds();
+ RETURN_ERROR(library_ids);
+ intptr_t libraries_length = -1;
+ Dart_Handle result = Dart_ListLength(library_ids, &libraries_length);
+ RETURN_ERROR(result);
+ for (intptr_t i = 0; i < libraries_length; i++) {
+ int64_t library_id = -1;
+ result = Dart_IntegerToInt64(Dart_ListGetAt(library_ids, i),
+ &library_id);
siva 2016/11/02 23:48:38 You could use Dart_ListGetRange to extract the lib
+ RETURN_ERROR(result);
+ Dart_Handle import_ids = Dart_GetLibraryImports(library_id);
+ RETURN_ERROR(import_ids);
+ intptr_t imports_length = -1;
+ result = Dart_ListLength(import_ids, &imports_length);
+ RETURN_ERROR(result);
+
+ // For each import
+ for (intptr_t j = 1; j < imports_length; j += 2) {
+ int64_t import_id = -1;
+ result = Dart_IntegerToInt64(Dart_ListGetAt(import_ids, j),
+ &import_id);
siva 2016/11/02 23:48:38 Ditto comment about Dart_ListGetAt
+ RETURN_ERROR(result);
+ const char* extension_uri = NULL;
+ result = Dart_StringToCString(Dart_GetLibraryURL(import_id),
+ &extension_uri);
+ RETURN_ERROR(result);
+
+ // If import starts with dart-ext:
+ if (strncmp(extension_uri, "dart-ext:", 9) == 0) {
siva 2016/11/02 23:48:38 magic numbers 9 , 7 etc. use named constants.
Cutch 2016/11/03 17:45:34 Also, these schemes already exist: DartUtils::kDar
+ const char* extension_path = DartUtils::RemoveScheme(extension_uri);
+
+ Dart_Handle library = Dart_GetLibraryFromId(library_id);
+ RETURN_ERROR(library);
+ const char* lib_uri = NULL;
+ result = Dart_StringToCString(Dart_GetLibraryURL(library_id),
+ &lib_uri);
+ RETURN_ERROR(result);
+
+ char* lib_path = NULL;
+ if (strncmp(lib_uri, "file://", 7) == 0) {
+ lib_path = DartUtils::RemoveFilename(
+ DartUtils::RemoveScheme(lib_uri));
+ } else {
+ lib_path = strdup(lib_uri);
+ }
+
+ result = Extensions::LoadExtension(lib_path,
+ extension_path,
+ library);
+ free(lib_path);
+ RETURN_ERROR(result);
+ }
+ }
+ }
siva 2016/11/02 23:48:38 This seems like an expensive loop we have to run t
Cutch 2016/11/03 17:45:34 I agree with the spirit, but, extensions are techn
siva 2016/11/03 17:53:01 Agree, maybe the API could be something like Dart_
+
+ return Dart_True();
+}
+
+
Dart_Handle Loader::LoadUrlContents(Dart_Handle url,
uint8_t** payload,
intptr_t* payload_length) {

Powered by Google App Engine
This is Rietveld 408576698