| Index: runtime/vm/dart_api_impl.cc
|
| diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
|
| index b33699429fef3dc04ca5fd0d2bd464a9cafdb199..18f9280e68b3c3fd31caa4ed6b1ce046bdb3dcc4 100644
|
| --- a/runtime/vm/dart_api_impl.cc
|
| +++ b/runtime/vm/dart_api_impl.cc
|
| @@ -62,6 +62,7 @@ namespace dart {
|
| DECLARE_FLAG(bool, use_dart_frontend);
|
| DECLARE_FLAG(bool, print_class_table);
|
| DECLARE_FLAG(bool, verify_handles);
|
| +DECLARE_FLAG(bool, use_dart_frontend);
|
| #if defined(DART_NO_SNAPSHOT)
|
| DEFINE_FLAG(bool,
|
| check_function_fingerprints,
|
| @@ -5006,6 +5007,22 @@ static void CompileSource(Thread* thread,
|
| }
|
| }
|
|
|
| +#if !defined(DART_PRECOMPILED_RUNTIME)
|
| +static Dart_Handle LoadKernelProgram(Thread* T,
|
| + const String& url,
|
| + void* kernel) {
|
| + // NOTE: Now the VM owns the [kernel_program] memory! Currently we do not
|
| + // free it because (similar to the token stream) it will be used to repeatedly
|
| + // run the `kernel::FlowGraphBuilder()`.
|
| + kernel::KernelReader reader(reinterpret_cast<kernel::Program*>(kernel));
|
| + const Object& tmp = reader.ReadProgram();
|
| + if (tmp.IsError()) {
|
| + return Api::NewHandle(T, tmp.raw());
|
| + }
|
| + return Dart_Null();
|
| +}
|
| +#endif
|
| +
|
| DART_EXPORT Dart_Handle Dart_LoadScript(Dart_Handle url,
|
| Dart_Handle resolved_url,
|
| Dart_Handle source,
|
| @@ -5025,10 +5042,6 @@ DART_EXPORT Dart_Handle Dart_LoadScript(Dart_Handle url,
|
| if (resolved_url_str.IsNull()) {
|
| RETURN_TYPE_ERROR(Z, resolved_url, String);
|
| }
|
| - const String& source_str = Api::UnwrapStringHandle(Z, source);
|
| - if (source_str.IsNull()) {
|
| - RETURN_TYPE_ERROR(Z, source, String);
|
| - }
|
| Library& library = Library::Handle(Z, I->object_store()->root_library());
|
| if (!library.IsNull()) {
|
| const String& library_url = String::Handle(Z, library.url());
|
| @@ -5046,6 +5059,32 @@ DART_EXPORT Dart_Handle Dart_LoadScript(Dart_Handle url,
|
| CHECK_CALLBACK_STATE(T);
|
| CHECK_COMPILATION_ALLOWED(I);
|
|
|
| + Dart_Handle result;
|
| +#if !defined(DART_PRECOMPILED_RUNTIME)
|
| + if (FLAG_use_dart_frontend && !KernelIsolate::IsKernelIsolate(I)) {
|
| + if ((source == Api::Null()) || (source == NULL)) {
|
| + RETURN_NULL_ERROR(source);
|
| + }
|
| + void* kernel_pgm = reinterpret_cast<void*>(source);
|
| + result = LoadKernelProgram(T, resolved_url_str, kernel_pgm);
|
| + if (Dart_IsError(result)) {
|
| + return result;
|
| + }
|
| + library ^= Library::LookupLibrary(T, resolved_url_str);
|
| + if (library.IsNull()) {
|
| + return Api::NewError("%s: Unable to load script '%s' correctly.",
|
| + CURRENT_FUNC, resolved_url_str.ToCString());
|
| + }
|
| + I->object_store()->set_root_library(library);
|
| + return Api::NewHandle(T, library.raw());
|
| + }
|
| +#endif
|
| +
|
| + const String& source_str = Api::UnwrapStringHandle(Z, source);
|
| + if (source_str.IsNull()) {
|
| + RETURN_TYPE_ERROR(Z, source, String);
|
| + }
|
| +
|
| NoHeapGrowthControlScope no_growth_control;
|
|
|
| library = Library::New(url_str);
|
| @@ -5057,7 +5096,6 @@ DART_EXPORT Dart_Handle Dart_LoadScript(Dart_Handle url,
|
| Script::Handle(Z, Script::New(url_str, resolved_url_str, source_str,
|
| RawScript::kScriptTag));
|
| script.SetLocationOffset(line_offset, column_offset);
|
| - Dart_Handle result;
|
| CompileSource(T, library, script, &result);
|
| return result;
|
| }
|
| @@ -5362,21 +5400,6 @@ DART_EXPORT Dart_Handle Dart_LibraryHandleError(Dart_Handle library_in,
|
| return error_in;
|
| }
|
|
|
| -#if !defined(DART_PRECOMPILED_RUNTIME)
|
| -static Dart_Handle LoadKernelProgram(Dart_Handle url, Thread* T, void* kernel) {
|
| - kernel::KernelReader reader(reinterpret_cast<kernel::Program*>(kernel));
|
| - const Object& tmp = reader.ReadProgram();
|
| - if (tmp.IsError()) {
|
| - return Api::NewHandle(T, tmp.raw());
|
| - }
|
| -
|
| - const String& url_str = Api::UnwrapStringHandle(Z, url);
|
| - Library& library =
|
| - Library::Handle(T->zone(), Library::LookupLibrary(T, url_str));
|
| - return Api::NewHandle(T, library.raw());
|
| -}
|
| -#endif
|
| -
|
| DART_EXPORT Dart_Handle Dart_LoadLibrary(Dart_Handle url,
|
| Dart_Handle resolved_url,
|
| Dart_Handle source,
|
| @@ -5386,19 +5409,23 @@ DART_EXPORT Dart_Handle Dart_LoadLibrary(Dart_Handle url,
|
| DARTSCOPE(Thread::Current());
|
| Isolate* I = T->isolate();
|
|
|
| + const String& url_str = Api::UnwrapStringHandle(Z, url);
|
| + if (url_str.IsNull()) {
|
| + RETURN_TYPE_ERROR(Z, url, String);
|
| + }
|
| + Dart_Handle result;
|
| #if !defined(DART_PRECOMPILED_RUNTIME)
|
| // Kernel isolate is loaded from script in case of dart_bootstrap
|
| // even when FLAG_use_dart_frontend is true. Hence, do not interpret
|
| // |source| as a kernel if the current isolate is the kernel isolate.
|
| if (FLAG_use_dart_frontend && !KernelIsolate::IsKernelIsolate(I)) {
|
| - return LoadKernelProgram(url, T, reinterpret_cast<void*>(source));
|
| + result = LoadKernelProgram(T, url_str, reinterpret_cast<void*>(source));
|
| + if (Dart_IsError(result)) {
|
| + return result;
|
| + }
|
| + return Api::NewHandle(T, Library::LookupLibrary(T, url_str));
|
| }
|
| #endif
|
| -
|
| - const String& url_str = Api::UnwrapStringHandle(Z, url);
|
| - if (url_str.IsNull()) {
|
| - RETURN_TYPE_ERROR(Z, url, String);
|
| - }
|
| if (::Dart_IsNull(resolved_url)) {
|
| resolved_url = url;
|
| }
|
| @@ -5438,7 +5465,6 @@ DART_EXPORT Dart_Handle Dart_LoadLibrary(Dart_Handle url,
|
| Script::Handle(Z, Script::New(url_str, resolved_url_str, source_str,
|
| RawScript::kLibraryTag));
|
| script.SetLocationOffset(line_offset, column_offset);
|
| - Dart_Handle result;
|
| CompileSource(T, library, script, &result);
|
| // Propagate the error out right now.
|
| if (::Dart_IsError(result)) {
|
|
|