Chromium Code Reviews| 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" |
| 11 #include "bin/file.h" | 11 #include "bin/file.h" |
| 12 #include "bin/lockers.h" | 12 #include "bin/lockers.h" |
| 13 #include "bin/utils.h" | 13 #include "bin/utils.h" |
| 14 #include "include/dart_tools_api.h" | |
| 14 | 15 |
| 15 namespace dart { | 16 namespace dart { |
| 16 namespace bin { | 17 namespace bin { |
| 17 | 18 |
| 18 // Development flag. | 19 // Development flag. |
| 19 static bool trace_loader = false; | 20 static bool trace_loader = false; |
| 20 // Keep in sync with loader.dart. | 21 // Keep in sync with loader.dart. |
| 21 static const intptr_t _Dart_kImportExtension = 9; | 22 static const intptr_t _Dart_kImportExtension = 9; |
| 22 | 23 |
| 23 Loader::Loader(IsolateData* isolate_data) | 24 Loader::Loader(IsolateData* isolate_data) |
| (...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 354 intptr_t tag = result->tag; | 355 intptr_t tag = result->tag; |
| 355 | 356 |
| 356 // No touching. | 357 // No touching. |
| 357 result = NULL; | 358 result = NULL; |
| 358 | 359 |
| 359 // We must drop the lock here because the tag handler may be recursively | 360 // We must drop the lock here because the tag handler may be recursively |
| 360 // invoked and it will attempt to acquire the lock to queue more work. | 361 // invoked and it will attempt to acquire the lock to queue more work. |
| 361 loader->monitor_->Exit(); | 362 loader->monitor_->Exit(); |
| 362 | 363 |
| 363 Dart_Handle dart_result = Dart_Null(); | 364 Dart_Handle dart_result = Dart_Null(); |
| 365 bool reload_extensions = false; | |
| 364 | 366 |
| 365 switch (tag) { | 367 switch (tag) { |
| 366 case Dart_kImportTag: | 368 case Dart_kImportTag: |
| 367 dart_result = Dart_LoadLibrary(uri, resolved_uri, source, 0, 0); | 369 dart_result = Dart_LoadLibrary(uri, resolved_uri, source, 0, 0); |
| 368 break; | 370 break; |
| 369 case Dart_kSourceTag: { | 371 case Dart_kSourceTag: { |
| 370 ASSERT(library_uri != Dart_Null()); | 372 ASSERT(library_uri != Dart_Null()); |
| 371 Dart_Handle library = Dart_LookupLibrary(library_uri); | 373 Dart_Handle library = Dart_LookupLibrary(library_uri); |
| 372 ASSERT(!Dart_IsError(library)); | 374 ASSERT(!Dart_IsError(library)); |
| 373 dart_result = Dart_LoadSource(library, uri, resolved_uri, source, 0, 0); | 375 dart_result = Dart_LoadSource(library, uri, resolved_uri, source, 0, 0); |
| 374 } | 376 } |
| 375 break; | 377 break; |
| 376 case Dart_kScriptTag: | 378 case Dart_kScriptTag: |
| 377 if (payload_type == DartUtils::kSnapshotMagicNumber) { | 379 if (payload_type == DartUtils::kSnapshotMagicNumber) { |
| 378 dart_result = Dart_LoadScriptFromSnapshot(payload, payload_length); | 380 dart_result = Dart_LoadScriptFromSnapshot(payload, payload_length); |
| 381 reload_extensions = true; | |
| 379 } else if (payload_type == DartUtils::kKernelMagicNumber) { | 382 } else if (payload_type == DartUtils::kKernelMagicNumber) { |
| 380 dart_result = Dart_LoadKernel(payload, payload_length); | 383 dart_result = Dart_LoadKernel(payload, payload_length); |
| 381 } else { | 384 } else { |
| 382 dart_result = Dart_LoadScript(uri, resolved_uri, source, 0, 0); | 385 dart_result = Dart_LoadScript(uri, resolved_uri, source, 0, 0); |
| 383 } | 386 } |
| 384 break; | 387 break; |
| 385 default: | 388 default: |
| 386 UNREACHABLE(); | 389 UNREACHABLE(); |
| 387 } | 390 } |
| 388 | 391 |
| 389 // Re-acquire the lock before exiting the function (it was held before entry), | 392 // Re-acquire the lock before exiting the function (it was held before entry), |
| 390 loader->monitor_->Enter(); | 393 loader->monitor_->Enter(); |
| 391 if (Dart_IsError(dart_result)) { | 394 if (Dart_IsError(dart_result)) { |
| 392 // Remember the error if we encountered one. | 395 // Remember the error if we encountered one. |
| 393 loader->error_ = dart_result; | 396 loader->error_ = dart_result; |
| 394 return false; | 397 return false; |
| 395 } | 398 } |
| 396 | 399 |
| 400 if (reload_extensions) { | |
| 401 dart_result = ReloadNativeExtensions(); | |
| 402 if (Dart_IsError(dart_result)) { | |
| 403 // Remember the error if we encountered one. | |
| 404 loader->error_ = dart_result; | |
| 405 return false; | |
| 406 } | |
| 407 } | |
| 408 | |
| 397 return true; | 409 return true; |
| 398 } | 410 } |
| 399 | 411 |
| 400 | 412 |
| 401 bool Loader::ProcessUrlLoadResultLocked(Loader* loader, | 413 bool Loader::ProcessUrlLoadResultLocked(Loader* loader, |
| 402 Loader::IOResult* result) { | 414 Loader::IOResult* result) { |
| 403 // A negative result tag indicates a loading error occurred in the service | 415 // A negative result tag indicates a loading error occurred in the service |
| 404 // isolate. The payload is a C string of the error message. | 416 // isolate. The payload is a C string of the error message. |
| 405 if (result->tag < 0) { | 417 if (result->tag < 0) { |
| 406 Dart_Handle error = Dart_NewStringFromUTF8(result->payload, | 418 Dart_Handle error = Dart_NewStringFromUTF8(result->payload, |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 441 // Send the init message. | 453 // Send the init message. |
| 442 loader->Init(isolate_data->package_root, | 454 loader->Init(isolate_data->package_root, |
| 443 isolate_data->packages_file, | 455 isolate_data->packages_file, |
| 444 DartUtils::original_working_directory, | 456 DartUtils::original_working_directory, |
| 445 snapshot_uri); | 457 snapshot_uri); |
| 446 // Destroy the loader. The destructor does a bunch of leg work. | 458 // Destroy the loader. The destructor does a bunch of leg work. |
| 447 delete loader; | 459 delete loader; |
| 448 } | 460 } |
| 449 | 461 |
| 450 | 462 |
| 463 #define RETURN_ERROR(result) \ | |
| 464 if (Dart_IsError(result)) return result; | |
| 465 | |
| 466 Dart_Handle Loader::ReloadNativeExtensions() { | |
| 467 // For each library | |
| 468 Dart_Handle library_ids = Dart_GetLibraryIds(); | |
| 469 RETURN_ERROR(library_ids); | |
| 470 intptr_t libraries_length = -1; | |
| 471 Dart_Handle result = Dart_ListLength(library_ids, &libraries_length); | |
| 472 RETURN_ERROR(result); | |
| 473 for (intptr_t i = 0; i < libraries_length; i++) { | |
| 474 int64_t library_id = -1; | |
| 475 result = Dart_IntegerToInt64(Dart_ListGetAt(library_ids, i), | |
| 476 &library_id); | |
|
siva
2016/11/02 23:48:38
You could use Dart_ListGetRange to extract the lib
| |
| 477 RETURN_ERROR(result); | |
| 478 Dart_Handle import_ids = Dart_GetLibraryImports(library_id); | |
| 479 RETURN_ERROR(import_ids); | |
| 480 intptr_t imports_length = -1; | |
| 481 result = Dart_ListLength(import_ids, &imports_length); | |
| 482 RETURN_ERROR(result); | |
| 483 | |
| 484 // For each import | |
| 485 for (intptr_t j = 1; j < imports_length; j += 2) { | |
| 486 int64_t import_id = -1; | |
| 487 result = Dart_IntegerToInt64(Dart_ListGetAt(import_ids, j), | |
| 488 &import_id); | |
|
siva
2016/11/02 23:48:38
Ditto comment about Dart_ListGetAt
| |
| 489 RETURN_ERROR(result); | |
| 490 const char* extension_uri = NULL; | |
| 491 result = Dart_StringToCString(Dart_GetLibraryURL(import_id), | |
| 492 &extension_uri); | |
| 493 RETURN_ERROR(result); | |
| 494 | |
| 495 // If import starts with dart-ext: | |
| 496 if (strncmp(extension_uri, "dart-ext:", 9) == 0) { | |
|
siva
2016/11/02 23:48:38
magic numbers 9 , 7 etc. use named constants.
Cutch
2016/11/03 17:45:34
Also, these schemes already exist: DartUtils::kDar
| |
| 497 const char* extension_path = DartUtils::RemoveScheme(extension_uri); | |
| 498 | |
| 499 Dart_Handle library = Dart_GetLibraryFromId(library_id); | |
| 500 RETURN_ERROR(library); | |
| 501 const char* lib_uri = NULL; | |
| 502 result = Dart_StringToCString(Dart_GetLibraryURL(library_id), | |
| 503 &lib_uri); | |
| 504 RETURN_ERROR(result); | |
| 505 | |
| 506 char* lib_path = NULL; | |
| 507 if (strncmp(lib_uri, "file://", 7) == 0) { | |
| 508 lib_path = DartUtils::RemoveFilename( | |
| 509 DartUtils::RemoveScheme(lib_uri)); | |
| 510 } else { | |
| 511 lib_path = strdup(lib_uri); | |
| 512 } | |
| 513 | |
| 514 result = Extensions::LoadExtension(lib_path, | |
| 515 extension_path, | |
| 516 library); | |
| 517 free(lib_path); | |
| 518 RETURN_ERROR(result); | |
| 519 } | |
| 520 } | |
| 521 } | |
|
siva
2016/11/02 23:48:38
This seems like an expensive loop we have to run t
Cutch
2016/11/03 17:45:34
I agree with the spirit, but, extensions are techn
siva
2016/11/03 17:53:01
Agree, maybe the API could be something like
Dart_
| |
| 522 | |
| 523 return Dart_True(); | |
| 524 } | |
| 525 | |
| 526 | |
| 451 Dart_Handle Loader::LoadUrlContents(Dart_Handle url, | 527 Dart_Handle Loader::LoadUrlContents(Dart_Handle url, |
| 452 uint8_t** payload, | 528 uint8_t** payload, |
| 453 intptr_t* payload_length) { | 529 intptr_t* payload_length) { |
| 454 IsolateData* isolate_data = | 530 IsolateData* isolate_data = |
| 455 reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData()); | 531 reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData()); |
| 456 ASSERT(isolate_data != NULL); | 532 ASSERT(isolate_data != NULL); |
| 457 ASSERT(!isolate_data->HasLoader()); | 533 ASSERT(!isolate_data->HasLoader()); |
| 458 Loader* loader = NULL; | 534 Loader* loader = NULL; |
| 459 | 535 |
| 460 // Setup the loader. The constructor does a bunch of leg work. | 536 // Setup the loader. The constructor does a bunch of leg work. |
| (...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 755 MutexLocker ml(loader_infos_lock_); | 831 MutexLocker ml(loader_infos_lock_); |
| 756 Loader* loader = LoaderForLocked(dest_port_id); | 832 Loader* loader = LoaderForLocked(dest_port_id); |
| 757 if (loader == NULL) { | 833 if (loader == NULL) { |
| 758 return; | 834 return; |
| 759 } | 835 } |
| 760 loader->QueueMessage(message); | 836 loader->QueueMessage(message); |
| 761 } | 837 } |
| 762 | 838 |
| 763 } // namespace bin | 839 } // namespace bin |
| 764 } // namespace dart | 840 } // namespace dart |
| OLD | NEW |