OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |