Index: runtime/vm/precompiler.cc |
diff --git a/runtime/vm/precompiler.cc b/runtime/vm/precompiler.cc |
index 6fb4247720af390e1a8c866357706a26dee36f5e..317e718af4f6cdeeec634de66b359cf05b098866 100644 |
--- a/runtime/vm/precompiler.cc |
+++ b/runtime/vm/precompiler.cc |
@@ -28,11 +28,12 @@ static void Jump(const Error& error) { |
} |
-RawError* Precompiler::CompileAll() { |
+RawError* Precompiler::CompileAll( |
+ Dart_QualifiedFunctionName embedder_entry_points[]) { |
LongJumpScope jump; |
if (setjmp(*jump.Set()) == 0) { |
Precompiler precompiler(Thread::Current()); |
- precompiler.DoCompileAll(); |
+ precompiler.DoCompileAll(embedder_entry_points); |
return Error::null(); |
} else { |
Isolate* isolate = Isolate::Current(); |
@@ -61,7 +62,8 @@ Precompiler::Precompiler(Thread* thread) : |
} |
-void Precompiler::DoCompileAll() { |
+void Precompiler::DoCompileAll( |
+ Dart_QualifiedFunctionName embedder_entry_points[]) { |
LogBlock lb; |
// Drop all existing code so we can use the presence of code as an indicator |
@@ -69,7 +71,7 @@ void Precompiler::DoCompileAll() { |
ClearAllCode(); |
// Start with the allocations and invocations that happen from C++. |
- AddRoots(); |
+ AddRoots(embedder_entry_points); |
// TODO(rmacnak): Eagerly add field-invocation functions to all signature |
// classes so closure calls don't go through the runtime. |
@@ -126,7 +128,7 @@ void Precompiler::ClearAllCode() { |
} |
-void Precompiler::AddRoots() { |
+void Precompiler::AddRoots(Dart_QualifiedFunctionName embedder_entry_points[]) { |
// Note that <rootlibrary>.main is not a root. The appropriate main will be |
// discovered through _getMainClosure. |
@@ -201,85 +203,66 @@ void Precompiler::AddRoots() { |
AddClass(cls); |
} |
- static const struct { |
- const char* library_; |
- const char* class_; |
- const char* function_; |
- } kExternallyCalled[] = { |
- { "dart:_builtin", "::", "_getMainClosure" }, |
- { "dart:_builtin", "::", "_getPrintClosure" }, |
- { "dart:_builtin", "::", "_getUriBaseClosure" }, |
- { "dart:_builtin", "::", "_resolveUri" }, |
- { "dart:_builtin", "::", "_setWorkingDirectory" }, |
- { "dart:_builtin", "::", "_loadDataAsync" }, |
+ Dart_QualifiedFunctionName vm_entry_points[] = { |
{ "dart:async", "::", "_setScheduleImmediateClosure" }, |
+ { "dart:core", "AbstractClassInstantiationError", |
+ "AbstractClassInstantiationError._create" }, |
+ { "dart:core", "ArgumentError", "ArgumentError." }, |
+ { "dart:core", "AssertionError", "AssertionError." }, |
+ { "dart:core", "CyclicInitializationError", |
+ "CyclicInitializationError." }, |
+ { "dart:core", "FallThroughError", "FallThroughError._create" }, |
+ { "dart:core", "FormatException", "FormatException." }, |
+ { "dart:core", "NoSuchMethodError", "NoSuchMethodError._withType" }, |
+ { "dart:core", "NullThrownError", "NullThrownError." }, |
+ { "dart:core", "OutOfMemoryError", "OutOfMemoryError." }, |
+ { "dart:core", "RangeError", "RangeError." }, |
+ { "dart:core", "RangeError", "RangeError.range" }, |
+ { "dart:core", "StackOverflowError", "StackOverflowError." }, |
+ { "dart:core", "UnsupportedError", "UnsupportedError." }, |
+ { "dart:core", "_CastError", "_CastError._create" }, |
{ "dart:core", "_InternalError", "_InternalError." }, |
{ "dart:core", "_InvocationMirror", "_allocateInvocationMirror" }, |
- { "dart:io", "::", "_makeUint8ListView" }, |
- { "dart:io", "::", "_makeDatagram" }, |
- { "dart:io", "::", "_setupHooks" }, |
- { "dart:io", "CertificateException", "CertificateException." }, |
- { "dart:io", "HandshakeException", "HandshakeException." }, |
- { "dart:io", "TlsException", "TlsException." }, |
- { "dart:io", "X509Certificate", "X509Certificate." }, |
- { "dart:io", "_ExternalBuffer", "set:data" }, |
- { "dart:io", "_Platform", "set:_nativeScript" }, |
- { "dart:io", "_ProcessStartStatus", "set:_errorCode" }, |
- { "dart:io", "_ProcessStartStatus", "set:_errorMessage" }, |
- { "dart:io", "_SecureFilterImpl", "get:ENCRYPTED_SIZE" }, |
- { "dart:io", "_SecureFilterImpl", "get:SIZE" }, |
+ { "dart:core", "_JavascriptCompatibilityError", |
+ "_JavascriptCompatibilityError." }, |
+ { "dart:core", "_JavascriptIntegerOverflowError", |
+ "_JavascriptIntegerOverflowError." }, |
+ { "dart:core", "_TypeError", "_TypeError._create" }, |
+ { "dart:isolate", "IsolateSpawnException", "IsolateSpawnException." }, |
+ { "dart:isolate", "_IsolateUnhandledException", |
+ "_IsolateUnhandledException." }, |
{ "dart:isolate", "::", "_getIsolateScheduleImmediateClosure" }, |
- { "dart:isolate", "::", "_startMainIsolate" }, |
{ "dart:isolate", "::", "_setupHooks" }, |
+ { "dart:isolate", "::", "_startMainIsolate" }, |
{ "dart:isolate", "_RawReceivePortImpl", "_handleMessage" }, |
{ "dart:isolate", "_RawReceivePortImpl", "_lookupHandler" }, |
{ "dart:vmservice", "::", "_registerIsolate" }, |
{ "dart:vmservice", "::", "boot" }, |
- { "dart:vmservice_io", "::", "_addResource" }, |
- { "dart:vmservice_io", "::", "main" }, |
- |
- // Cf. Exceptions::Create |
- { "dart:core", "RangeError", "RangeError." }, |
- { "dart:core", "RangeError", "RangeError.range" }, |
- { "dart:core", "ArgumentError", "ArgumentError." }, |
- { "dart:core", "NoSuchMethodError", "NoSuchMethodError._withType" }, |
- { "dart:core", "FormatException", "FormatException." }, |
- { "dart:core", "UnsupportedError", "UnsupportedError." }, |
- { "dart:core", "NullThrownError", "NullThrownError." }, |
- { "dart:isolate", "IsolateSpawnException", "IsolateSpawnException." }, |
- { "dart:isolate", "_IsolateUnhandledException", |
- "_IsolateUnhandledException." }, |
- { "dart:core", "_JavascriptIntegerOverflowError", |
- "_JavascriptIntegerOverflowError." }, |
- { "dart:core", "_JavascriptCompatibilityError", |
- "_JavascriptCompatibilityError." }, |
- { "dart:core", "AssertionError", "AssertionError." }, |
- { "dart:core", "_CastError", "_CastError._create" }, |
- { "dart:core", "_TypeError", "_TypeError._create" }, |
- { "dart:core", "FallThroughError", "FallThroughError._create" }, |
- { "dart:core", "AbstractClassInstantiationError", |
- "AbstractClassInstantiationError._create" }, |
- { "dart:core", "CyclicInitializationError", |
- "CyclicInitializationError." }, |
- { "dart:core", "StackOverflowError", "StackOverflowError." }, |
- { "dart:core", "OutOfMemoryError", "OutOfMemoryError." }, |
- { NULL, NULL, NULL } |
+ { NULL, NULL, NULL } // Must be terminated with NULL entries. |
}; |
+ AddEntryPoints(vm_entry_points); |
+ AddEntryPoints(embedder_entry_points); |
+} |
+ |
+ |
+void Precompiler::AddEntryPoints(Dart_QualifiedFunctionName entry_points[]) { |
Library& lib = Library::Handle(Z); |
+ Class& cls = Class::Handle(Z); |
Function& func = Function::Handle(Z); |
- String& library_name = String::Handle(Z); |
+ String& library_uri = String::Handle(Z); |
String& class_name = String::Handle(Z); |
String& function_name = String::Handle(Z); |
- for (intptr_t i = 0; kExternallyCalled[i].library_ != NULL; i++) { |
- library_name = Symbols::New(kExternallyCalled[i].library_); |
- class_name = Symbols::New(kExternallyCalled[i].class_); |
- function_name = Symbols::New(kExternallyCalled[i].function_); |
- lib = Library::LookupLibrary(library_name); |
+ for (intptr_t i = 0; entry_points[i].library_uri != NULL; i++) { |
+ library_uri = Symbols::New(entry_points[i].library_uri); |
+ class_name = Symbols::New(entry_points[i].class_name); |
+ function_name = Symbols::New(entry_points[i].function_name); |
+ |
+ lib = Library::LookupLibrary(library_uri); |
if (lib.IsNull()) { |
if (FLAG_trace_precompiler) { |
- THR_Print("WARNING: Missing %s\n", kExternallyCalled[i].library_); |
+ THR_Print("WARNING: Missing %s\n", entry_points[i].library_uri); |
} |
continue; |
} |
@@ -291,8 +274,8 @@ void Precompiler::AddRoots() { |
if (cls.IsNull()) { |
if (FLAG_trace_precompiler) { |
THR_Print("WARNING: Missing %s %s\n", |
- kExternallyCalled[i].library_, |
- kExternallyCalled[i].class_); |
+ entry_points[i].library_uri, |
+ entry_points[i].class_name); |
} |
continue; |
} |
@@ -304,9 +287,9 @@ void Precompiler::AddRoots() { |
if (func.IsNull()) { |
if (FLAG_trace_precompiler) { |
THR_Print("WARNING: Missing %s %s %s\n", |
- kExternallyCalled[i].library_, |
- kExternallyCalled[i].class_, |
- kExternallyCalled[i].function_); |
+ entry_points[i].library_uri, |
+ entry_points[i].class_name, |
+ entry_points[i].function_name); |
} |
continue; |
} |