| Index: src/d8.cc
|
| diff --git a/src/d8.cc b/src/d8.cc
|
| index 2458249d18cef06164c8e330abce2fcc9d2f1351..a9c4aa68a9783757c760e3385c1b115e07a52f66 100644
|
| --- a/src/d8.cc
|
| +++ b/src/d8.cc
|
| @@ -2,14 +2,30 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| +
|
| +// Defined when linking against shared lib on Windows.
|
| +#if defined(USING_V8_SHARED) && !defined(V8_SHARED)
|
| +#define V8_SHARED
|
| +#endif
|
| +
|
| #include <errno.h>
|
| #include <stdlib.h>
|
| #include <string.h>
|
| #include <sys/stat.h>
|
|
|
| +#ifdef V8_SHARED
|
| +#include <assert.h>
|
| +#endif // V8_SHARED
|
| +
|
| +#ifndef V8_SHARED
|
| #include <algorithm>
|
| #include <fstream>
|
| #include <vector>
|
| +#endif // !V8_SHARED
|
| +
|
| +#ifdef V8_SHARED
|
| +#include "include/v8-testing.h"
|
| +#endif // V8_SHARED
|
|
|
| #ifdef ENABLE_VTUNE_JIT_INTERFACE
|
| #include "src/third_party/vtune/v8-vtune.h"
|
| @@ -20,6 +36,7 @@
|
|
|
| #include "include/libplatform/libplatform.h"
|
| #include "include/libplatform/v8-tracing.h"
|
| +#ifndef V8_SHARED
|
| #include "src/api.h"
|
| #include "src/base/cpu.h"
|
| #include "src/base/debug/stack_trace.h"
|
| @@ -31,6 +48,7 @@
|
| #include "src/snapshot/natives.h"
|
| #include "src/utils.h"
|
| #include "src/v8.h"
|
| +#endif // !V8_SHARED
|
|
|
| #if !defined(_WIN32) && !defined(_WIN64)
|
| #include <unistd.h> // NOLINT
|
| @@ -54,7 +72,9 @@ namespace v8 {
|
| namespace {
|
|
|
| const int MB = 1024 * 1024;
|
| +#ifndef V8_SHARED
|
| const int kMaxWorkers = 50;
|
| +#endif
|
|
|
|
|
| class ShellArrayBufferAllocator : public v8::ArrayBuffer::Allocator {
|
| @@ -82,6 +102,7 @@ class MockArrayBufferAllocator : public v8::ArrayBuffer::Allocator {
|
| };
|
|
|
|
|
| +#ifndef V8_SHARED
|
| // Predictable v8::Platform implementation. All background and foreground
|
| // tasks are run immediately, delayed tasks are not executed at all.
|
| class PredictablePlatform : public Platform {
|
| @@ -142,6 +163,7 @@ class PredictablePlatform : public Platform {
|
|
|
| DISALLOW_COPY_AND_ASSIGN(PredictablePlatform);
|
| };
|
| +#endif // !V8_SHARED
|
|
|
|
|
| v8::Platform* g_platform = NULL;
|
| @@ -154,6 +176,7 @@ static Local<Value> Throw(Isolate* isolate, const char* message) {
|
| }
|
|
|
|
|
| +#ifndef V8_SHARED
|
| bool FindInObjectList(Local<Object> object, const Shell::ObjectList& list) {
|
| for (int i = 0; i < list.length(); ++i) {
|
| if (list[i]->StrictEquals(object)) {
|
| @@ -179,6 +202,7 @@ Worker* GetWorkerFromInternalField(Isolate* isolate, Local<Object> object) {
|
|
|
| return worker;
|
| }
|
| +#endif // !V8_SHARED
|
|
|
|
|
| } // namespace
|
| @@ -346,6 +370,7 @@ class PerIsolateData {
|
| };
|
|
|
|
|
| +#ifndef V8_SHARED
|
| CounterMap* Shell::counter_map_;
|
| base::OS::MemoryMappedFile* Shell::counters_file_ = NULL;
|
| CounterCollection Shell::local_counters_;
|
| @@ -358,17 +383,20 @@ base::LazyMutex Shell::workers_mutex_;
|
| bool Shell::allow_new_workers_ = true;
|
| i::List<Worker*> Shell::workers_;
|
| i::List<SharedArrayBuffer::Contents> Shell::externalized_shared_contents_;
|
| +#endif // !V8_SHARED
|
|
|
| Global<Context> Shell::evaluation_context_;
|
| ArrayBuffer::Allocator* Shell::array_buffer_allocator;
|
| ShellOptions Shell::options;
|
| base::OnceType Shell::quit_once_ = V8_ONCE_INIT;
|
|
|
| +#ifndef V8_SHARED
|
| bool CounterMap::Match(void* key1, void* key2) {
|
| const char* name1 = reinterpret_cast<const char*>(key1);
|
| const char* name2 = reinterpret_cast<const char*>(key2);
|
| return strcmp(name1, name2) == 0;
|
| }
|
| +#endif // !V8_SHARED
|
|
|
|
|
| // Converts a V8 value to a C string.
|
| @@ -509,7 +537,9 @@ bool Shell::ExecuteString(Isolate* isolate, Local<String> source,
|
| }
|
| DCHECK(!try_catch.HasCaught());
|
| if (print_result) {
|
| +#if !defined(V8_SHARED)
|
| if (options.test_shell) {
|
| +#endif
|
| if (!result->IsUndefined()) {
|
| // If all went well and the result wasn't undefined then print
|
| // the returned value.
|
| @@ -517,11 +547,13 @@ bool Shell::ExecuteString(Isolate* isolate, Local<String> source,
|
| fwrite(*str, sizeof(**str), str.length(), stdout);
|
| printf("\n");
|
| }
|
| +#if !defined(V8_SHARED)
|
| } else {
|
| v8::String::Utf8Value str(Stringify(isolate, result));
|
| fwrite(*str, sizeof(**str), str.length(), stdout);
|
| printf("\n");
|
| }
|
| +#endif
|
| }
|
| return true;
|
| }
|
| @@ -573,6 +605,7 @@ int PerIsolateData::RealmIndexOrThrow(
|
| }
|
|
|
|
|
| +#ifndef V8_SHARED
|
| // performance.now() returns a time stamp as double, measured in milliseconds.
|
| // When FLAG_verify_predictable mode is enabled it returns result of
|
| // v8::Platform::MonotonicallyIncreasingTime().
|
| @@ -585,6 +618,7 @@ void Shell::PerformanceNow(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| args.GetReturnValue().Set(delta.InMillisecondsF());
|
| }
|
| }
|
| +#endif // !V8_SHARED
|
|
|
|
|
| // Realm.current() returns the index of the currently active realm.
|
| @@ -855,6 +889,7 @@ void Shell::Load(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| }
|
|
|
|
|
| +#ifndef V8_SHARED
|
| void Shell::WorkerNew(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| Isolate* isolate = args.GetIsolate();
|
| HandleScope handle_scope(isolate);
|
| @@ -976,13 +1011,16 @@ void Shell::WorkerTerminate(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
|
|
| worker->Terminate();
|
| }
|
| +#endif // !V8_SHARED
|
|
|
|
|
| void Shell::QuitOnce(v8::FunctionCallbackInfo<v8::Value>* args) {
|
| int exit_code = (*args)[0]
|
| ->Int32Value(args->GetIsolate()->GetCurrentContext())
|
| .FromMaybe(0);
|
| +#ifndef V8_SHARED
|
| CleanupWorkers();
|
| +#endif // !V8_SHARED
|
| OnExit(args->GetIsolate());
|
| Exit(exit_code);
|
| }
|
| @@ -1003,12 +1041,14 @@ void Shell::Version(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
|
|
| void Shell::ReportException(Isolate* isolate, v8::TryCatch* try_catch) {
|
| HandleScope handle_scope(isolate);
|
| +#ifndef V8_SHARED
|
| Local<Context> context;
|
| bool enter_context = !isolate->InContext();
|
| if (enter_context) {
|
| context = Local<Context>::New(isolate, evaluation_context_);
|
| context->Enter();
|
| }
|
| +#endif // !V8_SHARED
|
| v8::String::Utf8Value exception(try_catch->Exception());
|
| const char* exception_string = ToCString(exception);
|
| Local<Message> message = try_catch->Message();
|
| @@ -1052,10 +1092,13 @@ void Shell::ReportException(Isolate* isolate, v8::TryCatch* try_catch) {
|
| }
|
| }
|
| printf("\n");
|
| +#ifndef V8_SHARED
|
| if (enter_context) context->Exit();
|
| +#endif // !V8_SHARED
|
| }
|
|
|
|
|
| +#ifndef V8_SHARED
|
| int32_t* Counter::Bind(const char* name, bool is_histogram) {
|
| int i;
|
| for (i = 0; i < kMaxNameSize - 1 && name[i]; i++)
|
| @@ -1184,6 +1227,7 @@ Local<String> Shell::Stringify(Isolate* isolate, Local<Value> value) {
|
| if (result.IsEmpty()) return String::Empty(isolate);
|
| return result.ToLocalChecked().As<String>();
|
| }
|
| +#endif // !V8_SHARED
|
|
|
|
|
| Local<ObjectTemplate> Shell::CreateGlobalTemplate(Isolate* isolate) {
|
| @@ -1274,6 +1318,7 @@ Local<ObjectTemplate> Shell::CreateGlobalTemplate(Isolate* isolate) {
|
| .ToLocalChecked(),
|
| realm_template);
|
|
|
| +#ifndef V8_SHARED
|
| Local<ObjectTemplate> performance_template = ObjectTemplate::New(isolate);
|
| performance_template->Set(
|
| String::NewFromUtf8(isolate, "now", NewStringType::kNormal)
|
| @@ -1312,6 +1357,7 @@ Local<ObjectTemplate> Shell::CreateGlobalTemplate(Isolate* isolate) {
|
| String::NewFromUtf8(isolate, "Worker", NewStringType::kNormal)
|
| .ToLocalChecked(),
|
| worker_fun_template);
|
| +#endif // !V8_SHARED
|
|
|
| Local<ObjectTemplate> os_templ = ObjectTemplate::New(isolate);
|
| AddOSMethods(isolate, os_templ);
|
| @@ -1329,17 +1375,21 @@ static void EmptyMessageCallback(Local<Message> message, Local<Value> error) {
|
| }
|
|
|
| void Shell::Initialize(Isolate* isolate) {
|
| +#ifndef V8_SHARED
|
| // Set up counters
|
| if (i::StrLength(i::FLAG_map_counters) != 0)
|
| MapCounters(isolate, i::FLAG_map_counters);
|
| +#endif // !V8_SHARED
|
| // Disable default message reporting.
|
| isolate->AddMessageListener(EmptyMessageCallback);
|
| }
|
|
|
|
|
| Local<Context> Shell::CreateEvaluationContext(Isolate* isolate) {
|
| +#ifndef V8_SHARED
|
| // This needs to be a critical section since this is not thread-safe
|
| base::LockGuard<base::Mutex> lock_guard(context_mutex_.Pointer());
|
| +#endif // !V8_SHARED
|
| // Initialize the global objects
|
| Local<ObjectTemplate> global_template = CreateGlobalTemplate(isolate);
|
| EscapableHandleScope handle_scope(isolate);
|
| @@ -1347,6 +1397,7 @@ Local<Context> Shell::CreateEvaluationContext(Isolate* isolate) {
|
| DCHECK(!context.IsEmpty());
|
| Context::Scope scope(context);
|
|
|
| +#ifndef V8_SHARED
|
| i::Factory* factory = reinterpret_cast<i::Isolate*>(isolate)->factory();
|
| i::JSArguments js_args = i::FLAG_js_arguments;
|
| i::Handle<i::FixedArray> arguments_array =
|
| @@ -1364,6 +1415,7 @@ Local<Context> Shell::CreateEvaluationContext(Isolate* isolate) {
|
| .ToLocalChecked(),
|
| Utils::ToLocal(arguments_jsarray))
|
| .FromJust();
|
| +#endif // !V8_SHARED
|
| return handle_scope.Escape(context);
|
| }
|
|
|
| @@ -1377,6 +1429,7 @@ void Shell::Exit(int exit_code) {
|
| }
|
|
|
|
|
| +#ifndef V8_SHARED
|
| struct CounterAndKey {
|
| Counter* counter;
|
| const char* key;
|
| @@ -1401,8 +1454,11 @@ void Shell::WriteIgnitionDispatchCountersFile(v8::Isolate* isolate) {
|
| JSON::Stringify(context, dispatch_counters).ToLocalChecked());
|
| }
|
|
|
| +#endif // !V8_SHARED
|
| +
|
|
|
| void Shell::OnExit(v8::Isolate* isolate) {
|
| +#ifndef V8_SHARED
|
| if (i::FLAG_dump_counters) {
|
| int number_of_counters = 0;
|
| for (CounterMap::Iterator i(counter_map_); i.More(); i.Next()) {
|
| @@ -1438,6 +1494,7 @@ void Shell::OnExit(v8::Isolate* isolate) {
|
|
|
| delete counters_file_;
|
| delete counter_map_;
|
| +#endif // !V8_SHARED
|
| }
|
|
|
|
|
| @@ -1571,8 +1628,10 @@ void Shell::RunShell(Isolate* isolate) {
|
|
|
|
|
| SourceGroup::~SourceGroup() {
|
| +#ifndef V8_SHARED
|
| delete thread_;
|
| thread_ = NULL;
|
| +#endif // !V8_SHARED
|
| }
|
|
|
|
|
| @@ -1641,6 +1700,7 @@ Local<String> SourceGroup::ReadFile(Isolate* isolate, const char* name) {
|
| }
|
|
|
|
|
| +#ifndef V8_SHARED
|
| base::Thread::Options SourceGroup::GetThreadOptions() {
|
| // On some systems (OSX 10.6) the stack size default is 0.5Mb or less
|
| // which is not enough to parse the big literal expressions used in tests.
|
| @@ -1964,6 +2024,7 @@ void Worker::PostMessageOut(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| delete data;
|
| }
|
| }
|
| +#endif // !V8_SHARED
|
|
|
|
|
| void SetFlagsFromString(const char* flags) {
|
| @@ -2019,16 +2080,30 @@ bool Shell::SetOptions(int argc, char* argv[]) {
|
| // JavaScript engines.
|
| continue;
|
| } else if (strcmp(argv[i], "--isolate") == 0) {
|
| +#ifdef V8_SHARED
|
| + printf("D8 with shared library does not support multi-threading\n");
|
| + return false;
|
| +#endif // V8_SHARED
|
| options.num_isolates++;
|
| } else if (strcmp(argv[i], "--dump-heap-constants") == 0) {
|
| +#ifdef V8_SHARED
|
| + printf("D8 with shared library does not support constant dumping\n");
|
| + return false;
|
| +#else
|
| options.dump_heap_constants = true;
|
| argv[i] = NULL;
|
| +#endif // V8_SHARED
|
| } else if (strcmp(argv[i], "--throws") == 0) {
|
| options.expected_to_throw = true;
|
| argv[i] = NULL;
|
| } else if (strncmp(argv[i], "--icu-data-file=", 16) == 0) {
|
| options.icu_data_file = argv[i] + 16;
|
| argv[i] = NULL;
|
| +#ifdef V8_SHARED
|
| + } else if (strcmp(argv[i], "--dump-counters") == 0) {
|
| + printf("D8 with shared library does not include counters\n");
|
| + return false;
|
| +#endif // V8_SHARED
|
| #ifdef V8_USE_EXTERNAL_STARTUP_DATA
|
| } else if (strncmp(argv[i], "--natives_blob=", 15) == 0) {
|
| options.natives_blob = argv[i] + 15;
|
| @@ -2094,9 +2169,11 @@ bool Shell::SetOptions(int argc, char* argv[]) {
|
|
|
|
|
| int Shell::RunMain(Isolate* isolate, int argc, char* argv[], bool last_run) {
|
| +#ifndef V8_SHARED
|
| for (int i = 1; i < options.num_isolates; ++i) {
|
| options.isolate_sources[i].StartExecuteInThread();
|
| }
|
| +#endif // !V8_SHARED
|
| {
|
| HandleScope scope(isolate);
|
| Local<Context> context = CreateEvaluationContext(isolate);
|
| @@ -2111,6 +2188,7 @@ int Shell::RunMain(Isolate* isolate, int argc, char* argv[], bool last_run) {
|
| }
|
| }
|
| CollectGarbage(isolate);
|
| +#ifndef V8_SHARED
|
| for (int i = 1; i < options.num_isolates; ++i) {
|
| if (last_run) {
|
| options.isolate_sources[i].JoinThread();
|
| @@ -2119,6 +2197,7 @@ int Shell::RunMain(Isolate* isolate, int argc, char* argv[], bool last_run) {
|
| }
|
| }
|
| CleanupWorkers();
|
| +#endif // !V8_SHARED
|
| return 0;
|
| }
|
|
|
| @@ -2140,12 +2219,17 @@ void Shell::CollectGarbage(Isolate* isolate) {
|
|
|
|
|
| void Shell::EmptyMessageQueues(Isolate* isolate) {
|
| +#ifndef V8_SHARED
|
| if (!i::FLAG_verify_predictable) {
|
| +#endif
|
| while (v8::platform::PumpMessageLoop(g_platform, isolate)) continue;
|
| +#ifndef V8_SHARED
|
| }
|
| +#endif
|
| }
|
|
|
|
|
| +#ifndef V8_SHARED
|
| bool Shell::SerializeValue(Isolate* isolate, Local<Value> value,
|
| const ObjectList& to_transfer,
|
| ObjectList* seen_objects,
|
| @@ -2460,11 +2544,14 @@ static void DumpHeapConstants(i::Isolate* isolate) {
|
| printf("}\n");
|
| #undef ROOT_LIST_CASE
|
| }
|
| +#endif // !V8_SHARED
|
|
|
|
|
| int Shell::Main(int argc, char* argv[]) {
|
| std::ofstream trace_file;
|
| +#ifndef V8_SHARED
|
| v8::base::debug::EnableInProcessStackDumping();
|
| +#endif
|
| #if (defined(_WIN32) || defined(_WIN64))
|
| UINT new_flags =
|
| SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX;
|
| @@ -2482,9 +2569,13 @@ int Shell::Main(int argc, char* argv[]) {
|
| #endif // defined(_WIN32) || defined(_WIN64)
|
| if (!SetOptions(argc, argv)) return 1;
|
| v8::V8::InitializeICUDefaultLocation(argv[0], options.icu_data_file);
|
| +#ifndef V8_SHARED
|
| g_platform = i::FLAG_verify_predictable
|
| ? new PredictablePlatform()
|
| : v8::platform::CreateDefaultPlatform();
|
| +#else
|
| + g_platform = v8::platform::CreateDefaultPlatform();
|
| +#endif // !V8_SHARED
|
|
|
| v8::V8::InitializePlatform(g_platform);
|
| v8::V8::Initialize();
|
| @@ -2510,6 +2601,7 @@ int Shell::Main(int argc, char* argv[]) {
|
| #ifdef ENABLE_VTUNE_JIT_INTERFACE
|
| create_params.code_event_handler = vTune::GetVtuneCodeEventHandler();
|
| #endif
|
| +#ifndef V8_SHARED
|
| create_params.constraints.ConfigureDefaults(
|
| base::SysInfo::AmountOfPhysicalMemory(),
|
| base::SysInfo::AmountOfVirtualMemory());
|
| @@ -2520,6 +2612,7 @@ int Shell::Main(int argc, char* argv[]) {
|
| create_params.create_histogram_callback = CreateHistogram;
|
| create_params.add_histogram_sample_callback = AddHistogramSample;
|
| }
|
| +#endif
|
| Isolate* isolate = Isolate::New(create_params);
|
| {
|
| Isolate::Scope scope(isolate);
|
| @@ -2549,15 +2642,21 @@ int Shell::Main(int argc, char* argv[]) {
|
| }
|
| tracing_controller->Initialize(trace_buffer);
|
| tracing_controller->StartTracing(trace_config);
|
| +#ifndef V8_SHARED
|
| if (!i::FLAG_verify_predictable) {
|
| platform::SetTracingController(g_platform, tracing_controller);
|
| }
|
| +#else
|
| + platform::SetTracingController(g_platform, tracing_controller);
|
| +#endif
|
| }
|
|
|
| +#ifndef V8_SHARED
|
| if (options.dump_heap_constants) {
|
| DumpHeapConstants(reinterpret_cast<i::Isolate*>(isolate));
|
| return 0;
|
| }
|
| +#endif
|
|
|
| if (options.stress_opt || options.stress_deopt) {
|
| Testing::SetStressRunType(options.stress_opt
|
| @@ -2573,6 +2672,7 @@ int Shell::Main(int argc, char* argv[]) {
|
| }
|
| printf("======== Full Deoptimization =======\n");
|
| Testing::DeoptimizeAll(isolate);
|
| +#if !defined(V8_SHARED)
|
| } else if (i::FLAG_stress_runs > 0) {
|
| options.stress_runs = i::FLAG_stress_runs;
|
| for (int i = 0; i < options.stress_runs && result == 0; i++) {
|
| @@ -2581,6 +2681,7 @@ int Shell::Main(int argc, char* argv[]) {
|
| bool last_run = i == options.stress_runs - 1;
|
| result = RunMain(isolate, argc, argv, last_run);
|
| }
|
| +#endif
|
| } else {
|
| bool last_run = true;
|
| result = RunMain(isolate, argc, argv, last_run);
|
| @@ -2592,23 +2693,29 @@ int Shell::Main(int argc, char* argv[]) {
|
| RunShell(isolate);
|
| }
|
|
|
| +#ifndef V8_SHARED
|
| if (i::FLAG_ignition && i::FLAG_trace_ignition_dispatches &&
|
| i::FLAG_trace_ignition_dispatches_output_file != nullptr) {
|
| WriteIgnitionDispatchCountersFile(isolate);
|
| }
|
| +#endif
|
|
|
| // Shut down contexts and collect garbage.
|
| evaluation_context_.Reset();
|
| +#ifndef V8_SHARED
|
| stringify_function_.Reset();
|
| +#endif // !V8_SHARED
|
| CollectGarbage(isolate);
|
| }
|
| OnExit(isolate);
|
| +#ifndef V8_SHARED
|
| // Dump basic block profiling data.
|
| if (i::BasicBlockProfiler* profiler =
|
| reinterpret_cast<i::Isolate*>(isolate)->basic_block_profiler()) {
|
| i::OFStream os(stdout);
|
| os << *profiler;
|
| }
|
| +#endif // !V8_SHARED
|
| isolate->Dispose();
|
| V8::Dispose();
|
| V8::ShutdownPlatform();
|
|
|