OLD | NEW |
---|---|
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 Loading... | |
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): Do something more robust. | |
519 const char* colon = strchr(path, ':'); | |
520 const char* backslash = strchr(path, '\\'); | |
521 const char* slash = strchr(path, '/'); | |
522 return colon != nullptr && (backslash == nullptr || colon < backslash) && | |
523 (slash == nullptr || colon < slash); | |
524 #else | |
neis
2016/09/22 01:07:39
I don't understand why you make it so complicated
adamk
2016/09/22 19:06:57
Just looking for a colon now.
| |
525 return path[0] == '/'; | |
526 #endif | |
527 } | |
528 | |
529 std::string GetWorkingDirectory() { | |
530 #if defined(_WIN32) || defined(_WIN64) | |
531 char system_buffer[MAX_PATH]; | |
532 // TODO(adamk): Support Unicode paths. | |
533 DWORD len = GetCurrentDirectoryA(MAX_PATH, system_buffer); | |
534 CHECK(len > 0); | |
535 return system_buffer; | |
536 #else | |
537 char curdir[PATH_MAX]; | |
538 CHECK_NOT_NULL(getcwd(curdir, PATH_MAX)); | |
539 return curdir; | |
540 #endif | |
541 } | |
542 | |
543 MaybeLocal<Module> ResolveModuleCallback(Local<Context> context, | |
544 Local<String> specifier, | |
545 Local<Module> referrer, | |
546 Local<Value> data) { | |
547 Isolate* isolate = context->GetIsolate(); | |
548 auto module_map = static_cast<std::map<std::string, Global<Module>>*>( | |
549 External::Cast(*data)->Value()); | |
550 String::Utf8Value specifier_utf8(specifier); | |
551 CHECK(!IsAbsolutePath(*specifier_utf8)); | |
552 Local<String> dir_name = Local<String>::Cast(referrer->GetEmbedderData()); | |
553 std::string absolute_path = *String::Utf8Value(dir_name); | |
554 absolute_path.append(*specifier_utf8); | |
555 auto it = module_map->find(absolute_path); | |
556 if (it != module_map->end()) { | |
557 return it->second.Get(isolate); | |
558 } | |
559 return MaybeLocal<Module>(); | |
560 } | |
561 | |
562 } // anonymous namespace | |
563 | |
514 MaybeLocal<Module> Shell::FetchModuleTree( | 564 MaybeLocal<Module> Shell::FetchModuleTree( |
515 Isolate* isolate, const std::string& file_name, | 565 Isolate* isolate, const std::string& file_name, |
516 std::map<std::string, Global<Module>>* module_map) { | 566 std::map<std::string, Global<Module>>* module_map) { |
neis
2016/09/22 01:07:39
Add a DCHECK(IsAbsolute) here?
adamk
2016/09/22 19:06:56
Done.
| |
517 TryCatch try_catch(isolate); | 567 TryCatch try_catch(isolate); |
518 try_catch.SetVerbose(true); | 568 try_catch.SetVerbose(true); |
519 Local<String> source_text = ReadFile(isolate, file_name.c_str()); | 569 Local<String> source_text = ReadFile(isolate, file_name.c_str()); |
520 if (source_text.IsEmpty()) { | 570 if (source_text.IsEmpty()) { |
521 printf("Error reading '%s'\n", file_name.c_str()); | 571 printf("Error reading '%s'\n", file_name.c_str()); |
522 Shell::Exit(1); | 572 Shell::Exit(1); |
523 } | 573 } |
524 ScriptOrigin origin( | 574 ScriptOrigin origin( |
525 String::NewFromUtf8(isolate, file_name.c_str(), NewStringType::kNormal) | 575 String::NewFromUtf8(isolate, file_name.c_str(), NewStringType::kNormal) |
526 .ToLocalChecked()); | 576 .ToLocalChecked()); |
527 ScriptCompiler::Source source(source_text, origin); | 577 ScriptCompiler::Source source(source_text, origin); |
528 Local<Module> module; | 578 Local<Module> module; |
529 if (!ScriptCompiler::CompileModule(isolate, &source).ToLocal(&module)) { | 579 if (!ScriptCompiler::CompileModule(isolate, &source).ToLocal(&module)) { |
530 ReportException(isolate, &try_catch); | 580 ReportException(isolate, &try_catch); |
531 return MaybeLocal<Module>(); | 581 return MaybeLocal<Module>(); |
532 } | 582 } |
533 module_map->insert( | 583 module_map->insert( |
534 std::make_pair(file_name, Global<Module>(isolate, module))); | 584 std::make_pair(file_name, Global<Module>(isolate, module))); |
585 | |
586 size_t last_slash = file_name.find_last_of("/\\"); | |
587 CHECK(last_slash != std::string::npos); | |
588 std::string dir_name = file_name.substr(0, last_slash + 1); | |
neis
2016/09/22 01:07:39
Please move this into a separate function.
adamk
2016/09/22 19:06:57
Done.
| |
589 module->SetEmbedderData( | |
590 String::NewFromUtf8(isolate, dir_name.c_str(), NewStringType::kNormal) | |
591 .ToLocalChecked()); | |
592 | |
535 for (int i = 0, length = module->GetModuleRequestsLength(); i < length; ++i) { | 593 for (int i = 0, length = module->GetModuleRequestsLength(); i < length; ++i) { |
536 Local<String> name = module->GetModuleRequest(i); | 594 Local<String> name = module->GetModuleRequest(i); |
537 // TODO(adamk): Resolve the imported module to a full path. | 595 String::Utf8Value utf8_value(name); |
538 std::string str = *String::Utf8Value(name); | 596 CHECK(!IsAbsolutePath(*utf8_value)); |
neis
2016/09/22 01:07:39
Can you add a comment about this restriction?
adamk
2016/09/22 19:06:56
Removed the restriction instead.
| |
539 if (!module_map->count(str)) { | 597 std::string absolute_path = dir_name; |
540 if (FetchModuleTree(isolate, str, module_map).IsEmpty()) { | 598 absolute_path.append(*utf8_value); |
599 if (!module_map->count(absolute_path)) { | |
600 if (FetchModuleTree(isolate, absolute_path, module_map).IsEmpty()) { | |
541 return MaybeLocal<Module>(); | 601 return MaybeLocal<Module>(); |
542 } | 602 } |
543 } | 603 } |
544 } | 604 } |
545 | 605 |
546 return module; | 606 return module; |
547 } | 607 } |
548 | 608 |
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) { | 609 bool Shell::ExecuteModule(Isolate* isolate, const char* file_name) { |
570 HandleScope handle_scope(isolate); | 610 HandleScope handle_scope(isolate); |
571 | 611 |
572 Local<Module> root_module; | 612 Local<Module> root_module; |
573 std::map<std::string, Global<Module>> module_map; | 613 std::map<std::string, Global<Module>> module_map; |
574 if (!FetchModuleTree(isolate, file_name, &module_map).ToLocal(&root_module)) { | 614 |
615 std::string absolute_path; | |
616 if (IsAbsolutePath(file_name)) { | |
617 absolute_path = file_name; | |
618 } else { | |
619 absolute_path = GetWorkingDirectory(); | |
620 absolute_path.push_back('/'); | |
621 absolute_path.append(file_name); | |
622 } | |
neis
2016/09/22 01:07:39
Can you move this stuff up a little?
adamk
2016/09/22 19:06:56
Done.
| |
623 if (!FetchModuleTree(isolate, absolute_path, &module_map) | |
624 .ToLocal(&root_module)) { | |
575 return false; | 625 return false; |
576 } | 626 } |
577 | 627 |
578 TryCatch try_catch(isolate); | 628 TryCatch try_catch(isolate); |
579 try_catch.SetVerbose(true); | 629 try_catch.SetVerbose(true); |
580 | 630 |
581 MaybeLocal<Value> maybe_result; | 631 MaybeLocal<Value> maybe_result; |
582 { | 632 { |
583 PerIsolateData* data = PerIsolateData::Get(isolate); | 633 PerIsolateData* data = PerIsolateData::Get(isolate); |
584 Local<Context> realm = data->realms_[data->realm_current_].Get(isolate); | 634 Local<Context> realm = data->realms_[data->realm_current_].Get(isolate); |
(...skipping 1310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1895 thread_ = NULL; | 1945 thread_ = NULL; |
1896 delete[] script_; | 1946 delete[] script_; |
1897 script_ = NULL; | 1947 script_ = NULL; |
1898 in_queue_.Clear(); | 1948 in_queue_.Clear(); |
1899 out_queue_.Clear(); | 1949 out_queue_.Clear(); |
1900 } | 1950 } |
1901 | 1951 |
1902 | 1952 |
1903 void Worker::StartExecuteInThread(const char* script) { | 1953 void Worker::StartExecuteInThread(const char* script) { |
1904 running_ = true; | 1954 running_ = true; |
1955 #undef StrDup | |
neis
2016/09/22 01:07:39
??
adamk
2016/09/22 19:06:56
This was from a previous attempt to call the Win32
| |
1905 script_ = i::StrDup(script); | 1956 script_ = i::StrDup(script); |
1906 thread_ = new WorkerThread(this); | 1957 thread_ = new WorkerThread(this); |
1907 thread_->Start(); | 1958 thread_->Start(); |
1908 } | 1959 } |
1909 | 1960 |
1910 | 1961 |
1911 void Worker::PostMessage(SerializationData* data) { | 1962 void Worker::PostMessage(SerializationData* data) { |
1912 in_queue_.Enqueue(data); | 1963 in_queue_.Enqueue(data); |
1913 in_semaphore_.Signal(); | 1964 in_semaphore_.Signal(); |
1914 } | 1965 } |
(...skipping 780 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2695 } | 2746 } |
2696 | 2747 |
2697 } // namespace v8 | 2748 } // namespace v8 |
2698 | 2749 |
2699 | 2750 |
2700 #ifndef GOOGLE3 | 2751 #ifndef GOOGLE3 |
2701 int main(int argc, char* argv[]) { | 2752 int main(int argc, char* argv[]) { |
2702 return v8::Shell::Main(argc, argv); | 2753 return v8::Shell::Main(argc, argv); |
2703 } | 2754 } |
2704 #endif | 2755 #endif |
OLD | NEW |