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

Unified Diff: runtime/lib/isolate.cc

Issue 1403693002: - Implement package map parameter when spawning isolate. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Fix typo in comment. Created 5 years, 2 months 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/lib/isolate.cc
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index 82f468fda864574beca1fd0347eacb6ddd22dc5f..225d2283d5a959fa52b1cb64ade1619950ed7be6 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -125,43 +125,6 @@ static void ThrowIsolateSpawnException(const String& message) {
}
-static bool CanonicalizeUri(Isolate* isolate,
- const Library& library,
- const String& uri,
- char** canonical_uri,
- char** error) {
- Zone* zone = isolate->current_zone();
- bool retval = false;
- Dart_LibraryTagHandler handler = isolate->library_tag_handler();
- if (handler != NULL) {
- Dart_EnterScope();
- Dart_Handle result = handler(Dart_kCanonicalizeUrl,
- Api::NewHandle(isolate, library.raw()),
- Api::NewHandle(isolate, uri.raw()));
- const Object& obj = Object::Handle(Api::UnwrapHandle(result));
- if (obj.IsString()) {
- *canonical_uri = zone->MakeCopyOfString(String::Cast(obj).ToCString());
- retval = true;
- } else if (obj.IsError()) {
- Error& error_obj = Error::Handle();
- error_obj ^= obj.raw();
- *error = zone->PrintToString("Unable to canonicalize uri '%s': %s",
- uri.ToCString(), error_obj.ToErrorCString());
- } else {
- *error = zone->PrintToString("Unable to canonicalize uri '%s': "
- "library tag handler returned wrong type",
- uri.ToCString());
- }
- Dart_ExitScope();
- } else {
- *error = zone->PrintToString(
- "Unable to canonicalize uri '%s': no library tag handler found.",
- uri.ToCString());
- }
- return retval;
-}
-
-
static bool CreateIsolate(Isolate* parent_isolate,
IsolateSpawnState* state,
char** error) {
@@ -179,6 +142,7 @@ static bool CreateIsolate(Isolate* parent_isolate,
(callback)(state->script_url(),
state->function_name(),
state->package_root(),
+ state->package_map(),
&api_flags,
init_data,
error));
@@ -259,6 +223,51 @@ DEFINE_NATIVE_ENTRY(Isolate_spawnFunction, 7) {
}
+static char* String2UTF8(const String& str) {
+ intptr_t len = Utf8::Length(str);
+ char* result = new char[len + 1];
+ str.ToUTF8(reinterpret_cast<uint8_t*>(result), len);
+ result[len] = 0;
+
+ return result;
+}
+
+
+static char* CanonicalizeUri(Isolate* isolate,
+ const Library& library,
Lasse Reichstein Nielsen 2015/10/12 09:34:44 Indentation is off-by-1.
Ivan Posva 2015/10/12 16:05:22 Done.
+ const String& uri,
+ char** error) {
+ char* result = NULL;
+ Zone* zone = isolate->current_zone();
+ Dart_LibraryTagHandler handler = isolate->library_tag_handler();
+ if (handler != NULL) {
+ Dart_EnterScope();
+ Dart_Handle handle = handler(Dart_kCanonicalizeUrl,
+ Api::NewHandle(isolate, library.raw()),
+ Api::NewHandle(isolate, uri.raw()));
+ const Object& obj = Object::Handle(Api::UnwrapHandle(handle));
+ if (obj.IsString()) {
+ result = String2UTF8(String::Cast(obj));
+ } else if (obj.IsError()) {
+ Error& error_obj = Error::Handle();
+ error_obj ^= obj.raw();
+ *error = zone->PrintToString("Unable to canonicalize uri '%s': %s",
+ uri.ToCString(), error_obj.ToErrorCString());
+ } else {
+ *error = zone->PrintToString("Unable to canonicalize uri '%s': "
+ "library tag handler returned wrong type",
+ uri.ToCString());
+ }
+ Dart_ExitScope();
+ } else {
+ *error = zone->PrintToString(
+ "Unable to canonicalize uri '%s': no library tag handler found.",
+ uri.ToCString());
+ }
+ return result;
+}
+
+
DEFINE_NATIVE_ENTRY(Isolate_spawnUri, 12) {
GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
GET_NON_NULL_NATIVE_ARGUMENT(String, uri, arguments->NativeArgAt(1));
@@ -280,37 +289,52 @@ DEFINE_NATIVE_ENTRY(Isolate_spawnUri, 12) {
// Canonicalize the uri with respect to the current isolate.
- char* error = NULL;
- char* canonical_uri = NULL;
const Library& root_lib =
Library::Handle(isolate->object_store()->root_library());
- if (!CanonicalizeUri(isolate, root_lib, uri,
- &canonical_uri, &error)) {
+ char* error = NULL;
+ char* canonical_uri = CanonicalizeUri(isolate, root_lib, uri, &error);
+ if (canonical_uri == NULL) {
const String& msg = String::Handle(String::New(error));
ThrowIsolateSpawnException(msg);
}
- char* utf8_package_root = NULL;
- if (!package_root.IsNull()) {
- const intptr_t len = Utf8::Length(package_root);
- utf8_package_root = zone->Alloc<char>(len + 1);
- package_root.ToUTF8(reinterpret_cast<uint8_t*>(utf8_package_root), len);
- utf8_package_root[len] = '\0';
+ char* utf8_package_root =
+ package_root.IsNull() ? NULL : String2UTF8(package_root);
+
+ char** utf8_package_map = NULL;
+ if (!packages.IsNull()) {
+ intptr_t len = packages.Length();
+ utf8_package_map = new char*[len + 1];
+
+ Object& entry = Object::Handle();
+ for (intptr_t i = 0; i < len; i++) {
+ entry = packages.At(i);
+ if (!entry.IsString()) {
+ const String& msg = String::Handle(String::NewFormatted(
+ "Bad value in package map: %s", entry.ToCString()));
+ ThrowIsolateSpawnException(msg);
+ }
+ utf8_package_map[i] = String2UTF8(String::Cast(entry));
+ }
+ // NULL terminated array.
+ utf8_package_map[len] = NULL;
}
bool fatal_errors = fatalErrors.IsNull() ? true : fatalErrors.value();
Dart_Port on_exit_port = onExit.IsNull() ? ILLEGAL_PORT : onExit.Id();
Dart_Port on_error_port = onError.IsNull() ? ILLEGAL_PORT : onError.Id();
- IsolateSpawnState* state = new IsolateSpawnState(port.Id(),
- canonical_uri,
- utf8_package_root,
- args,
- message,
- paused.value(),
- fatal_errors,
- on_exit_port,
- on_error_port);
+ IsolateSpawnState* state = new IsolateSpawnState(
+ port.Id(),
+ canonical_uri,
+ utf8_package_root,
+ const_cast<const char**>(utf8_package_map),
+ args,
+ message,
+ paused.value(),
+ fatal_errors,
+ on_exit_port,
+ on_error_port);
// If we were passed a value then override the default flags state for
// checked mode.
if (!checked.IsNull()) {

Powered by Google App Engine
This is Rietveld 408576698