Index: runtime/bin/loader.cc |
diff --git a/runtime/bin/loader.cc b/runtime/bin/loader.cc |
index 58496c92def297030a6a65bf60374b2002a828f1..35a09357fdfec0bed534daf554b46b3c47f154b7 100644 |
--- a/runtime/bin/loader.cc |
+++ b/runtime/bin/loader.cc |
@@ -231,9 +231,24 @@ bool Loader::ProcessResultLocked(Loader::IOResult* result) { |
library_uri = |
Dart_NewStringFromCString(reinterpret_cast<char*>(result->library_uri)); |
} |
- Dart_Handle source = |
- Dart_NewStringFromUTF8(result->payload, |
- result->payload_length); |
+ // Check for payload and load accordingly. |
+ bool is_snapshot = false; |
+ const uint8_t* payload = result->payload; |
+ intptr_t payload_length = result->payload_length; |
+ payload = |
+ DartUtils::SniffForMagicNumber(payload, |
+ &payload_length, |
+ &is_snapshot); |
+ Dart_Handle source = Dart_Null(); |
+ if (!is_snapshot) { |
+ source = Dart_NewStringFromUTF8(result->payload, |
+ result->payload_length); |
+ if (Dart_IsError(source)) { |
+ error_ = DartUtils::NewError("%s is not a valid UTF-8 script", |
+ reinterpret_cast<char*>(result->uri)); |
+ return false; |
+ } |
+ } |
intptr_t tag = result->tag; |
// No touching. |
@@ -245,7 +260,6 @@ bool Loader::ProcessResultLocked(Loader::IOResult* result) { |
Dart_Handle dart_result = Dart_Null(); |
- |
switch (tag) { |
case Dart_kImportTag: |
dart_result = Dart_LoadLibrary(uri, source, 0, 0); |
@@ -258,7 +272,11 @@ bool Loader::ProcessResultLocked(Loader::IOResult* result) { |
} |
break; |
case Dart_kScriptTag: |
- dart_result = Dart_LoadScript(uri, source, 0, 0); |
+ if (is_snapshot) { |
+ dart_result = Dart_LoadScriptFromSnapshot(payload, payload_length); |
+ } else { |
+ dart_result = Dart_LoadScript(uri, source, 0, 0); |
+ } |
break; |
default: |
UNREACHABLE(); |