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

Unified Diff: runtime/bin/loader.cc

Issue 2715463003: Add option to gen_snapshot for creating a Makefile describing a snapshot's dependencies. (Closed)
Patch Set: Created 3 years, 10 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/bin/loader.cc
diff --git a/runtime/bin/loader.cc b/runtime/bin/loader.cc
index 70ee44471d6628f2a7a1892515fe274d6a771c2b..f83081d71e91b0ba8b80497fd5eb68940306412f 100644
--- a/runtime/bin/loader.cc
+++ b/runtime/bin/loader.cc
@@ -20,6 +20,7 @@ namespace bin {
static bool trace_loader = false;
// Keep in sync with loader.dart.
static const intptr_t _Dart_kImportExtension = 9;
+static const intptr_t _Dart_kResolveAsFilePath = 10;
Loader::Loader(IsolateData* isolate_data)
: port_(ILLEGAL_PORT),
@@ -424,7 +425,7 @@ bool Loader::ProcessResultLocked(Loader* loader, Loader::IOResult* result) {
}
-bool Loader::ProcessUrlLoadResultLocked(Loader* loader,
+bool Loader::ProcessPayloadResultLocked(Loader* loader,
Loader::IOResult* result) {
// A negative result tag indicates a loading error occurred in the service
// isolate. The payload is a C string of the error message.
@@ -537,7 +538,50 @@ Dart_Handle Loader::LoadUrlContents(Dart_Handle url,
loader->SendRequest(Dart_kScriptTag, url, Dart_Null());
// Wait for a reply to the load request.
- loader->BlockUntilComplete(ProcessUrlLoadResultLocked);
+ loader->BlockUntilComplete(ProcessPayloadResultLocked);
+
+ // Copy fields from the loader before deleting it.
+ // The payload array itself which was malloced above is freed by
+ // the caller of LoadUrlContents.
+ Dart_Handle error = loader->error();
+ *payload = loader->payload_;
+ *payload_length = loader->payload_length_;
+
+ // Destroy the loader. The destructor does a bunch of leg work.
+ delete loader;
+
+ // An error occurred during loading.
+ if (!Dart_IsNull(error)) {
+ return error;
+ }
+ return Dart_Null();
+}
+
+
+Dart_Handle Loader::ResolveAsFilePath(Dart_Handle url,
+ uint8_t** payload,
+ intptr_t* payload_length) {
+ IsolateData* isolate_data =
+ reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData());
+ ASSERT(isolate_data != NULL);
+ ASSERT(!isolate_data->HasLoader());
+ Loader* loader = NULL;
+
+ // Setup the loader. The constructor does a bunch of leg work.
+ loader = new Loader(isolate_data);
+ loader->Init(isolate_data->package_root, isolate_data->packages_file,
+ DartUtils::original_working_directory, NULL);
+ ASSERT(loader != NULL);
+ ASSERT(isolate_data->HasLoader());
+
+ // Now send a load request to the service isolate.
+ // TODO(28863) The use of tags that aren't declared in dart_api.h's enum
+ // is undefined behavior.
+ Dart_LibraryTag tag = static_cast<Dart_LibraryTag>(_Dart_kResolveAsFilePath);
+ loader->SendRequest(tag, url, Dart_Null());
+
+ // Wait for a reply to the load request.
+ loader->BlockUntilComplete(ProcessPayloadResultLocked);
// Copy fields from the loader before deleting it.
// The payload array itself which was malloced above is freed by

Powered by Google App Engine
This is Rietveld 408576698