Index: sky/engine/core/script/dart_service_isolate.cc |
diff --git a/mojo/dart/embedder/vmservice.cc b/sky/engine/core/script/dart_service_isolate.cc |
similarity index 60% |
copy from mojo/dart/embedder/vmservice.cc |
copy to sky/engine/core/script/dart_service_isolate.cc |
index 51efaf97be78ff4a27d184b6cbbe08934e67b409..b74c5061363d364e48adf0d5cadb762b46c309c0 100644 |
--- a/mojo/dart/embedder/vmservice.cc |
+++ b/sky/engine/core/script/dart_service_isolate.cc |
@@ -2,16 +2,12 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "mojo/dart/embedder/vmservice.h" |
+#include "dart_service_isolate.h" |
#include "base/logging.h" |
#include "dart/runtime/include/dart_api.h" |
-#include "mojo/dart/embedder/builtin.h" |
-#include "mojo/dart/embedder/common.h" |
-#include "mojo/dart/embedder/dart_controller.h" |
- |
-namespace mojo { |
-namespace dart { |
+#include "sky/engine/tonic/dart_error.h" |
+#include "sky/engine/tonic/dart_string.h" |
#define RETURN_ERROR_HANDLE(handle) \ |
if (Dart_IsError(handle)) { \ |
@@ -20,14 +16,14 @@ namespace dart { |
#define SHUTDOWN_ON_ERROR(handle) \ |
if (Dart_IsError(handle)) { \ |
- error_msg_ = strdup(Dart_GetError(handle)); \ |
+ *error = strdup(Dart_GetError(handle)); \ |
Dart_ExitScope(); \ |
Dart_ShutdownIsolate(); \ |
return false; \ |
} |
-#define kLibrarySourceNamePrefix "/vmservice" |
-static const char* kVMServiceIOLibraryScriptResourceName = "main.dart"; |
+#define kLibrarySourceNamePrefix "/dart_service_isolate" |
+static const char* kServiceIsolateScript = "main.dart"; |
struct ResourcesEntry { |
const char* path_; |
@@ -35,7 +31,13 @@ struct ResourcesEntry { |
int length_; |
}; |
-extern ResourcesEntry __dart_embedder_service_isolate_resources_[]; |
+namespace mojo { |
+ namespace dart { |
+ extern ResourcesEntry __sky_embedder_service_isolate_resources_[]; |
+ } |
+} |
+ |
+namespace blink { |
class Resources { |
public: |
@@ -75,102 +77,76 @@ class Resources { |
return NULL; |
} |
static ResourcesEntry* ResourcesTable() { |
- return &__dart_embedder_service_isolate_resources_[0]; |
+ return &mojo::dart::__sky_embedder_service_isolate_resources_[0]; |
} |
}; |
-void ServiceIsolate_TriggerResourceLoad(Dart_NativeArguments args) { |
+void DartServiceIsolate::TriggerResourceLoad(Dart_NativeArguments args) { |
Dart_Handle library = Dart_RootLibrary(); |
DCHECK(!Dart_IsError(library)); |
- Dart_Handle result = VmService::LoadResources(library); |
+ Dart_Handle result = LoadResources(library); |
DCHECK(!Dart_IsError(result)); |
} |
-void ServiceIsolate_NotifyServerState(Dart_NativeArguments args) { |
- Dart_EnterScope(); |
- const char* ip_chars; |
- Dart_Handle ip_arg = Dart_GetNativeArgument(args, 0); |
- if (Dart_IsError(ip_arg)) { |
- VmService::SetServerIPAndPort("", 0); |
- Dart_ExitScope(); |
- return; |
- } |
- Dart_Handle result = Dart_StringToCString(ip_arg, &ip_chars); |
- if (Dart_IsError(result)) { |
- VmService::SetServerIPAndPort("", 0); |
- Dart_ExitScope(); |
- return; |
- } |
- Dart_Handle port_arg = Dart_GetNativeArgument(args, 1); |
- if (Dart_IsError(port_arg)) { |
- VmService::SetServerIPAndPort("", 0); |
- Dart_ExitScope(); |
- return; |
- } |
- int64_t port = DartEmbedder::GetInt64ValueCheckRange(port_arg, 0, 65535); |
- VmService::SetServerIPAndPort(ip_chars, port); |
- Dart_ExitScope(); |
+void DartServiceIsolate::NotifyServerState(Dart_NativeArguments args) { |
+ // NO-OP. |
} |
-void ServiceIsolate_Shutdown(Dart_NativeArguments args) { |
- Dart_EnterScope(); |
- DartController::ShutdownDartMojoIo(); |
- Dart_ExitScope(); |
+void DartServiceIsolate::Shutdown(Dart_NativeArguments args) { |
+ // NO-OP. |
} |
-struct VmServiceIONativeEntry { |
- const char* name; |
- int num_arguments; |
- Dart_NativeFunction function; |
-}; |
- |
- |
-static VmServiceIONativeEntry _VmServiceIONativeEntries[] = { |
- {"ServiceIsolate_TriggerResourceLoad", 0, ServiceIsolate_TriggerResourceLoad}, |
- {"ServiceIsolate_NotifyServerState", 2, ServiceIsolate_NotifyServerState}, |
- {"ServiceIsolate_Shutdown", 0, ServiceIsolate_Shutdown }, |
+DartBuiltin::Natives DartServiceIsolate::native_entries_[] = { |
+ {"ServiceIsolate_TriggerResourceLoad", TriggerResourceLoad, 0 }, |
+ {"ServiceIsolate_NotifyServerState", NotifyServerState, 2 }, |
+ {"ServiceIsolate_Shutdown", Shutdown, 0 }, |
}; |
- |
-static Dart_NativeFunction VmServiceIONativeResolver(Dart_Handle name, |
- int num_arguments, |
- bool* auto_setup_scope) { |
- const char* function_name = NULL; |
- Dart_Handle result = Dart_StringToCString(name, &function_name); |
- DCHECK(!Dart_IsError(result)); |
- DCHECK(function_name != NULL); |
- *auto_setup_scope = true; |
- intptr_t n = |
- sizeof(_VmServiceIONativeEntries) / sizeof(_VmServiceIONativeEntries[0]); |
- for (intptr_t i = 0; i < n; i++) { |
- VmServiceIONativeEntry entry = _VmServiceIONativeEntries[i]; |
- if ((strcmp(function_name, entry.name) == 0) && |
- (num_arguments == entry.num_arguments)) { |
- return entry.function; |
- } |
- } |
- return NULL; |
+Dart_NativeFunction DartServiceIsolate::NativeResolver(Dart_Handle name, |
+ int argument_count, |
+ bool* auto_setup_scope) { |
+ CHECK(builtins_); |
+ return builtins_->Resolver(name, argument_count, auto_setup_scope); |
} |
+const uint8_t* DartServiceIsolate::NativeSymbolizer( |
+ Dart_NativeFunction native_function) { |
+ CHECK(builtins_); |
+ return builtins_->Symbolizer(native_function); |
+} |
-const char* VmService::error_msg_ = NULL; |
-char VmService::server_ip_[kServerIpStringBufferSize]; |
-intptr_t VmService::server_port_ = 0; |
+Dart_LibraryTagHandler DartServiceIsolate::embedder_tag_handler_ = nullptr; |
+DartBuiltin* DartServiceIsolate::builtins_ = nullptr; |
-bool VmService::Setup(const char* server_ip, intptr_t server_port) { |
+bool DartServiceIsolate::Startup(std::string server_ip, |
+ intptr_t server_port, |
+ Dart_LibraryTagHandler embedder_tag_handler, |
+ char** error) { |
Dart_Isolate isolate = Dart_CurrentIsolate(); |
- DCHECK(isolate != NULL); |
- SetServerIPAndPort("", 0); |
+ CHECK(isolate); |
+ |
+ // Remember the embedder's library tag handler. |
+ embedder_tag_handler_ = embedder_tag_handler; |
+ CHECK(embedder_tag_handler_); |
+ |
+ // Setup native entries. |
+ builtins_ = |
+ new DartBuiltin(&DartServiceIsolate::native_entries_[0], |
+ sizeof(native_entries_) / sizeof(native_entries_[0])); |
eseidel
2015/04/27 17:38:37
I thought we had a macro in base for this?
Cutch
2015/05/05 22:07:23
Done.
|
Dart_Handle result; |
+ // Use our own library tag handler when loading service isolate sources. |
+ Dart_SetLibraryTagHandler(DartServiceIsolate::LibraryTagHandler); |
// Load main script. |
- Dart_SetLibraryTagHandler(VmService::LibraryTagHandler); |
- Dart_Handle library = LoadScript(kVMServiceIOLibraryScriptResourceName); |
+ Dart_Handle library = LoadScript(kServiceIsolateScript); |
DCHECK(library != Dart_Null()); |
SHUTDOWN_ON_ERROR(library); |
- result = Dart_SetNativeResolver(library, VmServiceIONativeResolver, NULL); |
+ // Setup native entry resolution. |
+ result = Dart_SetNativeResolver(library, NativeResolver, NativeSymbolizer); |
+ |
SHUTDOWN_ON_ERROR(result); |
+ // Finalize loading. |
result = Dart_FinalizeLoading(false); |
SHUTDOWN_ON_ERROR(result); |
@@ -181,7 +157,7 @@ bool VmService::Setup(const char* server_ip, intptr_t server_port) { |
if (!retval) { |
Dart_EnterIsolate(isolate); |
Dart_ShutdownIsolate(); |
- error_msg_ = "Invalid isolate state - Unable to make it runnable."; |
+ *error = strdup("Invalid isolate state - Unable to make it runnable."); |
return false; |
} |
Dart_EnterIsolate(isolate); |
@@ -190,8 +166,11 @@ bool VmService::Setup(const char* server_ip, intptr_t server_port) { |
library = Dart_RootLibrary(); |
SHUTDOWN_ON_ERROR(library); |
- // Set HTTP server state. |
- DartEmbedder::SetStringField(library, "_ip", server_ip); |
+ // Set the HTTP server's ip. |
+ result = Dart_SetField(library, |
+ Dart_NewStringFromCString("_ip"), |
+ Dart_NewStringFromCString(server_ip.c_str())); |
+ SHUTDOWN_ON_ERROR(result); |
// If we have a port specified, start the server immediately. |
bool auto_start = server_port >= 0; |
if (server_port < 0) { |
@@ -199,31 +178,19 @@ bool VmService::Setup(const char* server_ip, intptr_t server_port) { |
// port when the HTTP server is started. |
server_port = 0; |
} |
- DartEmbedder::SetIntegerField(library, "_port", server_port); |
+ // Set the HTTP's servers port. |
result = Dart_SetField(library, |
- DartEmbedder::NewCString("_autoStart"), |
+ Dart_NewStringFromCString("_port"), |
+ Dart_NewInteger(server_port)); |
+ SHUTDOWN_ON_ERROR(result); |
+ result = Dart_SetField(library, |
+ Dart_NewStringFromCString("_autoStart"), |
Dart_NewBoolean(auto_start)); |
SHUTDOWN_ON_ERROR(result); |
return true; |
} |
- |
-const char* VmService::GetErrorMessage() { |
- return error_msg_ == NULL ? "No error." : error_msg_; |
-} |
- |
- |
-void VmService::SetServerIPAndPort(const char* ip, intptr_t port) { |
- if (ip == NULL) { |
- ip = ""; |
- } |
- strncpy(server_ip_, ip, kServerIpStringBufferSize); |
- server_ip_[kServerIpStringBufferSize - 1] = '\0'; |
- server_port_ = port; |
-} |
- |
- |
-Dart_Handle VmService::GetSource(const char* name) { |
+Dart_Handle DartServiceIsolate::GetSource(const char* name) { |
const intptr_t kBufferSize = 512; |
char buffer[kBufferSize]; |
snprintf(&buffer[0], kBufferSize-1, "%s/%s", kLibrarySourceNamePrefix, name); |
@@ -233,22 +200,19 @@ Dart_Handle VmService::GetSource(const char* name) { |
return Dart_NewStringFromCString(vmservice_source); |
} |
- |
-Dart_Handle VmService::LoadScript(const char* name) { |
- Dart_Handle url = Dart_NewStringFromCString("dart:vmservice_io"); |
+Dart_Handle DartServiceIsolate::LoadScript(const char* name) { |
+ Dart_Handle url = Dart_NewStringFromCString("dart:vmservice_sky"); |
Dart_Handle source = GetSource(name); |
return Dart_LoadScript(url, source, 0, 0); |
} |
- |
-Dart_Handle VmService::LoadSource(Dart_Handle library, const char* name) { |
+Dart_Handle DartServiceIsolate::LoadSource(Dart_Handle library, const char* name) { |
Dart_Handle url = Dart_NewStringFromCString(name); |
Dart_Handle source = GetSource(name); |
return Dart_LoadSource(library, url, source, 0, 0); |
} |
- |
-Dart_Handle VmService::LoadResource(Dart_Handle library, |
+Dart_Handle DartServiceIsolate::LoadResource(Dart_Handle library, |
const char* resource_name) { |
// Prepare for invoke call. |
Dart_Handle name = Dart_NewStringFromCString(resource_name); |
@@ -282,8 +246,7 @@ Dart_Handle VmService::LoadResource(Dart_Handle library, |
return result; |
} |
- |
-Dart_Handle VmService::LoadResources(Dart_Handle library) { |
+Dart_Handle DartServiceIsolate::LoadResources(Dart_Handle library) { |
Dart_Handle result = Dart_Null(); |
intptr_t prefixLen = strlen(kLibrarySourceNamePrefix); |
for (intptr_t i = 0; Resources::Path(i) != NULL; i++) { |
@@ -300,8 +263,7 @@ Dart_Handle VmService::LoadResources(Dart_Handle library) { |
return result; |
} |
- |
-Dart_Handle VmService::LibraryTagHandler(Dart_LibraryTag tag, |
+Dart_Handle DartServiceIsolate::LibraryTagHandler(Dart_LibraryTag tag, |
Dart_Handle library, |
Dart_Handle url) { |
if (!Dart_IsLibrary(library)) { |
@@ -323,13 +285,14 @@ Dart_Handle VmService::LibraryTagHandler(Dart_LibraryTag tag, |
} |
if (tag == Dart_kImportTag) { |
// Embedder handles all requests for external libraries. |
- return DartController::LibraryTagHandler(tag, library, url); |
+ return embedder_tag_handler_(tag, library, url); |
} |
DCHECK((tag == Dart_kSourceTag) || (tag == Dart_kCanonicalizeUrl)); |
if (tag == Dart_kCanonicalizeUrl) { |
// url is already canonicalized. |
return url; |
} |
+ // Get source from builtin resources. |
Dart_Handle source = GetSource(url_string); |
if (Dart_IsError(source)) { |
return source; |
@@ -338,5 +301,4 @@ Dart_Handle VmService::LibraryTagHandler(Dart_LibraryTag tag, |
} |
-} // namespace dart |
-} // namespace mojo |
+} // namespace blink |