| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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 #if !defined(_WIN32) && !defined(_WIN64) | 5 #if !defined(_WIN32) && !defined(_WIN64) |
| 6 #include <unistd.h> // NOLINT | 6 #include <unistd.h> // NOLINT |
| 7 #endif // !defined(_WIN32) && !defined(_WIN64) | 7 #endif // !defined(_WIN32) && !defined(_WIN64) |
| 8 | 8 |
| 9 #include <locale.h> | 9 #include <locale.h> |
| 10 | 10 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 Terminate(); | 39 Terminate(); |
| 40 } | 40 } |
| 41 | 41 |
| 42 v8::internal::Vector<uint16_t> ToVector(v8::Local<v8::String> str) { | 42 v8::internal::Vector<uint16_t> ToVector(v8::Local<v8::String> str) { |
| 43 v8::internal::Vector<uint16_t> buffer = | 43 v8::internal::Vector<uint16_t> buffer = |
| 44 v8::internal::Vector<uint16_t>::New(str->Length()); | 44 v8::internal::Vector<uint16_t>::New(str->Length()); |
| 45 str->Write(buffer.start(), 0, str->Length()); | 45 str->Write(buffer.start(), 0, str->Length()); |
| 46 return buffer; | 46 return buffer; |
| 47 } | 47 } |
| 48 | 48 |
| 49 class UtilsExtension : public v8::Extension { | 49 v8::Local<v8::String> ToV8String(v8::Isolate* isolate, const char* str) { |
| 50 return v8::String::NewFromUtf8(isolate, str, v8::NewStringType::kNormal) |
| 51 .ToLocalChecked(); |
| 52 } |
| 53 |
| 54 class UtilsExtension : public TaskRunner::Task { |
| 50 public: | 55 public: |
| 51 UtilsExtension() | 56 ~UtilsExtension() override = default; |
| 52 : v8::Extension("v8_inspector/utils", | 57 bool is_inspector_task() override { return true; } |
| 53 "native function print();" | 58 void Run(v8::Isolate* isolate, |
| 54 "native function quit();" | 59 const v8::Global<v8::Context>& context) override { |
| 55 "native function setlocale();" | 60 v8::HandleScope handle_scope(isolate); |
| 56 "native function read();" | 61 v8::Local<v8::Context> local_context = context.Get(isolate); |
| 57 "native function load();" | 62 v8::Context::Scope context_scope(local_context); |
| 58 "native function compileAndRunWithOrigin();" | 63 v8::Local<v8::ObjectTemplate> utils = v8::ObjectTemplate::New(isolate); |
| 59 "native function setCurrentTimeMSForTest();" | 64 utils->Set(ToV8String(isolate, "print"), |
| 60 "native function setMemoryInfoForTest();" | 65 v8::FunctionTemplate::New(isolate, &UtilsExtension::Print)); |
| 61 "native function schedulePauseOnNextStatement();" | 66 utils->Set(ToV8String(isolate, "quit"), |
| 62 "native function cancelPauseOnNextStatement();" | 67 v8::FunctionTemplate::New(isolate, &UtilsExtension::Quit)); |
| 63 "native function reconnect();" | 68 utils->Set(ToV8String(isolate, "setlocale"), |
| 64 "native function setLogConsoleApiMessageCalls();" | 69 v8::FunctionTemplate::New(isolate, &UtilsExtension::Setlocale)); |
| 65 "native function createContextGroup();") {} | 70 utils->Set(ToV8String(isolate, "read"), |
| 66 virtual v8::Local<v8::FunctionTemplate> GetNativeFunctionTemplate( | 71 v8::FunctionTemplate::New(isolate, &UtilsExtension::Read)); |
| 67 v8::Isolate* isolate, v8::Local<v8::String> name) { | 72 utils->Set(ToV8String(isolate, "load"), |
| 68 v8::Local<v8::Context> context = isolate->GetCurrentContext(); | 73 v8::FunctionTemplate::New(isolate, &UtilsExtension::Load)); |
| 69 if (name->Equals(context, v8::String::NewFromUtf8( | 74 utils->Set(ToV8String(isolate, "compileAndRunWithOrigin"), |
| 70 isolate, "print", v8::NewStringType::kNormal) | 75 v8::FunctionTemplate::New( |
| 71 .ToLocalChecked()) | 76 isolate, &UtilsExtension::CompileAndRunWithOrigin)); |
| 72 .FromJust()) { | 77 utils->Set(ToV8String(isolate, "setCurrentTimeMSForTest"), |
| 73 return v8::FunctionTemplate::New(isolate, UtilsExtension::Print); | 78 v8::FunctionTemplate::New( |
| 74 } else if (name->Equals(context, | 79 isolate, &UtilsExtension::SetCurrentTimeMSForTest)); |
| 75 v8::String::NewFromUtf8(isolate, "quit", | 80 utils->Set(ToV8String(isolate, "setMemoryInfoForTest"), |
| 76 v8::NewStringType::kNormal) | 81 v8::FunctionTemplate::New( |
| 77 .ToLocalChecked()) | 82 isolate, &UtilsExtension::SetMemoryInfoForTest)); |
| 78 .FromJust()) { | 83 utils->Set(ToV8String(isolate, "schedulePauseOnNextStatement"), |
| 79 return v8::FunctionTemplate::New(isolate, UtilsExtension::Quit); | 84 v8::FunctionTemplate::New( |
| 80 } else if (name->Equals(context, | 85 isolate, &UtilsExtension::SchedulePauseOnNextStatement)); |
| 81 v8::String::NewFromUtf8(isolate, "setlocale", | 86 utils->Set(ToV8String(isolate, "cancelPauseOnNextStatement"), |
| 82 v8::NewStringType::kNormal) | 87 v8::FunctionTemplate::New( |
| 83 .ToLocalChecked()) | 88 isolate, &UtilsExtension::CancelPauseOnNextStatement)); |
| 84 .FromJust()) { | 89 utils->Set(ToV8String(isolate, "reconnect"), |
| 85 return v8::FunctionTemplate::New(isolate, UtilsExtension::SetLocale); | 90 v8::FunctionTemplate::New(isolate, &UtilsExtension::Reconnect)); |
| 86 } else if (name->Equals(context, | 91 utils->Set(ToV8String(isolate, "setLogConsoleApiMessageCalls"), |
| 87 v8::String::NewFromUtf8(isolate, "read", | 92 v8::FunctionTemplate::New( |
| 88 v8::NewStringType::kNormal) | 93 isolate, &UtilsExtension::SetLogConsoleApiMessageCalls)); |
| 89 .ToLocalChecked()) | 94 utils->Set(ToV8String(isolate, "createContextGroup"), |
| 90 .FromJust()) { | 95 v8::FunctionTemplate::New(isolate, |
| 91 return v8::FunctionTemplate::New(isolate, UtilsExtension::Read); | 96 &UtilsExtension::CreateContextGroup)); |
| 92 } else if (name->Equals(context, | 97 local_context->Global() |
| 93 v8::String::NewFromUtf8(isolate, "load", | 98 ->Set(local_context, ToV8String(isolate, "utils"), |
| 94 v8::NewStringType::kNormal) | 99 utils->NewInstance(local_context).ToLocalChecked()) |
| 95 .ToLocalChecked()) | 100 .ToChecked(); |
| 96 .FromJust()) { | |
| 97 return v8::FunctionTemplate::New(isolate, UtilsExtension::Load); | |
| 98 } else if (name->Equals(context, v8::String::NewFromUtf8( | |
| 99 isolate, "compileAndRunWithOrigin", | |
| 100 v8::NewStringType::kNormal) | |
| 101 .ToLocalChecked()) | |
| 102 .FromJust()) { | |
| 103 return v8::FunctionTemplate::New(isolate, | |
| 104 UtilsExtension::CompileAndRunWithOrigin); | |
| 105 } else if (name->Equals(context, v8::String::NewFromUtf8( | |
| 106 isolate, "setCurrentTimeMSForTest", | |
| 107 v8::NewStringType::kNormal) | |
| 108 .ToLocalChecked()) | |
| 109 .FromJust()) { | |
| 110 return v8::FunctionTemplate::New(isolate, | |
| 111 UtilsExtension::SetCurrentTimeMSForTest); | |
| 112 } else if (name->Equals(context, v8::String::NewFromUtf8( | |
| 113 isolate, "setMemoryInfoForTest", | |
| 114 v8::NewStringType::kNormal) | |
| 115 .ToLocalChecked()) | |
| 116 .FromJust()) { | |
| 117 return v8::FunctionTemplate::New(isolate, | |
| 118 UtilsExtension::SetMemoryInfoForTest); | |
| 119 } else if (name->Equals(context, | |
| 120 v8::String::NewFromUtf8( | |
| 121 isolate, "schedulePauseOnNextStatement", | |
| 122 v8::NewStringType::kNormal) | |
| 123 .ToLocalChecked()) | |
| 124 .FromJust()) { | |
| 125 return v8::FunctionTemplate::New( | |
| 126 isolate, UtilsExtension::SchedulePauseOnNextStatement); | |
| 127 } else if (name->Equals(context, v8::String::NewFromUtf8( | |
| 128 isolate, "cancelPauseOnNextStatement", | |
| 129 v8::NewStringType::kNormal) | |
| 130 .ToLocalChecked()) | |
| 131 .FromJust()) { | |
| 132 return v8::FunctionTemplate::New( | |
| 133 isolate, UtilsExtension::CancelPauseOnNextStatement); | |
| 134 } else if (name->Equals(context, | |
| 135 v8::String::NewFromUtf8(isolate, "reconnect", | |
| 136 v8::NewStringType::kNormal) | |
| 137 .ToLocalChecked()) | |
| 138 .FromJust()) { | |
| 139 return v8::FunctionTemplate::New(isolate, UtilsExtension::Reconnect); | |
| 140 } else if (name->Equals(context, | |
| 141 v8::String::NewFromUtf8( | |
| 142 isolate, "setLogConsoleApiMessageCalls", | |
| 143 v8::NewStringType::kNormal) | |
| 144 .ToLocalChecked()) | |
| 145 .FromJust()) { | |
| 146 return v8::FunctionTemplate::New( | |
| 147 isolate, UtilsExtension::SetLogConsoleApiMessageCalls); | |
| 148 } else if (name->Equals(context, v8::String::NewFromUtf8( | |
| 149 isolate, "createContextGroup", | |
| 150 v8::NewStringType::kNormal) | |
| 151 .ToLocalChecked()) | |
| 152 .FromJust()) { | |
| 153 return v8::FunctionTemplate::New(isolate, | |
| 154 UtilsExtension::CreateContextGroup); | |
| 155 } | |
| 156 return v8::Local<v8::FunctionTemplate>(); | |
| 157 } | 101 } |
| 158 | 102 |
| 159 static void set_backend_task_runner(TaskRunner* runner) { | 103 static void set_backend_task_runner(TaskRunner* runner) { |
| 160 backend_runner_ = runner; | 104 backend_runner_ = runner; |
| 161 } | 105 } |
| 162 | 106 |
| 163 static void set_inspector_client(InspectorClientImpl* client) { | 107 static void set_inspector_client(InspectorClientImpl* client) { |
| 164 inspector_client_ = client; | 108 inspector_client_ = client; |
| 165 } | 109 } |
| 166 | 110 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 196 printf("Error in fwrite\n"); | 140 printf("Error in fwrite\n"); |
| 197 Quit(args); | 141 Quit(args); |
| 198 } | 142 } |
| 199 } | 143 } |
| 200 printf("\n"); | 144 printf("\n"); |
| 201 fflush(stdout); | 145 fflush(stdout); |
| 202 } | 146 } |
| 203 | 147 |
| 204 static void Quit(const v8::FunctionCallbackInfo<v8::Value>& args) { Exit(); } | 148 static void Quit(const v8::FunctionCallbackInfo<v8::Value>& args) { Exit(); } |
| 205 | 149 |
| 206 static void SetLocale(const v8::FunctionCallbackInfo<v8::Value>& args) { | 150 static void Setlocale(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 207 if (args.Length() != 1 || !args[0]->IsString()) { | 151 if (args.Length() != 1 || !args[0]->IsString()) { |
| 208 fprintf(stderr, "Internal error: setlocale get one string argument."); | 152 fprintf(stderr, "Internal error: setlocale get one string argument."); |
| 209 Exit(); | 153 Exit(); |
| 210 } | 154 } |
| 211 v8::String::Utf8Value str(args[0]); | 155 v8::String::Utf8Value str(args[0]); |
| 212 setlocale(LC_NUMERIC, *str); | 156 setlocale(LC_NUMERIC, *str); |
| 213 } | 157 } |
| 214 | 158 |
| 215 static bool ReadFile(v8::Isolate* isolate, v8::Local<v8::Value> name, | 159 static bool ReadFile(v8::Isolate* isolate, v8::Local<v8::Value> name, |
| 216 v8::internal::Vector<const char>* chars) { | 160 v8::internal::Vector<const char>* chars) { |
| (...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 687 v8::Platform* platform = v8::platform::CreateDefaultPlatform(); | 631 v8::Platform* platform = v8::platform::CreateDefaultPlatform(); |
| 688 v8::V8::InitializePlatform(platform); | 632 v8::V8::InitializePlatform(platform); |
| 689 v8::V8::SetFlagsFromCommandLine(&argc, argv, true); | 633 v8::V8::SetFlagsFromCommandLine(&argc, argv, true); |
| 690 v8::V8::InitializeExternalStartupData(argv[0]); | 634 v8::V8::InitializeExternalStartupData(argv[0]); |
| 691 v8::V8::Initialize(); | 635 v8::V8::Initialize(); |
| 692 | 636 |
| 693 SetTimeoutExtension set_timeout_extension; | 637 SetTimeoutExtension set_timeout_extension; |
| 694 v8::RegisterExtension(&set_timeout_extension); | 638 v8::RegisterExtension(&set_timeout_extension); |
| 695 InspectorExtension inspector_extension; | 639 InspectorExtension inspector_extension; |
| 696 v8::RegisterExtension(&inspector_extension); | 640 v8::RegisterExtension(&inspector_extension); |
| 697 UtilsExtension utils_extension; | |
| 698 v8::RegisterExtension(&utils_extension); | |
| 699 SendMessageToBackendExtension send_message_to_backend_extension; | 641 SendMessageToBackendExtension send_message_to_backend_extension; |
| 700 v8::RegisterExtension(&send_message_to_backend_extension); | 642 v8::RegisterExtension(&send_message_to_backend_extension); |
| 701 | 643 |
| 702 v8::base::Semaphore ready_semaphore(0); | 644 v8::base::Semaphore ready_semaphore(0); |
| 703 | 645 |
| 704 const char* backend_extensions[] = {"v8_inspector/setTimeout", | 646 const char* backend_extensions[] = {"v8_inspector/setTimeout", |
| 705 "v8_inspector/inspector"}; | 647 "v8_inspector/inspector"}; |
| 706 v8::ExtensionConfiguration backend_configuration( | 648 v8::ExtensionConfiguration backend_configuration( |
| 707 arraysize(backend_extensions), backend_extensions); | 649 arraysize(backend_extensions), backend_extensions); |
| 708 TaskRunner backend_runner(&backend_configuration, false, &ready_semaphore); | 650 TaskRunner backend_runner(&backend_configuration, false, &ready_semaphore); |
| 709 ready_semaphore.Wait(); | 651 ready_semaphore.Wait(); |
| 710 SendMessageToBackendExtension::set_backend_task_runner(&backend_runner); | 652 SendMessageToBackendExtension::set_backend_task_runner(&backend_runner); |
| 711 UtilsExtension::set_backend_task_runner(&backend_runner); | 653 UtilsExtension::set_backend_task_runner(&backend_runner); |
| 712 | 654 |
| 713 const char* frontend_extensions[] = {"v8_inspector/utils", | 655 const char* frontend_extensions[] = {"v8_inspector/frontend"}; |
| 714 "v8_inspector/frontend"}; | |
| 715 v8::ExtensionConfiguration frontend_configuration( | 656 v8::ExtensionConfiguration frontend_configuration( |
| 716 arraysize(frontend_extensions), frontend_extensions); | 657 arraysize(frontend_extensions), frontend_extensions); |
| 717 TaskRunner frontend_runner(&frontend_configuration, true, &ready_semaphore); | 658 TaskRunner frontend_runner(&frontend_configuration, true, &ready_semaphore); |
| 718 ready_semaphore.Wait(); | 659 ready_semaphore.Wait(); |
| 660 frontend_runner.Append(new UtilsExtension()); |
| 719 | 661 |
| 720 FrontendChannelImpl frontend_channel(&frontend_runner); | 662 FrontendChannelImpl frontend_channel(&frontend_runner); |
| 721 InspectorClientImpl inspector_client(&backend_runner, &frontend_channel, | 663 InspectorClientImpl inspector_client(&backend_runner, &frontend_channel, |
| 722 &ready_semaphore); | 664 &ready_semaphore); |
| 723 ready_semaphore.Wait(); | 665 ready_semaphore.Wait(); |
| 724 UtilsExtension::set_inspector_client(&inspector_client); | 666 UtilsExtension::set_inspector_client(&inspector_client); |
| 725 | 667 |
| 726 task_runners.push_back(&frontend_runner); | 668 task_runners.push_back(&frontend_runner); |
| 727 task_runners.push_back(&backend_runner); | 669 task_runners.push_back(&backend_runner); |
| 728 | 670 |
| 729 for (int i = 1; i < argc; ++i) { | 671 for (int i = 1; i < argc; ++i) { |
| 730 // Ignore unknown flags. | 672 // Ignore unknown flags. |
| 731 if (argv[i][0] == '-') continue; | 673 if (argv[i][0] == '-') continue; |
| 732 | 674 |
| 733 bool exists = false; | 675 bool exists = false; |
| 734 v8::internal::Vector<const char> chars = | 676 v8::internal::Vector<const char> chars = |
| 735 v8::internal::ReadFile(argv[i], &exists, true); | 677 v8::internal::ReadFile(argv[i], &exists, true); |
| 736 if (!exists) { | 678 if (!exists) { |
| 737 fprintf(stderr, "Internal error: script file doesn't exists: %s\n", | 679 fprintf(stderr, "Internal error: script file doesn't exists: %s\n", |
| 738 argv[i]); | 680 argv[i]); |
| 739 Exit(); | 681 Exit(); |
| 740 } | 682 } |
| 741 frontend_runner.Append(new ExecuteStringTask(chars)); | 683 frontend_runner.Append(new ExecuteStringTask(chars)); |
| 742 } | 684 } |
| 743 | 685 |
| 744 frontend_runner.Join(); | 686 frontend_runner.Join(); |
| 745 backend_runner.Join(); | 687 backend_runner.Join(); |
| 746 return 0; | 688 return 0; |
| 747 } | 689 } |
| OLD | NEW |