OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "native_client/src/trusted/plugin/pnacl_coordinator.h" | 5 #include "native_client/src/trusted/plugin/pnacl_coordinator.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "native_client/src/include/checked_cast.h" | 10 #include "native_client/src/include/checked_cast.h" |
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 // For now, tolerate bitcode that is missing a cache identity, and | 342 // For now, tolerate bitcode that is missing a cache identity, and |
343 // tolerate the lack of caching in incognito mode. | 343 // tolerate the lack of caching in incognito mode. |
344 PLUGIN_PRINTF(("PnaclCoordinator -- not caching.\n")); | 344 PLUGIN_PRINTF(("PnaclCoordinator -- not caching.\n")); |
345 NexeReadDidOpen(PP_OK); | 345 NexeReadDidOpen(PP_OK); |
346 } | 346 } |
347 } | 347 } |
348 | 348 |
349 void PnaclCoordinator::CachedNexeOpenedForWrite(int32_t pp_error) { | 349 void PnaclCoordinator::CachedNexeOpenedForWrite(int32_t pp_error) { |
350 if (pp_error != PP_OK) { | 350 if (pp_error != PP_OK) { |
351 if (pp_error == PP_ERROR_NOACCESS) { | 351 if (pp_error == PP_ERROR_NOACCESS) { |
352 ReportPpapiError(ERROR_PNACL_CACHE_FILEOPEN_NOACCESS, | 352 ReportPpapiError( |
353 pp_error, | 353 ERROR_PNACL_CACHE_FILEOPEN_NOACCESS, |
354 "PNaCl translation cache failed to open file for write." | 354 pp_error, |
355 " No access."); | 355 "PNaCl translation cache failed to open file for write " |
| 356 "(no access)."); |
356 return; | 357 return; |
357 } | 358 } |
358 if (pp_error == PP_ERROR_NOQUOTA) { | 359 if (pp_error == PP_ERROR_NOQUOTA) { |
359 ReportPpapiError(ERROR_PNACL_CACHE_FILEOPEN_NOQUOTA, | 360 ReportPpapiError( |
360 pp_error, | 361 ERROR_PNACL_CACHE_FILEOPEN_NOQUOTA, |
361 "PNaCl translation cache failed to open file for write." | 362 pp_error, |
362 " No quota."); | 363 "PNaCl translation cache failed to open file for write " |
| 364 "(no quota)."); |
363 return; | 365 return; |
364 } | 366 } |
365 if (pp_error == PP_ERROR_NOSPACE) { | 367 if (pp_error == PP_ERROR_NOSPACE) { |
366 ReportPpapiError(ERROR_PNACL_CACHE_FILEOPEN_NOSPACE, | 368 ReportPpapiError( |
367 pp_error, | 369 ERROR_PNACL_CACHE_FILEOPEN_NOSPACE, |
368 "PNaCl translation cache failed to open file for write." | 370 pp_error, |
369 " No space."); | 371 "PNaCl translation cache failed to open file for write " |
| 372 "(no space)."); |
370 return; | 373 return; |
371 } | 374 } |
372 if (pp_error == PP_ERROR_NOTAFILE) { | 375 if (pp_error == PP_ERROR_NOTAFILE) { |
373 ReportPpapiError(ERROR_PNACL_CACHE_FILEOPEN_NOTAFILE, | 376 ReportPpapiError(ERROR_PNACL_CACHE_FILEOPEN_NOTAFILE, |
374 pp_error, | 377 pp_error, |
375 "PNaCl translation cache failed to open file for write." | 378 "PNaCl translation cache failed to open file for write." |
376 " File already exists as a directory."); | 379 " File already exists as a directory."); |
377 return; | 380 return; |
378 } | 381 } |
379 ReportPpapiError(ERROR_PNACL_CACHE_FILEOPEN_OTHER, | 382 ReportPpapiError(ERROR_PNACL_CACHE_FILEOPEN_OTHER, |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 cached_nexe_file_->write_file_io()->Write(next_offset, buf, num_read, cb); | 470 cached_nexe_file_->write_file_io()->Write(next_offset, buf, num_read, cb); |
468 } | 471 } |
469 | 472 |
470 void PnaclCoordinator::NexeWasCopiedToCache(int32_t pp_error) { | 473 void PnaclCoordinator::NexeWasCopiedToCache(int32_t pp_error) { |
471 if (pp_error != PP_OK) { | 474 if (pp_error != PP_OK) { |
472 // TODO(jvoung): This should try to delete the partially written | 475 // TODO(jvoung): This should try to delete the partially written |
473 // cache file before returning... | 476 // cache file before returning... |
474 if (pp_error == PP_ERROR_NOQUOTA) { | 477 if (pp_error == PP_ERROR_NOQUOTA) { |
475 ReportPpapiError(ERROR_PNACL_CACHE_FINALIZE_COPY_NOQUOTA, | 478 ReportPpapiError(ERROR_PNACL_CACHE_FINALIZE_COPY_NOQUOTA, |
476 pp_error, | 479 pp_error, |
477 "Failed to copy translated nexe to cache. No quota."); | 480 "Failed to copy translated nexe to cache (no quota)."); |
478 return; | 481 return; |
479 } | 482 } |
480 if (pp_error == PP_ERROR_NOSPACE) { | 483 if (pp_error == PP_ERROR_NOSPACE) { |
481 ReportPpapiError(ERROR_PNACL_CACHE_FINALIZE_COPY_NOSPACE, | 484 ReportPpapiError(ERROR_PNACL_CACHE_FINALIZE_COPY_NOSPACE, |
482 pp_error, | 485 pp_error, |
483 "Failed to copy translated nexe to cache. No space."); | 486 "Failed to copy translated nexe to cache (no space)."); |
484 return; | 487 return; |
485 } | 488 } |
486 ReportPpapiError(ERROR_PNACL_CACHE_FINALIZE_COPY_OTHER, | 489 ReportPpapiError(ERROR_PNACL_CACHE_FINALIZE_COPY_OTHER, |
487 pp_error, | 490 pp_error, |
488 "Failed to copy translated nexe to cache."); | 491 "Failed to copy translated nexe to cache."); |
489 return; | 492 return; |
490 } | 493 } |
491 // Rename the cached_nexe_file_ file to the cache id, to finalize. | 494 // Rename the cached_nexe_file_ file to the cache id, to finalize. |
492 pp::CompletionCallback cb = | 495 pp::CompletionCallback cb = |
493 callback_factory_.NewCallback(&PnaclCoordinator::NexeFileWasRenamed); | 496 callback_factory_.NewCallback(&PnaclCoordinator::NexeFileWasRenamed); |
494 cached_nexe_file_->Rename(cache_identity_, cb); | 497 cached_nexe_file_->Rename(cache_identity_, cb); |
495 } | 498 } |
496 | 499 |
497 void PnaclCoordinator::NexeFileWasRenamed(int32_t pp_error) { | 500 void PnaclCoordinator::NexeFileWasRenamed(int32_t pp_error) { |
498 PLUGIN_PRINTF(("PnaclCoordinator::NexeFileWasRenamed (pp_error=%" | 501 PLUGIN_PRINTF(("PnaclCoordinator::NexeFileWasRenamed (pp_error=%" |
499 NACL_PRId32")\n", pp_error)); | 502 NACL_PRId32")\n", pp_error)); |
500 if (pp_error != PP_OK) { | 503 if (pp_error != PP_OK) { |
501 if (pp_error == PP_ERROR_NOACCESS) { | 504 if (pp_error == PP_ERROR_NOACCESS) { |
502 ReportPpapiError(ERROR_PNACL_CACHE_FINALIZE_RENAME_NOACCESS, | 505 ReportPpapiError(ERROR_PNACL_CACHE_FINALIZE_RENAME_NOACCESS, |
503 pp_error, | 506 pp_error, |
504 "Failed to finalize cached translation. No access."); | 507 "Failed to finalize cached translation (no access)."); |
505 return; | 508 return; |
506 } else if (pp_error != PP_ERROR_FILEEXISTS) { | 509 } else if (pp_error != PP_ERROR_FILEEXISTS) { |
507 ReportPpapiError(ERROR_PNACL_CACHE_FINALIZE_RENAME_OTHER, | 510 ReportPpapiError(ERROR_PNACL_CACHE_FINALIZE_RENAME_OTHER, |
508 pp_error, | 511 pp_error, |
509 "Failed to finalize cached translation."); | 512 "Failed to finalize cached translation."); |
510 return; | 513 return; |
511 } else { // pp_error == PP_ERROR_FILEEXISTS. | 514 } else { // pp_error == PP_ERROR_FILEEXISTS. |
512 // NOTE: if the file already existed, it looks like the rename will | 515 // NOTE: if the file already existed, it looks like the rename will |
513 // happily succeed. However, we should add a test for this. | 516 // happily succeed. However, we should add a test for this. |
514 // Could be a hash collision, or it could also be two tabs racing to | 517 // Could be a hash collision, or it could also be two tabs racing to |
(...skipping 18 matching lines...) Expand all Loading... |
533 cached_nexe_file_->OpenRead(cb); | 536 cached_nexe_file_->OpenRead(cb); |
534 } | 537 } |
535 | 538 |
536 void PnaclCoordinator::NexeReadDidOpen(int32_t pp_error) { | 539 void PnaclCoordinator::NexeReadDidOpen(int32_t pp_error) { |
537 PLUGIN_PRINTF(("PnaclCoordinator::NexeReadDidOpen (pp_error=%" | 540 PLUGIN_PRINTF(("PnaclCoordinator::NexeReadDidOpen (pp_error=%" |
538 NACL_PRId32")\n", pp_error)); | 541 NACL_PRId32")\n", pp_error)); |
539 if (pp_error != PP_OK) { | 542 if (pp_error != PP_OK) { |
540 if (pp_error == PP_ERROR_FILENOTFOUND) { | 543 if (pp_error == PP_ERROR_FILENOTFOUND) { |
541 ReportPpapiError(ERROR_PNACL_CACHE_FETCH_NOTFOUND, | 544 ReportPpapiError(ERROR_PNACL_CACHE_FETCH_NOTFOUND, |
542 pp_error, | 545 pp_error, |
543 "Failed to open translated nexe. Not found."); | 546 "Failed to open translated nexe (not found)."); |
544 return; | 547 return; |
545 } | 548 } |
546 if (pp_error == PP_ERROR_NOACCESS) { | 549 if (pp_error == PP_ERROR_NOACCESS) { |
547 ReportPpapiError(ERROR_PNACL_CACHE_FETCH_NOACCESS, | 550 ReportPpapiError(ERROR_PNACL_CACHE_FETCH_NOACCESS, |
548 pp_error, | 551 pp_error, |
549 "Failed to open translated nexe. No access."); | 552 "Failed to open translated nexe (no access)."); |
550 return; | 553 return; |
551 } | 554 } |
552 ReportPpapiError(ERROR_PNACL_CACHE_FETCH_OTHER, | 555 ReportPpapiError(ERROR_PNACL_CACHE_FETCH_OTHER, |
553 pp_error, | 556 pp_error, |
554 "Failed to open translated nexe."); | 557 "Failed to open translated nexe."); |
555 return; | 558 return; |
556 } | 559 } |
557 | 560 |
558 // Transfer ownership of cache/temp file's wrapper to the coordinator. | 561 // Transfer ownership of cache/temp file's wrapper to the coordinator. |
559 if (cached_nexe_file_ != NULL) { | 562 if (cached_nexe_file_ != NULL) { |
(...skipping 21 matching lines...) Expand all Loading... |
581 int32_t open_error = file_system_->Open(0, cb); | 584 int32_t open_error = file_system_->Open(0, cb); |
582 if (open_error != PP_OK_COMPLETIONPENDING) { | 585 if (open_error != PP_OK_COMPLETIONPENDING) { |
583 // At this point, no async request has kicked off to check for | 586 // At this point, no async request has kicked off to check for |
584 // permissions, space, etc., so the only error that can be detected | 587 // permissions, space, etc., so the only error that can be detected |
585 // now is that an open() is already in progress (or a really terrible | 588 // now is that an open() is already in progress (or a really terrible |
586 // error). | 589 // error). |
587 if (pp_error == PP_ERROR_INPROGRESS) { | 590 if (pp_error == PP_ERROR_INPROGRESS) { |
588 ReportPpapiError( | 591 ReportPpapiError( |
589 ERROR_PNACL_CACHE_OPEN_INPROGRESS, | 592 ERROR_PNACL_CACHE_OPEN_INPROGRESS, |
590 pp_error, | 593 pp_error, |
591 "File system for PNaCl translation cache failed to open." | 594 "File system for PNaCl translation cache failed to open " |
592 " In progress."); | 595 "(in progress)."); |
593 return; | 596 return; |
594 } | 597 } |
595 ReportPpapiError( | 598 ReportPpapiError( |
596 ERROR_PNACL_CACHE_OPEN_OTHER, | 599 ERROR_PNACL_CACHE_OPEN_OTHER, |
597 pp_error, | 600 pp_error, |
598 "File system for PNaCl translation cache failed to open."); | 601 "File system for PNaCl translation cache failed to open."); |
599 } | 602 } |
600 } else { | 603 } else { |
601 // We don't have a cache, so do the non-cached codepath. | 604 // We don't have a cache, so do the non-cached codepath. |
602 CachedFileDidOpen(PP_ERROR_FAILED); | 605 CachedFileDidOpen(PP_ERROR_FAILED); |
603 } | 606 } |
604 } | 607 } |
605 | 608 |
606 void PnaclCoordinator::FileSystemDidOpen(int32_t pp_error) { | 609 void PnaclCoordinator::FileSystemDidOpen(int32_t pp_error) { |
607 PLUGIN_PRINTF(("PnaclCoordinator::FileSystemDidOpen (pp_error=%" | 610 PLUGIN_PRINTF(("PnaclCoordinator::FileSystemDidOpen (pp_error=%" |
608 NACL_PRId32")\n", pp_error)); | 611 NACL_PRId32")\n", pp_error)); |
609 if (pp_error != PP_OK) { | 612 if (pp_error != PP_OK) { |
610 if (pp_error == PP_ERROR_NOACCESS) { | 613 if (pp_error == PP_ERROR_NOACCESS) { |
611 ReportPpapiError(ERROR_PNACL_CACHE_OPEN_NOACCESS, | 614 ReportPpapiError( |
612 pp_error, | 615 ERROR_PNACL_CACHE_OPEN_NOACCESS, |
613 "File system for PNaCl translation cache failed to open." | 616 pp_error, |
614 " No access."); | 617 "File system for PNaCl translation cache failed to open " |
| 618 "(no access)."); |
615 return; | 619 return; |
616 } | 620 } |
617 if (pp_error == PP_ERROR_NOQUOTA) { | 621 if (pp_error == PP_ERROR_NOQUOTA) { |
618 ReportPpapiError(ERROR_PNACL_CACHE_OPEN_NOQUOTA, | 622 ReportPpapiError( |
619 pp_error, | 623 ERROR_PNACL_CACHE_OPEN_NOQUOTA, |
620 "File system for PNaCl translation cache failed to open." | 624 pp_error, |
621 " No quota."); | 625 "File system for PNaCl translation cache failed to open " |
| 626 "(no quota)."); |
622 return; | 627 return; |
623 } | 628 } |
624 if (pp_error == PP_ERROR_NOSPACE) { | 629 if (pp_error == PP_ERROR_NOSPACE) { |
625 ReportPpapiError(ERROR_PNACL_CACHE_OPEN_NOSPACE, | 630 ReportPpapiError( |
626 pp_error, | 631 ERROR_PNACL_CACHE_OPEN_NOSPACE, |
627 "File system for PNaCl translation cache failed to open." | 632 pp_error, |
628 " No space."); | 633 "File system for PNaCl translation cache failed to open " |
| 634 "(no space)."); |
629 return; | 635 return; |
630 } | 636 } |
631 ReportPpapiError(ERROR_PNACL_CACHE_OPEN_OTHER, | 637 ReportPpapiError(ERROR_PNACL_CACHE_OPEN_OTHER, |
632 pp_error, | 638 pp_error, |
633 "File system for PNaCl translation cache failed to open."); | 639 "File system for PNaCl translation cache failed to open."); |
634 } | 640 } |
635 dir_ref_.reset(new pp::FileRef(*file_system_, kPnaclTempDir)); | 641 dir_ref_.reset(new pp::FileRef(*file_system_, kPnaclTempDir)); |
636 // Attempt to create the directory. | 642 // Attempt to create the directory. |
637 pp::CompletionCallback cb = | 643 pp::CompletionCallback cb = |
638 callback_factory_.NewCallback(&PnaclCoordinator::DirectoryWasCreated); | 644 callback_factory_.NewCallback(&PnaclCoordinator::DirectoryWasCreated); |
639 dir_ref_->MakeDirectory(cb); | 645 dir_ref_->MakeDirectory(cb); |
640 } | 646 } |
641 | 647 |
642 void PnaclCoordinator::DirectoryWasCreated(int32_t pp_error) { | 648 void PnaclCoordinator::DirectoryWasCreated(int32_t pp_error) { |
643 PLUGIN_PRINTF(("PnaclCoordinator::DirectoryWasCreated (pp_error=%" | 649 PLUGIN_PRINTF(("PnaclCoordinator::DirectoryWasCreated (pp_error=%" |
644 NACL_PRId32")\n", pp_error)); | 650 NACL_PRId32")\n", pp_error)); |
645 if (pp_error != PP_ERROR_FILEEXISTS && pp_error != PP_OK) { | 651 if (pp_error != PP_ERROR_FILEEXISTS && pp_error != PP_OK) { |
646 // Directory did not exist and could not be created. | 652 // Directory did not exist and could not be created. |
647 if (pp_error == PP_ERROR_NOACCESS) { | 653 if (pp_error == PP_ERROR_NOACCESS) { |
648 ReportPpapiError( | 654 ReportPpapiError( |
649 ERROR_PNACL_CACHE_DIRECTORY_CREATE, | 655 ERROR_PNACL_CACHE_DIRECTORY_CREATE, |
650 pp_error, | 656 pp_error, |
651 "PNaCl translation cache directory creation/check failed. " | 657 "PNaCl translation cache directory creation/check failed " |
652 "No access."); | 658 "(no access)."); |
653 return; | 659 return; |
654 } | 660 } |
655 ReportPpapiError( | 661 ReportPpapiError( |
656 ERROR_PNACL_CACHE_DIRECTORY_CREATE, | 662 ERROR_PNACL_CACHE_DIRECTORY_CREATE, |
657 pp_error, | 663 pp_error, |
658 "PNaCl translation cache directory creation/check failed."); | 664 "PNaCl translation cache directory creation/check failed."); |
659 return; | 665 return; |
660 } | 666 } |
661 if (cache_identity_ != "") { | 667 if (cache_identity_ != "") { |
662 cached_nexe_file_.reset(new LocalTempFile(plugin_, file_system_.get(), | 668 cached_nexe_file_.reset(new LocalTempFile(plugin_, file_system_.get(), |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
696 pp::CompletionCallback obj_cb = | 702 pp::CompletionCallback obj_cb = |
697 callback_factory_.NewCallback(&PnaclCoordinator::ObjectFileDidOpen); | 703 callback_factory_.NewCallback(&PnaclCoordinator::ObjectFileDidOpen); |
698 obj_file_->Open(obj_cb); | 704 obj_file_->Open(obj_cb); |
699 | 705 |
700 streaming_downloader_.reset(new FileDownloader()); | 706 streaming_downloader_.reset(new FileDownloader()); |
701 streaming_downloader_->Initialize(plugin_); | 707 streaming_downloader_->Initialize(plugin_); |
702 pp::CompletionCallback cb = | 708 pp::CompletionCallback cb = |
703 callback_factory_.NewCallback( | 709 callback_factory_.NewCallback( |
704 &PnaclCoordinator::BitcodeStreamDidFinish); | 710 &PnaclCoordinator::BitcodeStreamDidFinish); |
705 | 711 |
706 // TODO(dschuff): need to use url_util_->ResolveRelativeToURL? | |
707 if (!streaming_downloader_->OpenStream(pexe_url_, cb, this)) { | 712 if (!streaming_downloader_->OpenStream(pexe_url_, cb, this)) { |
708 ReportNonPpapiError(ERROR_PNACL_PEXE_FETCH, | 713 ReportNonPpapiError(ERROR_PNACL_PEXE_FETCH_OTHER, |
709 nacl::string("failed to open stream ") + pexe_url_); | 714 nacl::string("failed to open stream ") + pexe_url_); |
710 } | 715 } |
711 } | 716 } |
712 | 717 |
713 void PnaclCoordinator::BitcodeStreamDidFinish(int32_t pp_error) { | 718 void PnaclCoordinator::BitcodeStreamDidFinish(int32_t pp_error) { |
714 PLUGIN_PRINTF(("PnaclCoordinator::BitcodeStreamDidFinish (pp_error=%" | 719 PLUGIN_PRINTF(("PnaclCoordinator::BitcodeStreamDidFinish (pp_error=%" |
715 NACL_PRId32")\n", pp_error)); | 720 NACL_PRId32")\n", pp_error)); |
716 if (pp_error != PP_OK) { | 721 if (pp_error != PP_OK) { |
717 // Defer reporting the error and cleanup until after the translation | 722 // Defer reporting the error and cleanup until after the translation |
718 // thread returns, because it may be accessing the coordinator's | 723 // thread returns, because it may be accessing the coordinator's |
719 // objects or writing to the files. | 724 // objects or writing to the files. |
720 // TODO(dschuff,jvoung): If this is a PP_ERROR_ABORTED, we probably | |
721 // want the UMA stat to show that the user aborted the action | |
722 // (vs a network error). | |
723 // We also want to track the total number of bytes of the pexe | |
724 // to know the typical application sizes. | |
725 translate_finish_error_ = pp_error; | 725 translate_finish_error_ = pp_error; |
726 nacl::stringstream ss; | 726 if (pp_error == PP_ERROR_ABORTED) { |
727 ss << "PnaclCoordinator: pexe load failed (pp_error=" << pp_error << ")."; | 727 error_info_.SetReport(ERROR_PNACL_PEXE_FETCH_ABORTED, |
728 error_info_.SetReport(ERROR_PNACL_PEXE_FETCH, ss.str()); | 728 "PnaclCoordinator: pexe load failed (aborted)."); |
| 729 } |
| 730 if (pp_error == PP_ERROR_NOACCESS) { |
| 731 error_info_.SetReport(ERROR_PNACL_PEXE_FETCH_NOACCESS, |
| 732 "PnaclCoordinator: pexe load failed (no access)."); |
| 733 } else { |
| 734 nacl::stringstream ss; |
| 735 ss << "PnaclCoordinator: pexe load failed (pp_error=" << pp_error << ")."; |
| 736 error_info_.SetReport(ERROR_PNACL_PEXE_FETCH_OTHER, ss.str()); |
| 737 } |
729 translate_thread_->AbortSubprocesses(); | 738 translate_thread_->AbortSubprocesses(); |
730 } | 739 } |
731 } | 740 } |
732 | 741 |
733 void PnaclCoordinator::BitcodeStreamGotData(int32_t pp_error, | 742 void PnaclCoordinator::BitcodeStreamGotData(int32_t pp_error, |
734 FileStreamData data) { | 743 FileStreamData data) { |
735 PLUGIN_PRINTF(("PnaclCoordinator::BitcodeStreamGotData (pp_error=%" | 744 PLUGIN_PRINTF(("PnaclCoordinator::BitcodeStreamGotData (pp_error=%" |
736 NACL_PRId32", data=%p)\n", pp_error, data ? &(*data)[0] : 0)); | 745 NACL_PRId32", data=%p)\n", pp_error, data ? &(*data)[0] : 0)); |
737 DCHECK(translate_thread_.get()); | 746 DCHECK(translate_thread_.get()); |
738 translate_thread_->PutBytes(data, pp_error); | 747 translate_thread_->PutBytes(data, pp_error); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
773 manifest_.get(), | 782 manifest_.get(), |
774 ld_manifest_.get(), | 783 ld_manifest_.get(), |
775 obj_file_.get(), | 784 obj_file_.get(), |
776 temp_nexe_file_.get(), | 785 temp_nexe_file_.get(), |
777 &error_info_, | 786 &error_info_, |
778 resources_.get(), | 787 resources_.get(), |
779 plugin_); | 788 plugin_); |
780 } | 789 } |
781 | 790 |
782 } // namespace plugin | 791 } // namespace plugin |
OLD | NEW |