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

Side by Side Diff: src/d8.cc

Issue 2361593002: [modules] Do path resolution relative to each module file in d8 (Closed)
Patch Set: Review comments Created 4 years, 2 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
« no previous file with comments | « src/api.cc ('k') | src/factory.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project 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 <errno.h> 5 #include <errno.h>
6 #include <stdlib.h> 6 #include <stdlib.h>
7 #include <string.h> 7 #include <string.h>
8 #include <sys/stat.h> 8 #include <sys/stat.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 } 504 }
505 } else { 505 } else {
506 v8::String::Utf8Value str(Stringify(isolate, result)); 506 v8::String::Utf8Value str(Stringify(isolate, result));
507 fwrite(*str, sizeof(**str), str.length(), stdout); 507 fwrite(*str, sizeof(**str), str.length(), stdout);
508 printf("\n"); 508 printf("\n");
509 } 509 }
510 } 510 }
511 return true; 511 return true;
512 } 512 }
513 513
514 namespace {
515
516 bool IsAbsolutePath(const char* path) {
517 #if defined(_WIN32) || defined(_WIN64)
518 // TODO(adamk): This is an incorrect approximation, but should
519 // work for all our test-running cases.
520 return strchr(path, ':') != nullptr;
521 #else
522 return path[0] == '/';
523 #endif
524 }
525
526 std::string GetWorkingDirectory() {
527 #if defined(_WIN32) || defined(_WIN64)
528 char system_buffer[MAX_PATH];
529 // TODO(adamk): Support Unicode paths.
530 DWORD len = GetCurrentDirectoryA(MAX_PATH, system_buffer);
531 CHECK(len > 0);
532 return system_buffer;
533 #else
534 char curdir[PATH_MAX];
535 CHECK_NOT_NULL(getcwd(curdir, PATH_MAX));
536 return curdir;
537 #endif
538 }
539
540 std::string DirName(const std::string& path) {
541 DCHECK(IsAbsolutePath(path.c_str()));
542 size_t last_slash = path.find_last_of("/\\");
543 DCHECK(last_slash != std::string::npos);
544 return path.substr(0, last_slash + 1);
545 }
546
547 MaybeLocal<Module> ResolveModuleCallback(Local<Context> context,
548 Local<String> specifier,
549 Local<Module> referrer,
550 Local<Value> data) {
551 Isolate* isolate = context->GetIsolate();
552 auto module_map = static_cast<std::map<std::string, Global<Module>>*>(
553 External::Cast(*data)->Value());
554 String::Utf8Value specifier_utf8(specifier);
555 CHECK(!IsAbsolutePath(*specifier_utf8));
556 Local<String> dir_name = Local<String>::Cast(referrer->GetEmbedderData());
557 std::string absolute_path = *String::Utf8Value(dir_name);
558 absolute_path.append(*specifier_utf8);
559 auto it = module_map->find(absolute_path);
560 if (it != module_map->end()) {
561 return it->second.Get(isolate);
562 }
563 return MaybeLocal<Module>();
564 }
565
566 } // anonymous namespace
567
514 MaybeLocal<Module> Shell::FetchModuleTree( 568 MaybeLocal<Module> Shell::FetchModuleTree(
515 Isolate* isolate, const std::string& file_name, 569 Isolate* isolate, const std::string& file_name,
516 std::map<std::string, Global<Module>>* module_map) { 570 std::map<std::string, Global<Module>>* module_map) {
571 DCHECK(IsAbsolutePath(file_name.c_str()));
517 TryCatch try_catch(isolate); 572 TryCatch try_catch(isolate);
518 try_catch.SetVerbose(true); 573 try_catch.SetVerbose(true);
519 Local<String> source_text = ReadFile(isolate, file_name.c_str()); 574 Local<String> source_text = ReadFile(isolate, file_name.c_str());
520 if (source_text.IsEmpty()) { 575 if (source_text.IsEmpty()) {
521 printf("Error reading '%s'\n", file_name.c_str()); 576 printf("Error reading '%s'\n", file_name.c_str());
522 Shell::Exit(1); 577 Shell::Exit(1);
523 } 578 }
524 ScriptOrigin origin( 579 ScriptOrigin origin(
525 String::NewFromUtf8(isolate, file_name.c_str(), NewStringType::kNormal) 580 String::NewFromUtf8(isolate, file_name.c_str(), NewStringType::kNormal)
526 .ToLocalChecked()); 581 .ToLocalChecked());
527 ScriptCompiler::Source source(source_text, origin); 582 ScriptCompiler::Source source(source_text, origin);
528 Local<Module> module; 583 Local<Module> module;
529 if (!ScriptCompiler::CompileModule(isolate, &source).ToLocal(&module)) { 584 if (!ScriptCompiler::CompileModule(isolate, &source).ToLocal(&module)) {
530 ReportException(isolate, &try_catch); 585 ReportException(isolate, &try_catch);
531 return MaybeLocal<Module>(); 586 return MaybeLocal<Module>();
532 } 587 }
533 module_map->insert( 588 module_map->insert(
534 std::make_pair(file_name, Global<Module>(isolate, module))); 589 std::make_pair(file_name, Global<Module>(isolate, module)));
590
591 std::string dir_name = DirName(file_name);
592 module->SetEmbedderData(
593 String::NewFromUtf8(isolate, dir_name.c_str(), NewStringType::kNormal)
594 .ToLocalChecked());
595
535 for (int i = 0, length = module->GetModuleRequestsLength(); i < length; ++i) { 596 for (int i = 0, length = module->GetModuleRequestsLength(); i < length; ++i) {
536 Local<String> name = module->GetModuleRequest(i); 597 Local<String> name = module->GetModuleRequest(i);
537 // TODO(adamk): Resolve the imported module to a full path. 598 String::Utf8Value utf8_value(name);
538 std::string str = *String::Utf8Value(name); 599 std::string absolute_path;
539 if (!module_map->count(str)) { 600 if (IsAbsolutePath(*utf8_value)) {
540 if (FetchModuleTree(isolate, str, module_map).IsEmpty()) { 601 absolute_path = *utf8_value;
602 } else {
603 absolute_path = dir_name;
604 absolute_path.append(*utf8_value);
605 }
606 if (!module_map->count(absolute_path)) {
607 if (FetchModuleTree(isolate, absolute_path, module_map).IsEmpty()) {
541 return MaybeLocal<Module>(); 608 return MaybeLocal<Module>();
542 } 609 }
543 } 610 }
544 } 611 }
545 612
546 return module; 613 return module;
547 } 614 }
548 615
549 namespace {
550
551 MaybeLocal<Module> ResolveModuleCallback(Local<Context> context,
552 Local<String> specifier,
553 Local<Module> referrer,
554 Local<Value> data) {
555 Isolate* isolate = context->GetIsolate();
556 auto module_map = static_cast<std::map<std::string, Global<Module>>*>(
557 External::Cast(*data)->Value());
558 std::string str_specifier = *String::Utf8Value(specifier);
559 // TODO(adamk): Resolve the specifier using the referrer
560 auto it = module_map->find(str_specifier);
561 if (it != module_map->end()) {
562 return it->second.Get(isolate);
563 }
564 return MaybeLocal<Module>();
565 }
566
567 } // anonymous namespace
568
569 bool Shell::ExecuteModule(Isolate* isolate, const char* file_name) { 616 bool Shell::ExecuteModule(Isolate* isolate, const char* file_name) {
570 HandleScope handle_scope(isolate); 617 HandleScope handle_scope(isolate);
571 618
619 std::string absolute_path;
620 if (IsAbsolutePath(file_name)) {
621 absolute_path = file_name;
622 } else {
623 absolute_path = GetWorkingDirectory();
624 absolute_path.push_back('/');
625 absolute_path.append(file_name);
626 }
627
572 Local<Module> root_module; 628 Local<Module> root_module;
573 std::map<std::string, Global<Module>> module_map; 629 std::map<std::string, Global<Module>> module_map;
574 if (!FetchModuleTree(isolate, file_name, &module_map).ToLocal(&root_module)) { 630 if (!FetchModuleTree(isolate, absolute_path, &module_map)
631 .ToLocal(&root_module)) {
575 return false; 632 return false;
576 } 633 }
577 634
578 TryCatch try_catch(isolate); 635 TryCatch try_catch(isolate);
579 try_catch.SetVerbose(true); 636 try_catch.SetVerbose(true);
580 637
581 MaybeLocal<Value> maybe_result; 638 MaybeLocal<Value> maybe_result;
582 { 639 {
583 PerIsolateData* data = PerIsolateData::Get(isolate); 640 PerIsolateData* data = PerIsolateData::Get(isolate);
584 Local<Context> realm = data->realms_[data->realm_current_].Get(isolate); 641 Local<Context> realm = data->realms_[data->realm_current_].Get(isolate);
(...skipping 2110 matching lines...) Expand 10 before | Expand all | Expand 10 after
2695 } 2752 }
2696 2753
2697 } // namespace v8 2754 } // namespace v8
2698 2755
2699 2756
2700 #ifndef GOOGLE3 2757 #ifndef GOOGLE3
2701 int main(int argc, char* argv[]) { 2758 int main(int argc, char* argv[]) {
2702 return v8::Shell::Main(argc, argv); 2759 return v8::Shell::Main(argc, argv);
2703 } 2760 }
2704 #endif 2761 #endif
OLDNEW
« no previous file with comments | « src/api.cc ('k') | src/factory.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698