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

Side by Side Diff: runtime/bin/loader.cc

Issue 2045023003: Fix deferred load errors / bug #26482 (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 6 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 5
6 #include "bin/loader.h" 6 #include "bin/loader.h"
7 7
8 #include "bin/builtin.h" 8 #include "bin/builtin.h"
9 #include "bin/dartutils.h" 9 #include "bin/dartutils.h"
10 #include "bin/extensions.h" 10 #include "bin/extensions.h"
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 break; 206 break;
207 } 207 }
208 208
209 // Wait to be notified about new I/O results. 209 // Wait to be notified about new I/O results.
210 ml.Wait(); 210 ml.Wait();
211 } 211 }
212 } 212 }
213 213
214 214
215 bool Loader::ProcessResultLocked(Loader::IOResult* result) { 215 bool Loader::ProcessResultLocked(Loader::IOResult* result) {
216 // A negative result tag indicates a loading error occurred in the service
217 // isolate. The payload is a C string of the error message.
218 if (result->tag < 0) {
219 error_ =
220 Dart_NewUnhandledExceptionError(
221 Dart_NewStringFromUTF8(result->payload,
222 result->payload_length));
223
224 return false;
225 }
226
227 // We have to copy everything we care about out of |result| because after 216 // We have to copy everything we care about out of |result| because after
228 // dropping the lock below |result| may no longer valid. 217 // dropping the lock below |result| may no longer valid.
229 Dart_Handle uri = 218 Dart_Handle uri =
230 Dart_NewStringFromCString(reinterpret_cast<char*>(result->uri)); 219 Dart_NewStringFromCString(reinterpret_cast<char*>(result->uri));
231 Dart_Handle library_uri = Dart_Null(); 220 Dart_Handle library_uri = Dart_Null();
232 if (result->library_uri != NULL) { 221 if (result->library_uri != NULL) {
233 library_uri = 222 library_uri =
234 Dart_NewStringFromCString(reinterpret_cast<char*>(result->library_uri)); 223 Dart_NewStringFromCString(reinterpret_cast<char*>(result->library_uri));
235 } 224 }
225
226 // A negative result tag indicates a loading error occurred in the service
227 // isolate. The payload is a C string of the error message.
228 if (result->tag < 0) {
229 Dart_Handle library = Dart_LookupLibrary(uri);
230 Dart_Handle error = Dart_NewStringFromUTF8(result->payload,
231 result->payload_length);
232 // If a library with the given uri exists, give it a chance to handle
233 // the error. If the load requests stems from a deferred library load,
234 // an IO error is not fatal.
235 if (!Dart_IsNull(library) && !Dart_IsError(library)) {
236 ASSERT(Dart_IsLibrary(library));
237 Dart_Handle res = Dart_LibraryHandleError(library, error);
238 if (Dart_IsNull(res)) {
239 return true;
240 }
241 }
242 // Fall through
243 error_ = Dart_NewUnhandledExceptionError(error);
244 return false;
245 }
246
247
236 // Check for payload and load accordingly. 248 // Check for payload and load accordingly.
237 bool is_snapshot = false; 249 bool is_snapshot = false;
238 const uint8_t* payload = result->payload; 250 const uint8_t* payload = result->payload;
239 intptr_t payload_length = result->payload_length; 251 intptr_t payload_length = result->payload_length;
240 payload = 252 payload =
241 DartUtils::SniffForMagicNumber(payload, 253 DartUtils::SniffForMagicNumber(payload,
242 &payload_length, 254 &payload_length,
243 &is_snapshot); 255 &is_snapshot);
244 Dart_Handle source = Dart_Null(); 256 Dart_Handle source = Dart_Null();
245 if (!is_snapshot) { 257 if (!is_snapshot) {
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after
576 MutexLocker ml(&loader_infos_lock_); 588 MutexLocker ml(&loader_infos_lock_);
577 Loader* loader = LoaderForLocked(dest_port_id); 589 Loader* loader = LoaderForLocked(dest_port_id);
578 if (loader == NULL) { 590 if (loader == NULL) {
579 return; 591 return;
580 } 592 }
581 loader->QueueMessage(message); 593 loader->QueueMessage(message);
582 } 594 }
583 595
584 } // namespace bin 596 } // namespace bin
585 } // namespace dart 597 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/bin/loader.h ('k') | runtime/lib/lib_prefix.dart » ('j') | runtime/lib/object.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698