| 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 |
| 6 // Defined when linking against shared lib on Windows. |
| 7 #if defined(USING_V8_SHARED) && !defined(V8_SHARED) |
| 8 #define V8_SHARED |
| 9 #endif |
| 10 |
| 5 #include <errno.h> | 11 #include <errno.h> |
| 6 #include <stdlib.h> | 12 #include <stdlib.h> |
| 7 #include <string.h> | 13 #include <string.h> |
| 8 #include <sys/stat.h> | 14 #include <sys/stat.h> |
| 9 | 15 |
| 16 #ifdef V8_SHARED |
| 17 #include <assert.h> |
| 18 #endif // V8_SHARED |
| 19 |
| 20 #ifndef V8_SHARED |
| 10 #include <algorithm> | 21 #include <algorithm> |
| 11 #include <fstream> | 22 #include <fstream> |
| 12 #include <vector> | 23 #include <vector> |
| 24 #endif // !V8_SHARED |
| 25 |
| 26 #ifdef V8_SHARED |
| 27 #include "include/v8-testing.h" |
| 28 #endif // V8_SHARED |
| 13 | 29 |
| 14 #ifdef ENABLE_VTUNE_JIT_INTERFACE | 30 #ifdef ENABLE_VTUNE_JIT_INTERFACE |
| 15 #include "src/third_party/vtune/v8-vtune.h" | 31 #include "src/third_party/vtune/v8-vtune.h" |
| 16 #endif | 32 #endif |
| 17 | 33 |
| 18 #include "src/d8.h" | 34 #include "src/d8.h" |
| 19 #include "src/ostreams.h" | 35 #include "src/ostreams.h" |
| 20 | 36 |
| 21 #include "include/libplatform/libplatform.h" | 37 #include "include/libplatform/libplatform.h" |
| 22 #include "include/libplatform/v8-tracing.h" | 38 #include "include/libplatform/v8-tracing.h" |
| 39 #ifndef V8_SHARED |
| 23 #include "src/api.h" | 40 #include "src/api.h" |
| 24 #include "src/base/cpu.h" | 41 #include "src/base/cpu.h" |
| 25 #include "src/base/debug/stack_trace.h" | 42 #include "src/base/debug/stack_trace.h" |
| 26 #include "src/base/logging.h" | 43 #include "src/base/logging.h" |
| 27 #include "src/base/platform/platform.h" | 44 #include "src/base/platform/platform.h" |
| 28 #include "src/base/sys-info.h" | 45 #include "src/base/sys-info.h" |
| 29 #include "src/basic-block-profiler.h" | 46 #include "src/basic-block-profiler.h" |
| 30 #include "src/interpreter/interpreter.h" | 47 #include "src/interpreter/interpreter.h" |
| 31 #include "src/snapshot/natives.h" | 48 #include "src/snapshot/natives.h" |
| 32 #include "src/utils.h" | 49 #include "src/utils.h" |
| 33 #include "src/v8.h" | 50 #include "src/v8.h" |
| 51 #endif // !V8_SHARED |
| 34 | 52 |
| 35 #if !defined(_WIN32) && !defined(_WIN64) | 53 #if !defined(_WIN32) && !defined(_WIN64) |
| 36 #include <unistd.h> // NOLINT | 54 #include <unistd.h> // NOLINT |
| 37 #else | 55 #else |
| 38 #include <windows.h> // NOLINT | 56 #include <windows.h> // NOLINT |
| 39 #if defined(_MSC_VER) | 57 #if defined(_MSC_VER) |
| 40 #include <crtdbg.h> // NOLINT | 58 #include <crtdbg.h> // NOLINT |
| 41 #endif // defined(_MSC_VER) | 59 #endif // defined(_MSC_VER) |
| 42 #endif // !defined(_WIN32) && !defined(_WIN64) | 60 #endif // !defined(_WIN32) && !defined(_WIN64) |
| 43 | 61 |
| 44 #ifndef DCHECK | 62 #ifndef DCHECK |
| 45 #define DCHECK(condition) assert(condition) | 63 #define DCHECK(condition) assert(condition) |
| 46 #endif | 64 #endif |
| 47 | 65 |
| 48 #ifndef CHECK | 66 #ifndef CHECK |
| 49 #define CHECK(condition) assert(condition) | 67 #define CHECK(condition) assert(condition) |
| 50 #endif | 68 #endif |
| 51 | 69 |
| 52 namespace v8 { | 70 namespace v8 { |
| 53 | 71 |
| 54 namespace { | 72 namespace { |
| 55 | 73 |
| 56 const int MB = 1024 * 1024; | 74 const int MB = 1024 * 1024; |
| 75 #ifndef V8_SHARED |
| 57 const int kMaxWorkers = 50; | 76 const int kMaxWorkers = 50; |
| 77 #endif |
| 58 | 78 |
| 59 | 79 |
| 60 class ShellArrayBufferAllocator : public v8::ArrayBuffer::Allocator { | 80 class ShellArrayBufferAllocator : public v8::ArrayBuffer::Allocator { |
| 61 public: | 81 public: |
| 62 virtual void* Allocate(size_t length) { | 82 virtual void* Allocate(size_t length) { |
| 63 void* data = AllocateUninitialized(length); | 83 void* data = AllocateUninitialized(length); |
| 64 return data == NULL ? data : memset(data, 0, length); | 84 return data == NULL ? data : memset(data, 0, length); |
| 65 } | 85 } |
| 66 virtual void* AllocateUninitialized(size_t length) { return malloc(length); } | 86 virtual void* AllocateUninitialized(size_t length) { return malloc(length); } |
| 67 virtual void Free(void* data, size_t) { free(data); } | 87 virtual void Free(void* data, size_t) { free(data); } |
| 68 }; | 88 }; |
| 69 | 89 |
| 70 | 90 |
| 71 class MockArrayBufferAllocator : public v8::ArrayBuffer::Allocator { | 91 class MockArrayBufferAllocator : public v8::ArrayBuffer::Allocator { |
| 72 public: | 92 public: |
| 73 void* Allocate(size_t length) override { | 93 void* Allocate(size_t length) override { |
| 74 size_t actual_length = length > 10 * MB ? 1 : length; | 94 size_t actual_length = length > 10 * MB ? 1 : length; |
| 75 void* data = AllocateUninitialized(actual_length); | 95 void* data = AllocateUninitialized(actual_length); |
| 76 return data == NULL ? data : memset(data, 0, actual_length); | 96 return data == NULL ? data : memset(data, 0, actual_length); |
| 77 } | 97 } |
| 78 void* AllocateUninitialized(size_t length) override { | 98 void* AllocateUninitialized(size_t length) override { |
| 79 return length > 10 * MB ? malloc(1) : malloc(length); | 99 return length > 10 * MB ? malloc(1) : malloc(length); |
| 80 } | 100 } |
| 81 void Free(void* p, size_t) override { free(p); } | 101 void Free(void* p, size_t) override { free(p); } |
| 82 }; | 102 }; |
| 83 | 103 |
| 84 | 104 |
| 105 #ifndef V8_SHARED |
| 85 // Predictable v8::Platform implementation. All background and foreground | 106 // Predictable v8::Platform implementation. All background and foreground |
| 86 // tasks are run immediately, delayed tasks are not executed at all. | 107 // tasks are run immediately, delayed tasks are not executed at all. |
| 87 class PredictablePlatform : public Platform { | 108 class PredictablePlatform : public Platform { |
| 88 public: | 109 public: |
| 89 PredictablePlatform() {} | 110 PredictablePlatform() {} |
| 90 | 111 |
| 91 void CallOnBackgroundThread(Task* task, | 112 void CallOnBackgroundThread(Task* task, |
| 92 ExpectedRuntime expected_runtime) override { | 113 ExpectedRuntime expected_runtime) override { |
| 93 task->Run(); | 114 task->Run(); |
| 94 delete task; | 115 delete task; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 135 const uint8_t* categoryEnabledFlag) override { | 156 const uint8_t* categoryEnabledFlag) override { |
| 136 static const char* dummy = "dummy"; | 157 static const char* dummy = "dummy"; |
| 137 return dummy; | 158 return dummy; |
| 138 } | 159 } |
| 139 | 160 |
| 140 private: | 161 private: |
| 141 double synthetic_time_in_sec_ = 0.0; | 162 double synthetic_time_in_sec_ = 0.0; |
| 142 | 163 |
| 143 DISALLOW_COPY_AND_ASSIGN(PredictablePlatform); | 164 DISALLOW_COPY_AND_ASSIGN(PredictablePlatform); |
| 144 }; | 165 }; |
| 166 #endif // !V8_SHARED |
| 145 | 167 |
| 146 | 168 |
| 147 v8::Platform* g_platform = NULL; | 169 v8::Platform* g_platform = NULL; |
| 148 | 170 |
| 149 | 171 |
| 150 static Local<Value> Throw(Isolate* isolate, const char* message) { | 172 static Local<Value> Throw(Isolate* isolate, const char* message) { |
| 151 return isolate->ThrowException( | 173 return isolate->ThrowException( |
| 152 String::NewFromUtf8(isolate, message, NewStringType::kNormal) | 174 String::NewFromUtf8(isolate, message, NewStringType::kNormal) |
| 153 .ToLocalChecked()); | 175 .ToLocalChecked()); |
| 154 } | 176 } |
| 155 | 177 |
| 156 | 178 |
| 179 #ifndef V8_SHARED |
| 157 bool FindInObjectList(Local<Object> object, const Shell::ObjectList& list) { | 180 bool FindInObjectList(Local<Object> object, const Shell::ObjectList& list) { |
| 158 for (int i = 0; i < list.length(); ++i) { | 181 for (int i = 0; i < list.length(); ++i) { |
| 159 if (list[i]->StrictEquals(object)) { | 182 if (list[i]->StrictEquals(object)) { |
| 160 return true; | 183 return true; |
| 161 } | 184 } |
| 162 } | 185 } |
| 163 return false; | 186 return false; |
| 164 } | 187 } |
| 165 | 188 |
| 166 | 189 |
| 167 Worker* GetWorkerFromInternalField(Isolate* isolate, Local<Object> object) { | 190 Worker* GetWorkerFromInternalField(Isolate* isolate, Local<Object> object) { |
| 168 if (object->InternalFieldCount() != 1) { | 191 if (object->InternalFieldCount() != 1) { |
| 169 Throw(isolate, "this is not a Worker"); | 192 Throw(isolate, "this is not a Worker"); |
| 170 return NULL; | 193 return NULL; |
| 171 } | 194 } |
| 172 | 195 |
| 173 Worker* worker = | 196 Worker* worker = |
| 174 static_cast<Worker*>(object->GetAlignedPointerFromInternalField(0)); | 197 static_cast<Worker*>(object->GetAlignedPointerFromInternalField(0)); |
| 175 if (worker == NULL) { | 198 if (worker == NULL) { |
| 176 Throw(isolate, "Worker is defunct because main thread is terminating"); | 199 Throw(isolate, "Worker is defunct because main thread is terminating"); |
| 177 return NULL; | 200 return NULL; |
| 178 } | 201 } |
| 179 | 202 |
| 180 return worker; | 203 return worker; |
| 181 } | 204 } |
| 205 #endif // !V8_SHARED |
| 182 | 206 |
| 183 | 207 |
| 184 } // namespace | 208 } // namespace |
| 185 | 209 |
| 186 namespace tracing { | 210 namespace tracing { |
| 187 | 211 |
| 188 namespace { | 212 namespace { |
| 189 | 213 |
| 190 // String options that can be used to initialize TraceOptions. | 214 // String options that can be used to initialize TraceOptions. |
| 191 const char kRecordUntilFull[] = "record-until-full"; | 215 const char kRecordUntilFull[] = "record-until-full"; |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 int realm_switch_; | 363 int realm_switch_; |
| 340 Global<Context>* realms_; | 364 Global<Context>* realms_; |
| 341 Global<Value> realm_shared_; | 365 Global<Value> realm_shared_; |
| 342 | 366 |
| 343 int RealmIndexOrThrow(const v8::FunctionCallbackInfo<v8::Value>& args, | 367 int RealmIndexOrThrow(const v8::FunctionCallbackInfo<v8::Value>& args, |
| 344 int arg_offset); | 368 int arg_offset); |
| 345 int RealmFind(Local<Context> context); | 369 int RealmFind(Local<Context> context); |
| 346 }; | 370 }; |
| 347 | 371 |
| 348 | 372 |
| 373 #ifndef V8_SHARED |
| 349 CounterMap* Shell::counter_map_; | 374 CounterMap* Shell::counter_map_; |
| 350 base::OS::MemoryMappedFile* Shell::counters_file_ = NULL; | 375 base::OS::MemoryMappedFile* Shell::counters_file_ = NULL; |
| 351 CounterCollection Shell::local_counters_; | 376 CounterCollection Shell::local_counters_; |
| 352 CounterCollection* Shell::counters_ = &local_counters_; | 377 CounterCollection* Shell::counters_ = &local_counters_; |
| 353 base::LazyMutex Shell::context_mutex_; | 378 base::LazyMutex Shell::context_mutex_; |
| 354 const base::TimeTicks Shell::kInitialTicks = | 379 const base::TimeTicks Shell::kInitialTicks = |
| 355 base::TimeTicks::HighResolutionNow(); | 380 base::TimeTicks::HighResolutionNow(); |
| 356 Global<Function> Shell::stringify_function_; | 381 Global<Function> Shell::stringify_function_; |
| 357 base::LazyMutex Shell::workers_mutex_; | 382 base::LazyMutex Shell::workers_mutex_; |
| 358 bool Shell::allow_new_workers_ = true; | 383 bool Shell::allow_new_workers_ = true; |
| 359 i::List<Worker*> Shell::workers_; | 384 i::List<Worker*> Shell::workers_; |
| 360 i::List<SharedArrayBuffer::Contents> Shell::externalized_shared_contents_; | 385 i::List<SharedArrayBuffer::Contents> Shell::externalized_shared_contents_; |
| 386 #endif // !V8_SHARED |
| 361 | 387 |
| 362 Global<Context> Shell::evaluation_context_; | 388 Global<Context> Shell::evaluation_context_; |
| 363 ArrayBuffer::Allocator* Shell::array_buffer_allocator; | 389 ArrayBuffer::Allocator* Shell::array_buffer_allocator; |
| 364 ShellOptions Shell::options; | 390 ShellOptions Shell::options; |
| 365 base::OnceType Shell::quit_once_ = V8_ONCE_INIT; | 391 base::OnceType Shell::quit_once_ = V8_ONCE_INIT; |
| 366 | 392 |
| 393 #ifndef V8_SHARED |
| 367 bool CounterMap::Match(void* key1, void* key2) { | 394 bool CounterMap::Match(void* key1, void* key2) { |
| 368 const char* name1 = reinterpret_cast<const char*>(key1); | 395 const char* name1 = reinterpret_cast<const char*>(key1); |
| 369 const char* name2 = reinterpret_cast<const char*>(key2); | 396 const char* name2 = reinterpret_cast<const char*>(key2); |
| 370 return strcmp(name1, name2) == 0; | 397 return strcmp(name1, name2) == 0; |
| 371 } | 398 } |
| 399 #endif // !V8_SHARED |
| 372 | 400 |
| 373 | 401 |
| 374 // Converts a V8 value to a C string. | 402 // Converts a V8 value to a C string. |
| 375 const char* Shell::ToCString(const v8::String::Utf8Value& value) { | 403 const char* Shell::ToCString(const v8::String::Utf8Value& value) { |
| 376 return *value ? *value : "<string conversion failed>"; | 404 return *value ? *value : "<string conversion failed>"; |
| 377 } | 405 } |
| 378 | 406 |
| 379 | 407 |
| 380 ScriptCompiler::CachedData* CompileForCachedData( | 408 ScriptCompiler::CachedData* CompileForCachedData( |
| 381 Local<String> source, Local<Value> name, | 409 Local<String> source, Local<Value> name, |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 502 } | 530 } |
| 503 Local<Value> result; | 531 Local<Value> result; |
| 504 if (!maybe_result.ToLocal(&result)) { | 532 if (!maybe_result.ToLocal(&result)) { |
| 505 DCHECK(try_catch.HasCaught()); | 533 DCHECK(try_catch.HasCaught()); |
| 506 // Print errors that happened during execution. | 534 // Print errors that happened during execution. |
| 507 if (report_exceptions) ReportException(isolate, &try_catch); | 535 if (report_exceptions) ReportException(isolate, &try_catch); |
| 508 return false; | 536 return false; |
| 509 } | 537 } |
| 510 DCHECK(!try_catch.HasCaught()); | 538 DCHECK(!try_catch.HasCaught()); |
| 511 if (print_result) { | 539 if (print_result) { |
| 540 #if !defined(V8_SHARED) |
| 512 if (options.test_shell) { | 541 if (options.test_shell) { |
| 542 #endif |
| 513 if (!result->IsUndefined()) { | 543 if (!result->IsUndefined()) { |
| 514 // If all went well and the result wasn't undefined then print | 544 // If all went well and the result wasn't undefined then print |
| 515 // the returned value. | 545 // the returned value. |
| 516 v8::String::Utf8Value str(result); | 546 v8::String::Utf8Value str(result); |
| 517 fwrite(*str, sizeof(**str), str.length(), stdout); | 547 fwrite(*str, sizeof(**str), str.length(), stdout); |
| 518 printf("\n"); | 548 printf("\n"); |
| 519 } | 549 } |
| 550 #if !defined(V8_SHARED) |
| 520 } else { | 551 } else { |
| 521 v8::String::Utf8Value str(Stringify(isolate, result)); | 552 v8::String::Utf8Value str(Stringify(isolate, result)); |
| 522 fwrite(*str, sizeof(**str), str.length(), stdout); | 553 fwrite(*str, sizeof(**str), str.length(), stdout); |
| 523 printf("\n"); | 554 printf("\n"); |
| 524 } | 555 } |
| 556 #endif |
| 525 } | 557 } |
| 526 return true; | 558 return true; |
| 527 } | 559 } |
| 528 | 560 |
| 529 | 561 |
| 530 PerIsolateData::RealmScope::RealmScope(PerIsolateData* data) : data_(data) { | 562 PerIsolateData::RealmScope::RealmScope(PerIsolateData* data) : data_(data) { |
| 531 data_->realm_count_ = 1; | 563 data_->realm_count_ = 1; |
| 532 data_->realm_current_ = 0; | 564 data_->realm_current_ = 0; |
| 533 data_->realm_switch_ = 0; | 565 data_->realm_switch_ = 0; |
| 534 data_->realms_ = new Global<Context>[1]; | 566 data_->realms_ = new Global<Context>[1]; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 566 ->Int32Value(args.GetIsolate()->GetCurrentContext()) | 598 ->Int32Value(args.GetIsolate()->GetCurrentContext()) |
| 567 .FromMaybe(-1); | 599 .FromMaybe(-1); |
| 568 if (index < 0 || index >= realm_count_ || realms_[index].IsEmpty()) { | 600 if (index < 0 || index >= realm_count_ || realms_[index].IsEmpty()) { |
| 569 Throw(args.GetIsolate(), "Invalid realm index"); | 601 Throw(args.GetIsolate(), "Invalid realm index"); |
| 570 return -1; | 602 return -1; |
| 571 } | 603 } |
| 572 return index; | 604 return index; |
| 573 } | 605 } |
| 574 | 606 |
| 575 | 607 |
| 608 #ifndef V8_SHARED |
| 576 // performance.now() returns a time stamp as double, measured in milliseconds. | 609 // performance.now() returns a time stamp as double, measured in milliseconds. |
| 577 // When FLAG_verify_predictable mode is enabled it returns result of | 610 // When FLAG_verify_predictable mode is enabled it returns result of |
| 578 // v8::Platform::MonotonicallyIncreasingTime(). | 611 // v8::Platform::MonotonicallyIncreasingTime(). |
| 579 void Shell::PerformanceNow(const v8::FunctionCallbackInfo<v8::Value>& args) { | 612 void Shell::PerformanceNow(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 580 if (i::FLAG_verify_predictable) { | 613 if (i::FLAG_verify_predictable) { |
| 581 args.GetReturnValue().Set(g_platform->MonotonicallyIncreasingTime()); | 614 args.GetReturnValue().Set(g_platform->MonotonicallyIncreasingTime()); |
| 582 } else { | 615 } else { |
| 583 base::TimeDelta delta = | 616 base::TimeDelta delta = |
| 584 base::TimeTicks::HighResolutionNow() - kInitialTicks; | 617 base::TimeTicks::HighResolutionNow() - kInitialTicks; |
| 585 args.GetReturnValue().Set(delta.InMillisecondsF()); | 618 args.GetReturnValue().Set(delta.InMillisecondsF()); |
| 586 } | 619 } |
| 587 } | 620 } |
| 621 #endif // !V8_SHARED |
| 588 | 622 |
| 589 | 623 |
| 590 // Realm.current() returns the index of the currently active realm. | 624 // Realm.current() returns the index of the currently active realm. |
| 591 void Shell::RealmCurrent(const v8::FunctionCallbackInfo<v8::Value>& args) { | 625 void Shell::RealmCurrent(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 592 Isolate* isolate = args.GetIsolate(); | 626 Isolate* isolate = args.GetIsolate(); |
| 593 PerIsolateData* data = PerIsolateData::Get(isolate); | 627 PerIsolateData* data = PerIsolateData::Get(isolate); |
| 594 int index = data->RealmFind(isolate->GetEnteredContext()); | 628 int index = data->RealmFind(isolate->GetEnteredContext()); |
| 595 if (index == -1) return; | 629 if (index == -1) return; |
| 596 args.GetReturnValue().Set(index); | 630 args.GetReturnValue().Set(index); |
| 597 } | 631 } |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 848 String::NewFromUtf8(args.GetIsolate(), *file, | 882 String::NewFromUtf8(args.GetIsolate(), *file, |
| 849 NewStringType::kNormal).ToLocalChecked(), | 883 NewStringType::kNormal).ToLocalChecked(), |
| 850 false, true)) { | 884 false, true)) { |
| 851 Throw(args.GetIsolate(), "Error executing file"); | 885 Throw(args.GetIsolate(), "Error executing file"); |
| 852 return; | 886 return; |
| 853 } | 887 } |
| 854 } | 888 } |
| 855 } | 889 } |
| 856 | 890 |
| 857 | 891 |
| 892 #ifndef V8_SHARED |
| 858 void Shell::WorkerNew(const v8::FunctionCallbackInfo<v8::Value>& args) { | 893 void Shell::WorkerNew(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 859 Isolate* isolate = args.GetIsolate(); | 894 Isolate* isolate = args.GetIsolate(); |
| 860 HandleScope handle_scope(isolate); | 895 HandleScope handle_scope(isolate); |
| 861 if (args.Length() < 1 || !args[0]->IsString()) { | 896 if (args.Length() < 1 || !args[0]->IsString()) { |
| 862 Throw(args.GetIsolate(), "1st argument must be string"); | 897 Throw(args.GetIsolate(), "1st argument must be string"); |
| 863 return; | 898 return; |
| 864 } | 899 } |
| 865 | 900 |
| 866 if (!args.IsConstructCall()) { | 901 if (!args.IsConstructCall()) { |
| 867 Throw(args.GetIsolate(), "Worker must be constructed with new"); | 902 Throw(args.GetIsolate(), "Worker must be constructed with new"); |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 969 void Shell::WorkerTerminate(const v8::FunctionCallbackInfo<v8::Value>& args) { | 1004 void Shell::WorkerTerminate(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 970 Isolate* isolate = args.GetIsolate(); | 1005 Isolate* isolate = args.GetIsolate(); |
| 971 HandleScope handle_scope(isolate); | 1006 HandleScope handle_scope(isolate); |
| 972 Worker* worker = GetWorkerFromInternalField(isolate, args.Holder()); | 1007 Worker* worker = GetWorkerFromInternalField(isolate, args.Holder()); |
| 973 if (!worker) { | 1008 if (!worker) { |
| 974 return; | 1009 return; |
| 975 } | 1010 } |
| 976 | 1011 |
| 977 worker->Terminate(); | 1012 worker->Terminate(); |
| 978 } | 1013 } |
| 1014 #endif // !V8_SHARED |
| 979 | 1015 |
| 980 | 1016 |
| 981 void Shell::QuitOnce(v8::FunctionCallbackInfo<v8::Value>* args) { | 1017 void Shell::QuitOnce(v8::FunctionCallbackInfo<v8::Value>* args) { |
| 982 int exit_code = (*args)[0] | 1018 int exit_code = (*args)[0] |
| 983 ->Int32Value(args->GetIsolate()->GetCurrentContext()) | 1019 ->Int32Value(args->GetIsolate()->GetCurrentContext()) |
| 984 .FromMaybe(0); | 1020 .FromMaybe(0); |
| 1021 #ifndef V8_SHARED |
| 985 CleanupWorkers(); | 1022 CleanupWorkers(); |
| 1023 #endif // !V8_SHARED |
| 986 OnExit(args->GetIsolate()); | 1024 OnExit(args->GetIsolate()); |
| 987 Exit(exit_code); | 1025 Exit(exit_code); |
| 988 } | 1026 } |
| 989 | 1027 |
| 990 | 1028 |
| 991 void Shell::Quit(const v8::FunctionCallbackInfo<v8::Value>& args) { | 1029 void Shell::Quit(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 992 base::CallOnce(&quit_once_, &QuitOnce, | 1030 base::CallOnce(&quit_once_, &QuitOnce, |
| 993 const_cast<v8::FunctionCallbackInfo<v8::Value>*>(&args)); | 1031 const_cast<v8::FunctionCallbackInfo<v8::Value>*>(&args)); |
| 994 } | 1032 } |
| 995 | 1033 |
| 996 | 1034 |
| 997 void Shell::Version(const v8::FunctionCallbackInfo<v8::Value>& args) { | 1035 void Shell::Version(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 998 args.GetReturnValue().Set( | 1036 args.GetReturnValue().Set( |
| 999 String::NewFromUtf8(args.GetIsolate(), V8::GetVersion(), | 1037 String::NewFromUtf8(args.GetIsolate(), V8::GetVersion(), |
| 1000 NewStringType::kNormal).ToLocalChecked()); | 1038 NewStringType::kNormal).ToLocalChecked()); |
| 1001 } | 1039 } |
| 1002 | 1040 |
| 1003 | 1041 |
| 1004 void Shell::ReportException(Isolate* isolate, v8::TryCatch* try_catch) { | 1042 void Shell::ReportException(Isolate* isolate, v8::TryCatch* try_catch) { |
| 1005 HandleScope handle_scope(isolate); | 1043 HandleScope handle_scope(isolate); |
| 1044 #ifndef V8_SHARED |
| 1006 Local<Context> context; | 1045 Local<Context> context; |
| 1007 bool enter_context = !isolate->InContext(); | 1046 bool enter_context = !isolate->InContext(); |
| 1008 if (enter_context) { | 1047 if (enter_context) { |
| 1009 context = Local<Context>::New(isolate, evaluation_context_); | 1048 context = Local<Context>::New(isolate, evaluation_context_); |
| 1010 context->Enter(); | 1049 context->Enter(); |
| 1011 } | 1050 } |
| 1051 #endif // !V8_SHARED |
| 1012 v8::String::Utf8Value exception(try_catch->Exception()); | 1052 v8::String::Utf8Value exception(try_catch->Exception()); |
| 1013 const char* exception_string = ToCString(exception); | 1053 const char* exception_string = ToCString(exception); |
| 1014 Local<Message> message = try_catch->Message(); | 1054 Local<Message> message = try_catch->Message(); |
| 1015 if (message.IsEmpty()) { | 1055 if (message.IsEmpty()) { |
| 1016 // V8 didn't provide any extra information about this error; just | 1056 // V8 didn't provide any extra information about this error; just |
| 1017 // print the exception. | 1057 // print the exception. |
| 1018 printf("%s\n", exception_string); | 1058 printf("%s\n", exception_string); |
| 1019 } else { | 1059 } else { |
| 1020 // Print (filename):(line number): (message). | 1060 // Print (filename):(line number): (message). |
| 1021 v8::String::Utf8Value filename(message->GetScriptOrigin().ResourceName()); | 1061 v8::String::Utf8Value filename(message->GetScriptOrigin().ResourceName()); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1045 Local<Value> stack_trace_string; | 1085 Local<Value> stack_trace_string; |
| 1046 if (try_catch->StackTrace(isolate->GetCurrentContext()) | 1086 if (try_catch->StackTrace(isolate->GetCurrentContext()) |
| 1047 .ToLocal(&stack_trace_string) && | 1087 .ToLocal(&stack_trace_string) && |
| 1048 stack_trace_string->IsString()) { | 1088 stack_trace_string->IsString()) { |
| 1049 v8::String::Utf8Value stack_trace( | 1089 v8::String::Utf8Value stack_trace( |
| 1050 Local<String>::Cast(stack_trace_string)); | 1090 Local<String>::Cast(stack_trace_string)); |
| 1051 printf("%s\n", ToCString(stack_trace)); | 1091 printf("%s\n", ToCString(stack_trace)); |
| 1052 } | 1092 } |
| 1053 } | 1093 } |
| 1054 printf("\n"); | 1094 printf("\n"); |
| 1095 #ifndef V8_SHARED |
| 1055 if (enter_context) context->Exit(); | 1096 if (enter_context) context->Exit(); |
| 1097 #endif // !V8_SHARED |
| 1056 } | 1098 } |
| 1057 | 1099 |
| 1058 | 1100 |
| 1101 #ifndef V8_SHARED |
| 1059 int32_t* Counter::Bind(const char* name, bool is_histogram) { | 1102 int32_t* Counter::Bind(const char* name, bool is_histogram) { |
| 1060 int i; | 1103 int i; |
| 1061 for (i = 0; i < kMaxNameSize - 1 && name[i]; i++) | 1104 for (i = 0; i < kMaxNameSize - 1 && name[i]; i++) |
| 1062 name_[i] = static_cast<char>(name[i]); | 1105 name_[i] = static_cast<char>(name[i]); |
| 1063 name_[i] = '\0'; | 1106 name_[i] = '\0'; |
| 1064 is_histogram_ = is_histogram; | 1107 is_histogram_ = is_histogram; |
| 1065 return ptr(); | 1108 return ptr(); |
| 1066 } | 1109 } |
| 1067 | 1110 |
| 1068 | 1111 |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1177 stringify_function_.Reset( | 1220 stringify_function_.Reset( |
| 1178 isolate, script->Run(context).ToLocalChecked().As<Function>()); | 1221 isolate, script->Run(context).ToLocalChecked().As<Function>()); |
| 1179 } | 1222 } |
| 1180 Local<Function> fun = Local<Function>::New(isolate, stringify_function_); | 1223 Local<Function> fun = Local<Function>::New(isolate, stringify_function_); |
| 1181 Local<Value> argv[1] = {value}; | 1224 Local<Value> argv[1] = {value}; |
| 1182 v8::TryCatch try_catch(isolate); | 1225 v8::TryCatch try_catch(isolate); |
| 1183 MaybeLocal<Value> result = fun->Call(context, Undefined(isolate), 1, argv); | 1226 MaybeLocal<Value> result = fun->Call(context, Undefined(isolate), 1, argv); |
| 1184 if (result.IsEmpty()) return String::Empty(isolate); | 1227 if (result.IsEmpty()) return String::Empty(isolate); |
| 1185 return result.ToLocalChecked().As<String>(); | 1228 return result.ToLocalChecked().As<String>(); |
| 1186 } | 1229 } |
| 1230 #endif // !V8_SHARED |
| 1187 | 1231 |
| 1188 | 1232 |
| 1189 Local<ObjectTemplate> Shell::CreateGlobalTemplate(Isolate* isolate) { | 1233 Local<ObjectTemplate> Shell::CreateGlobalTemplate(Isolate* isolate) { |
| 1190 Local<ObjectTemplate> global_template = ObjectTemplate::New(isolate); | 1234 Local<ObjectTemplate> global_template = ObjectTemplate::New(isolate); |
| 1191 global_template->Set( | 1235 global_template->Set( |
| 1192 String::NewFromUtf8(isolate, "print", NewStringType::kNormal) | 1236 String::NewFromUtf8(isolate, "print", NewStringType::kNormal) |
| 1193 .ToLocalChecked(), | 1237 .ToLocalChecked(), |
| 1194 FunctionTemplate::New(isolate, Print)); | 1238 FunctionTemplate::New(isolate, Print)); |
| 1195 global_template->Set( | 1239 global_template->Set( |
| 1196 String::NewFromUtf8(isolate, "write", NewStringType::kNormal) | 1240 String::NewFromUtf8(isolate, "write", NewStringType::kNormal) |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1267 FunctionTemplate::New(isolate, RealmEval)); | 1311 FunctionTemplate::New(isolate, RealmEval)); |
| 1268 realm_template->SetAccessor( | 1312 realm_template->SetAccessor( |
| 1269 String::NewFromUtf8(isolate, "shared", NewStringType::kNormal) | 1313 String::NewFromUtf8(isolate, "shared", NewStringType::kNormal) |
| 1270 .ToLocalChecked(), | 1314 .ToLocalChecked(), |
| 1271 RealmSharedGet, RealmSharedSet); | 1315 RealmSharedGet, RealmSharedSet); |
| 1272 global_template->Set( | 1316 global_template->Set( |
| 1273 String::NewFromUtf8(isolate, "Realm", NewStringType::kNormal) | 1317 String::NewFromUtf8(isolate, "Realm", NewStringType::kNormal) |
| 1274 .ToLocalChecked(), | 1318 .ToLocalChecked(), |
| 1275 realm_template); | 1319 realm_template); |
| 1276 | 1320 |
| 1321 #ifndef V8_SHARED |
| 1277 Local<ObjectTemplate> performance_template = ObjectTemplate::New(isolate); | 1322 Local<ObjectTemplate> performance_template = ObjectTemplate::New(isolate); |
| 1278 performance_template->Set( | 1323 performance_template->Set( |
| 1279 String::NewFromUtf8(isolate, "now", NewStringType::kNormal) | 1324 String::NewFromUtf8(isolate, "now", NewStringType::kNormal) |
| 1280 .ToLocalChecked(), | 1325 .ToLocalChecked(), |
| 1281 FunctionTemplate::New(isolate, PerformanceNow)); | 1326 FunctionTemplate::New(isolate, PerformanceNow)); |
| 1282 global_template->Set( | 1327 global_template->Set( |
| 1283 String::NewFromUtf8(isolate, "performance", NewStringType::kNormal) | 1328 String::NewFromUtf8(isolate, "performance", NewStringType::kNormal) |
| 1284 .ToLocalChecked(), | 1329 .ToLocalChecked(), |
| 1285 performance_template); | 1330 performance_template); |
| 1286 | 1331 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1305 worker_fun_template->PrototypeTemplate()->Set( | 1350 worker_fun_template->PrototypeTemplate()->Set( |
| 1306 String::NewFromUtf8(isolate, "getMessage", NewStringType::kNormal) | 1351 String::NewFromUtf8(isolate, "getMessage", NewStringType::kNormal) |
| 1307 .ToLocalChecked(), | 1352 .ToLocalChecked(), |
| 1308 FunctionTemplate::New(isolate, WorkerGetMessage, Local<Value>(), | 1353 FunctionTemplate::New(isolate, WorkerGetMessage, Local<Value>(), |
| 1309 worker_signature)); | 1354 worker_signature)); |
| 1310 worker_fun_template->InstanceTemplate()->SetInternalFieldCount(1); | 1355 worker_fun_template->InstanceTemplate()->SetInternalFieldCount(1); |
| 1311 global_template->Set( | 1356 global_template->Set( |
| 1312 String::NewFromUtf8(isolate, "Worker", NewStringType::kNormal) | 1357 String::NewFromUtf8(isolate, "Worker", NewStringType::kNormal) |
| 1313 .ToLocalChecked(), | 1358 .ToLocalChecked(), |
| 1314 worker_fun_template); | 1359 worker_fun_template); |
| 1360 #endif // !V8_SHARED |
| 1315 | 1361 |
| 1316 Local<ObjectTemplate> os_templ = ObjectTemplate::New(isolate); | 1362 Local<ObjectTemplate> os_templ = ObjectTemplate::New(isolate); |
| 1317 AddOSMethods(isolate, os_templ); | 1363 AddOSMethods(isolate, os_templ); |
| 1318 global_template->Set( | 1364 global_template->Set( |
| 1319 String::NewFromUtf8(isolate, "os", NewStringType::kNormal) | 1365 String::NewFromUtf8(isolate, "os", NewStringType::kNormal) |
| 1320 .ToLocalChecked(), | 1366 .ToLocalChecked(), |
| 1321 os_templ); | 1367 os_templ); |
| 1322 | 1368 |
| 1323 return global_template; | 1369 return global_template; |
| 1324 } | 1370 } |
| 1325 | 1371 |
| 1326 static void EmptyMessageCallback(Local<Message> message, Local<Value> error) { | 1372 static void EmptyMessageCallback(Local<Message> message, Local<Value> error) { |
| 1327 // Nothing to be done here, exceptions thrown up to the shell will be reported | 1373 // Nothing to be done here, exceptions thrown up to the shell will be reported |
| 1328 // separately by {Shell::ReportException} after they are caught. | 1374 // separately by {Shell::ReportException} after they are caught. |
| 1329 } | 1375 } |
| 1330 | 1376 |
| 1331 void Shell::Initialize(Isolate* isolate) { | 1377 void Shell::Initialize(Isolate* isolate) { |
| 1378 #ifndef V8_SHARED |
| 1332 // Set up counters | 1379 // Set up counters |
| 1333 if (i::StrLength(i::FLAG_map_counters) != 0) | 1380 if (i::StrLength(i::FLAG_map_counters) != 0) |
| 1334 MapCounters(isolate, i::FLAG_map_counters); | 1381 MapCounters(isolate, i::FLAG_map_counters); |
| 1382 #endif // !V8_SHARED |
| 1335 // Disable default message reporting. | 1383 // Disable default message reporting. |
| 1336 isolate->AddMessageListener(EmptyMessageCallback); | 1384 isolate->AddMessageListener(EmptyMessageCallback); |
| 1337 } | 1385 } |
| 1338 | 1386 |
| 1339 | 1387 |
| 1340 Local<Context> Shell::CreateEvaluationContext(Isolate* isolate) { | 1388 Local<Context> Shell::CreateEvaluationContext(Isolate* isolate) { |
| 1389 #ifndef V8_SHARED |
| 1341 // This needs to be a critical section since this is not thread-safe | 1390 // This needs to be a critical section since this is not thread-safe |
| 1342 base::LockGuard<base::Mutex> lock_guard(context_mutex_.Pointer()); | 1391 base::LockGuard<base::Mutex> lock_guard(context_mutex_.Pointer()); |
| 1392 #endif // !V8_SHARED |
| 1343 // Initialize the global objects | 1393 // Initialize the global objects |
| 1344 Local<ObjectTemplate> global_template = CreateGlobalTemplate(isolate); | 1394 Local<ObjectTemplate> global_template = CreateGlobalTemplate(isolate); |
| 1345 EscapableHandleScope handle_scope(isolate); | 1395 EscapableHandleScope handle_scope(isolate); |
| 1346 Local<Context> context = Context::New(isolate, NULL, global_template); | 1396 Local<Context> context = Context::New(isolate, NULL, global_template); |
| 1347 DCHECK(!context.IsEmpty()); | 1397 DCHECK(!context.IsEmpty()); |
| 1348 Context::Scope scope(context); | 1398 Context::Scope scope(context); |
| 1349 | 1399 |
| 1400 #ifndef V8_SHARED |
| 1350 i::Factory* factory = reinterpret_cast<i::Isolate*>(isolate)->factory(); | 1401 i::Factory* factory = reinterpret_cast<i::Isolate*>(isolate)->factory(); |
| 1351 i::JSArguments js_args = i::FLAG_js_arguments; | 1402 i::JSArguments js_args = i::FLAG_js_arguments; |
| 1352 i::Handle<i::FixedArray> arguments_array = | 1403 i::Handle<i::FixedArray> arguments_array = |
| 1353 factory->NewFixedArray(js_args.argc); | 1404 factory->NewFixedArray(js_args.argc); |
| 1354 for (int j = 0; j < js_args.argc; j++) { | 1405 for (int j = 0; j < js_args.argc; j++) { |
| 1355 i::Handle<i::String> arg = | 1406 i::Handle<i::String> arg = |
| 1356 factory->NewStringFromUtf8(i::CStrVector(js_args[j])).ToHandleChecked(); | 1407 factory->NewStringFromUtf8(i::CStrVector(js_args[j])).ToHandleChecked(); |
| 1357 arguments_array->set(j, *arg); | 1408 arguments_array->set(j, *arg); |
| 1358 } | 1409 } |
| 1359 i::Handle<i::JSArray> arguments_jsarray = | 1410 i::Handle<i::JSArray> arguments_jsarray = |
| 1360 factory->NewJSArrayWithElements(arguments_array); | 1411 factory->NewJSArrayWithElements(arguments_array); |
| 1361 context->Global() | 1412 context->Global() |
| 1362 ->Set(context, | 1413 ->Set(context, |
| 1363 String::NewFromUtf8(isolate, "arguments", NewStringType::kNormal) | 1414 String::NewFromUtf8(isolate, "arguments", NewStringType::kNormal) |
| 1364 .ToLocalChecked(), | 1415 .ToLocalChecked(), |
| 1365 Utils::ToLocal(arguments_jsarray)) | 1416 Utils::ToLocal(arguments_jsarray)) |
| 1366 .FromJust(); | 1417 .FromJust(); |
| 1418 #endif // !V8_SHARED |
| 1367 return handle_scope.Escape(context); | 1419 return handle_scope.Escape(context); |
| 1368 } | 1420 } |
| 1369 | 1421 |
| 1370 | 1422 |
| 1371 void Shell::Exit(int exit_code) { | 1423 void Shell::Exit(int exit_code) { |
| 1372 // Use _exit instead of exit to avoid races between isolate | 1424 // Use _exit instead of exit to avoid races between isolate |
| 1373 // threads and static destructors. | 1425 // threads and static destructors. |
| 1374 fflush(stdout); | 1426 fflush(stdout); |
| 1375 fflush(stderr); | 1427 fflush(stderr); |
| 1376 _exit(exit_code); | 1428 _exit(exit_code); |
| 1377 } | 1429 } |
| 1378 | 1430 |
| 1379 | 1431 |
| 1432 #ifndef V8_SHARED |
| 1380 struct CounterAndKey { | 1433 struct CounterAndKey { |
| 1381 Counter* counter; | 1434 Counter* counter; |
| 1382 const char* key; | 1435 const char* key; |
| 1383 }; | 1436 }; |
| 1384 | 1437 |
| 1385 | 1438 |
| 1386 inline bool operator<(const CounterAndKey& lhs, const CounterAndKey& rhs) { | 1439 inline bool operator<(const CounterAndKey& lhs, const CounterAndKey& rhs) { |
| 1387 return strcmp(lhs.key, rhs.key) < 0; | 1440 return strcmp(lhs.key, rhs.key) < 0; |
| 1388 } | 1441 } |
| 1389 | 1442 |
| 1390 void Shell::WriteIgnitionDispatchCountersFile(v8::Isolate* isolate) { | 1443 void Shell::WriteIgnitionDispatchCountersFile(v8::Isolate* isolate) { |
| 1391 HandleScope handle_scope(isolate); | 1444 HandleScope handle_scope(isolate); |
| 1392 Local<Context> context = Context::New(isolate); | 1445 Local<Context> context = Context::New(isolate); |
| 1393 Context::Scope context_scope(context); | 1446 Context::Scope context_scope(context); |
| 1394 | 1447 |
| 1395 Local<Object> dispatch_counters = reinterpret_cast<i::Isolate*>(isolate) | 1448 Local<Object> dispatch_counters = reinterpret_cast<i::Isolate*>(isolate) |
| 1396 ->interpreter() | 1449 ->interpreter() |
| 1397 ->GetDispatchCountersObject(); | 1450 ->GetDispatchCountersObject(); |
| 1398 std::ofstream dispatch_counters_stream( | 1451 std::ofstream dispatch_counters_stream( |
| 1399 i::FLAG_trace_ignition_dispatches_output_file); | 1452 i::FLAG_trace_ignition_dispatches_output_file); |
| 1400 dispatch_counters_stream << *String::Utf8Value( | 1453 dispatch_counters_stream << *String::Utf8Value( |
| 1401 JSON::Stringify(context, dispatch_counters).ToLocalChecked()); | 1454 JSON::Stringify(context, dispatch_counters).ToLocalChecked()); |
| 1402 } | 1455 } |
| 1403 | 1456 |
| 1457 #endif // !V8_SHARED |
| 1458 |
| 1404 | 1459 |
| 1405 void Shell::OnExit(v8::Isolate* isolate) { | 1460 void Shell::OnExit(v8::Isolate* isolate) { |
| 1461 #ifndef V8_SHARED |
| 1406 if (i::FLAG_dump_counters) { | 1462 if (i::FLAG_dump_counters) { |
| 1407 int number_of_counters = 0; | 1463 int number_of_counters = 0; |
| 1408 for (CounterMap::Iterator i(counter_map_); i.More(); i.Next()) { | 1464 for (CounterMap::Iterator i(counter_map_); i.More(); i.Next()) { |
| 1409 number_of_counters++; | 1465 number_of_counters++; |
| 1410 } | 1466 } |
| 1411 CounterAndKey* counters = new CounterAndKey[number_of_counters]; | 1467 CounterAndKey* counters = new CounterAndKey[number_of_counters]; |
| 1412 int j = 0; | 1468 int j = 0; |
| 1413 for (CounterMap::Iterator i(counter_map_); i.More(); i.Next(), j++) { | 1469 for (CounterMap::Iterator i(counter_map_); i.More(); i.Next(), j++) { |
| 1414 counters[j].counter = i.CurrentValue(); | 1470 counters[j].counter = i.CurrentValue(); |
| 1415 counters[j].key = i.CurrentKey(); | 1471 counters[j].key = i.CurrentKey(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1431 printf("| %-62s | %11i |\n", key, counter->count()); | 1487 printf("| %-62s | %11i |\n", key, counter->count()); |
| 1432 } | 1488 } |
| 1433 } | 1489 } |
| 1434 printf("+----------------------------------------------------------------+" | 1490 printf("+----------------------------------------------------------------+" |
| 1435 "-------------+\n"); | 1491 "-------------+\n"); |
| 1436 delete [] counters; | 1492 delete [] counters; |
| 1437 } | 1493 } |
| 1438 | 1494 |
| 1439 delete counters_file_; | 1495 delete counters_file_; |
| 1440 delete counter_map_; | 1496 delete counter_map_; |
| 1497 #endif // !V8_SHARED |
| 1441 } | 1498 } |
| 1442 | 1499 |
| 1443 | 1500 |
| 1444 | 1501 |
| 1445 static FILE* FOpen(const char* path, const char* mode) { | 1502 static FILE* FOpen(const char* path, const char* mode) { |
| 1446 #if defined(_MSC_VER) && (defined(_WIN32) || defined(_WIN64)) | 1503 #if defined(_MSC_VER) && (defined(_WIN32) || defined(_WIN64)) |
| 1447 FILE* result; | 1504 FILE* result; |
| 1448 if (fopen_s(&result, path, mode) == 0) { | 1505 if (fopen_s(&result, path, mode) == 0) { |
| 1449 return result; | 1506 return result; |
| 1450 } else { | 1507 } else { |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1564 printf("d8> "); | 1621 printf("d8> "); |
| 1565 Local<String> input = Shell::ReadFromStdin(isolate); | 1622 Local<String> input = Shell::ReadFromStdin(isolate); |
| 1566 if (input.IsEmpty()) break; | 1623 if (input.IsEmpty()) break; |
| 1567 ExecuteString(isolate, input, name, true, true); | 1624 ExecuteString(isolate, input, name, true, true); |
| 1568 } | 1625 } |
| 1569 printf("\n"); | 1626 printf("\n"); |
| 1570 } | 1627 } |
| 1571 | 1628 |
| 1572 | 1629 |
| 1573 SourceGroup::~SourceGroup() { | 1630 SourceGroup::~SourceGroup() { |
| 1631 #ifndef V8_SHARED |
| 1574 delete thread_; | 1632 delete thread_; |
| 1575 thread_ = NULL; | 1633 thread_ = NULL; |
| 1634 #endif // !V8_SHARED |
| 1576 } | 1635 } |
| 1577 | 1636 |
| 1578 | 1637 |
| 1579 void SourceGroup::Execute(Isolate* isolate) { | 1638 void SourceGroup::Execute(Isolate* isolate) { |
| 1580 bool exception_was_thrown = false; | 1639 bool exception_was_thrown = false; |
| 1581 for (int i = begin_offset_; i < end_offset_; ++i) { | 1640 for (int i = begin_offset_; i < end_offset_; ++i) { |
| 1582 const char* arg = argv_[i]; | 1641 const char* arg = argv_[i]; |
| 1583 Shell::SourceType source_type = Shell::SCRIPT; | 1642 Shell::SourceType source_type = Shell::SCRIPT; |
| 1584 if (strcmp(arg, "-e") == 0 && i + 1 < end_offset_) { | 1643 if (strcmp(arg, "-e") == 0 && i + 1 < end_offset_) { |
| 1585 // Execute argument given to -e option directly. | 1644 // Execute argument given to -e option directly. |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1634 char* chars = ReadChars(isolate, name, &size); | 1693 char* chars = ReadChars(isolate, name, &size); |
| 1635 if (chars == NULL) return Local<String>(); | 1694 if (chars == NULL) return Local<String>(); |
| 1636 Local<String> result = | 1695 Local<String> result = |
| 1637 String::NewFromUtf8(isolate, chars, NewStringType::kNormal, size) | 1696 String::NewFromUtf8(isolate, chars, NewStringType::kNormal, size) |
| 1638 .ToLocalChecked(); | 1697 .ToLocalChecked(); |
| 1639 delete[] chars; | 1698 delete[] chars; |
| 1640 return result; | 1699 return result; |
| 1641 } | 1700 } |
| 1642 | 1701 |
| 1643 | 1702 |
| 1703 #ifndef V8_SHARED |
| 1644 base::Thread::Options SourceGroup::GetThreadOptions() { | 1704 base::Thread::Options SourceGroup::GetThreadOptions() { |
| 1645 // On some systems (OSX 10.6) the stack size default is 0.5Mb or less | 1705 // On some systems (OSX 10.6) the stack size default is 0.5Mb or less |
| 1646 // which is not enough to parse the big literal expressions used in tests. | 1706 // which is not enough to parse the big literal expressions used in tests. |
| 1647 // The stack size should be at least StackGuard::kLimitSize + some | 1707 // The stack size should be at least StackGuard::kLimitSize + some |
| 1648 // OS-specific padding for thread startup code. 2Mbytes seems to be enough. | 1708 // OS-specific padding for thread startup code. 2Mbytes seems to be enough. |
| 1649 return base::Thread::Options("IsolateThread", 2 * MB); | 1709 return base::Thread::Options("IsolateThread", 2 * MB); |
| 1650 } | 1710 } |
| 1651 | 1711 |
| 1652 | 1712 |
| 1653 void SourceGroup::ExecuteInThread() { | 1713 void SourceGroup::ExecuteInThread() { |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1957 data)) { | 2017 data)) { |
| 1958 DCHECK(args.Data()->IsExternal()); | 2018 DCHECK(args.Data()->IsExternal()); |
| 1959 Local<External> this_value = Local<External>::Cast(args.Data()); | 2019 Local<External> this_value = Local<External>::Cast(args.Data()); |
| 1960 Worker* worker = static_cast<Worker*>(this_value->Value()); | 2020 Worker* worker = static_cast<Worker*>(this_value->Value()); |
| 1961 worker->out_queue_.Enqueue(data); | 2021 worker->out_queue_.Enqueue(data); |
| 1962 worker->out_semaphore_.Signal(); | 2022 worker->out_semaphore_.Signal(); |
| 1963 } else { | 2023 } else { |
| 1964 delete data; | 2024 delete data; |
| 1965 } | 2025 } |
| 1966 } | 2026 } |
| 2027 #endif // !V8_SHARED |
| 1967 | 2028 |
| 1968 | 2029 |
| 1969 void SetFlagsFromString(const char* flags) { | 2030 void SetFlagsFromString(const char* flags) { |
| 1970 v8::V8::SetFlagsFromString(flags, static_cast<int>(strlen(flags))); | 2031 v8::V8::SetFlagsFromString(flags, static_cast<int>(strlen(flags))); |
| 1971 } | 2032 } |
| 1972 | 2033 |
| 1973 | 2034 |
| 1974 bool Shell::SetOptions(int argc, char* argv[]) { | 2035 bool Shell::SetOptions(int argc, char* argv[]) { |
| 1975 bool logfile_per_isolate = false; | 2036 bool logfile_per_isolate = false; |
| 1976 for (int i = 0; i < argc; i++) { | 2037 for (int i = 0; i < argc; i++) { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2012 options.send_idle_notification = true; | 2073 options.send_idle_notification = true; |
| 2013 argv[i] = NULL; | 2074 argv[i] = NULL; |
| 2014 } else if (strcmp(argv[i], "--omit-quit") == 0) { | 2075 } else if (strcmp(argv[i], "--omit-quit") == 0) { |
| 2015 options.omit_quit = true; | 2076 options.omit_quit = true; |
| 2016 argv[i] = NULL; | 2077 argv[i] = NULL; |
| 2017 } else if (strcmp(argv[i], "-f") == 0) { | 2078 } else if (strcmp(argv[i], "-f") == 0) { |
| 2018 // Ignore any -f flags for compatibility with other stand-alone | 2079 // Ignore any -f flags for compatibility with other stand-alone |
| 2019 // JavaScript engines. | 2080 // JavaScript engines. |
| 2020 continue; | 2081 continue; |
| 2021 } else if (strcmp(argv[i], "--isolate") == 0) { | 2082 } else if (strcmp(argv[i], "--isolate") == 0) { |
| 2083 #ifdef V8_SHARED |
| 2084 printf("D8 with shared library does not support multi-threading\n"); |
| 2085 return false; |
| 2086 #endif // V8_SHARED |
| 2022 options.num_isolates++; | 2087 options.num_isolates++; |
| 2023 } else if (strcmp(argv[i], "--dump-heap-constants") == 0) { | 2088 } else if (strcmp(argv[i], "--dump-heap-constants") == 0) { |
| 2089 #ifdef V8_SHARED |
| 2090 printf("D8 with shared library does not support constant dumping\n"); |
| 2091 return false; |
| 2092 #else |
| 2024 options.dump_heap_constants = true; | 2093 options.dump_heap_constants = true; |
| 2025 argv[i] = NULL; | 2094 argv[i] = NULL; |
| 2095 #endif // V8_SHARED |
| 2026 } else if (strcmp(argv[i], "--throws") == 0) { | 2096 } else if (strcmp(argv[i], "--throws") == 0) { |
| 2027 options.expected_to_throw = true; | 2097 options.expected_to_throw = true; |
| 2028 argv[i] = NULL; | 2098 argv[i] = NULL; |
| 2029 } else if (strncmp(argv[i], "--icu-data-file=", 16) == 0) { | 2099 } else if (strncmp(argv[i], "--icu-data-file=", 16) == 0) { |
| 2030 options.icu_data_file = argv[i] + 16; | 2100 options.icu_data_file = argv[i] + 16; |
| 2031 argv[i] = NULL; | 2101 argv[i] = NULL; |
| 2102 #ifdef V8_SHARED |
| 2103 } else if (strcmp(argv[i], "--dump-counters") == 0) { |
| 2104 printf("D8 with shared library does not include counters\n"); |
| 2105 return false; |
| 2106 #endif // V8_SHARED |
| 2032 #ifdef V8_USE_EXTERNAL_STARTUP_DATA | 2107 #ifdef V8_USE_EXTERNAL_STARTUP_DATA |
| 2033 } else if (strncmp(argv[i], "--natives_blob=", 15) == 0) { | 2108 } else if (strncmp(argv[i], "--natives_blob=", 15) == 0) { |
| 2034 options.natives_blob = argv[i] + 15; | 2109 options.natives_blob = argv[i] + 15; |
| 2035 argv[i] = NULL; | 2110 argv[i] = NULL; |
| 2036 } else if (strncmp(argv[i], "--snapshot_blob=", 16) == 0) { | 2111 } else if (strncmp(argv[i], "--snapshot_blob=", 16) == 0) { |
| 2037 options.snapshot_blob = argv[i] + 16; | 2112 options.snapshot_blob = argv[i] + 16; |
| 2038 argv[i] = NULL; | 2113 argv[i] = NULL; |
| 2039 #endif // V8_USE_EXTERNAL_STARTUP_DATA | 2114 #endif // V8_USE_EXTERNAL_STARTUP_DATA |
| 2040 } else if (strcmp(argv[i], "--cache") == 0 || | 2115 } else if (strcmp(argv[i], "--cache") == 0 || |
| 2041 strncmp(argv[i], "--cache=", 8) == 0) { | 2116 strncmp(argv[i], "--cache=", 8) == 0) { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2087 | 2162 |
| 2088 if (!logfile_per_isolate && options.num_isolates) { | 2163 if (!logfile_per_isolate && options.num_isolates) { |
| 2089 SetFlagsFromString("--nologfile_per_isolate"); | 2164 SetFlagsFromString("--nologfile_per_isolate"); |
| 2090 } | 2165 } |
| 2091 | 2166 |
| 2092 return true; | 2167 return true; |
| 2093 } | 2168 } |
| 2094 | 2169 |
| 2095 | 2170 |
| 2096 int Shell::RunMain(Isolate* isolate, int argc, char* argv[], bool last_run) { | 2171 int Shell::RunMain(Isolate* isolate, int argc, char* argv[], bool last_run) { |
| 2172 #ifndef V8_SHARED |
| 2097 for (int i = 1; i < options.num_isolates; ++i) { | 2173 for (int i = 1; i < options.num_isolates; ++i) { |
| 2098 options.isolate_sources[i].StartExecuteInThread(); | 2174 options.isolate_sources[i].StartExecuteInThread(); |
| 2099 } | 2175 } |
| 2176 #endif // !V8_SHARED |
| 2100 { | 2177 { |
| 2101 HandleScope scope(isolate); | 2178 HandleScope scope(isolate); |
| 2102 Local<Context> context = CreateEvaluationContext(isolate); | 2179 Local<Context> context = CreateEvaluationContext(isolate); |
| 2103 if (last_run && options.use_interactive_shell()) { | 2180 if (last_run && options.use_interactive_shell()) { |
| 2104 // Keep using the same context in the interactive shell. | 2181 // Keep using the same context in the interactive shell. |
| 2105 evaluation_context_.Reset(isolate, context); | 2182 evaluation_context_.Reset(isolate, context); |
| 2106 } | 2183 } |
| 2107 { | 2184 { |
| 2108 Context::Scope cscope(context); | 2185 Context::Scope cscope(context); |
| 2109 PerIsolateData::RealmScope realm_scope(PerIsolateData::Get(isolate)); | 2186 PerIsolateData::RealmScope realm_scope(PerIsolateData::Get(isolate)); |
| 2110 options.isolate_sources[0].Execute(isolate); | 2187 options.isolate_sources[0].Execute(isolate); |
| 2111 } | 2188 } |
| 2112 } | 2189 } |
| 2113 CollectGarbage(isolate); | 2190 CollectGarbage(isolate); |
| 2191 #ifndef V8_SHARED |
| 2114 for (int i = 1; i < options.num_isolates; ++i) { | 2192 for (int i = 1; i < options.num_isolates; ++i) { |
| 2115 if (last_run) { | 2193 if (last_run) { |
| 2116 options.isolate_sources[i].JoinThread(); | 2194 options.isolate_sources[i].JoinThread(); |
| 2117 } else { | 2195 } else { |
| 2118 options.isolate_sources[i].WaitForThread(); | 2196 options.isolate_sources[i].WaitForThread(); |
| 2119 } | 2197 } |
| 2120 } | 2198 } |
| 2121 CleanupWorkers(); | 2199 CleanupWorkers(); |
| 2200 #endif // !V8_SHARED |
| 2122 return 0; | 2201 return 0; |
| 2123 } | 2202 } |
| 2124 | 2203 |
| 2125 | 2204 |
| 2126 void Shell::CollectGarbage(Isolate* isolate) { | 2205 void Shell::CollectGarbage(Isolate* isolate) { |
| 2127 if (options.send_idle_notification) { | 2206 if (options.send_idle_notification) { |
| 2128 const double kLongIdlePauseInSeconds = 1.0; | 2207 const double kLongIdlePauseInSeconds = 1.0; |
| 2129 isolate->ContextDisposedNotification(); | 2208 isolate->ContextDisposedNotification(); |
| 2130 isolate->IdleNotificationDeadline( | 2209 isolate->IdleNotificationDeadline( |
| 2131 g_platform->MonotonicallyIncreasingTime() + kLongIdlePauseInSeconds); | 2210 g_platform->MonotonicallyIncreasingTime() + kLongIdlePauseInSeconds); |
| 2132 } | 2211 } |
| 2133 if (options.invoke_weak_callbacks) { | 2212 if (options.invoke_weak_callbacks) { |
| 2134 // By sending a low memory notifications, we will try hard to collect all | 2213 // By sending a low memory notifications, we will try hard to collect all |
| 2135 // garbage and will therefore also invoke all weak callbacks of actually | 2214 // garbage and will therefore also invoke all weak callbacks of actually |
| 2136 // unreachable persistent handles. | 2215 // unreachable persistent handles. |
| 2137 isolate->LowMemoryNotification(); | 2216 isolate->LowMemoryNotification(); |
| 2138 } | 2217 } |
| 2139 } | 2218 } |
| 2140 | 2219 |
| 2141 | 2220 |
| 2142 void Shell::EmptyMessageQueues(Isolate* isolate) { | 2221 void Shell::EmptyMessageQueues(Isolate* isolate) { |
| 2222 #ifndef V8_SHARED |
| 2143 if (!i::FLAG_verify_predictable) { | 2223 if (!i::FLAG_verify_predictable) { |
| 2224 #endif |
| 2144 while (v8::platform::PumpMessageLoop(g_platform, isolate)) continue; | 2225 while (v8::platform::PumpMessageLoop(g_platform, isolate)) continue; |
| 2226 #ifndef V8_SHARED |
| 2145 } | 2227 } |
| 2228 #endif |
| 2146 } | 2229 } |
| 2147 | 2230 |
| 2148 | 2231 |
| 2232 #ifndef V8_SHARED |
| 2149 bool Shell::SerializeValue(Isolate* isolate, Local<Value> value, | 2233 bool Shell::SerializeValue(Isolate* isolate, Local<Value> value, |
| 2150 const ObjectList& to_transfer, | 2234 const ObjectList& to_transfer, |
| 2151 ObjectList* seen_objects, | 2235 ObjectList* seen_objects, |
| 2152 SerializationData* out_data) { | 2236 SerializationData* out_data) { |
| 2153 DCHECK(out_data); | 2237 DCHECK(out_data); |
| 2154 Local<Context> context = isolate->GetCurrentContext(); | 2238 Local<Context> context = isolate->GetCurrentContext(); |
| 2155 | 2239 |
| 2156 if (value->IsUndefined()) { | 2240 if (value->IsUndefined()) { |
| 2157 out_data->WriteTag(kSerializationTagUndefined); | 2241 out_data->WriteTag(kSerializationTagUndefined); |
| 2158 } else if (value->IsNull()) { | 2242 } else if (value->IsNull()) { |
| (...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2453 const char* n = NULL; | 2537 const char* n = NULL; |
| 2454 intptr_t p = reinterpret_cast<intptr_t>(o) & 0xfffff; | 2538 intptr_t p = reinterpret_cast<intptr_t>(o) & 0xfffff; |
| 2455 ROOT_LIST(ROOT_LIST_CASE) | 2539 ROOT_LIST(ROOT_LIST_CASE) |
| 2456 if (n == NULL) continue; | 2540 if (n == NULL) continue; |
| 2457 printf(" (\"%s\", 0x%05" V8PRIxPTR "): \"%s\",\n", sname, p, n); | 2541 printf(" (\"%s\", 0x%05" V8PRIxPTR "): \"%s\",\n", sname, p, n); |
| 2458 } | 2542 } |
| 2459 } | 2543 } |
| 2460 printf("}\n"); | 2544 printf("}\n"); |
| 2461 #undef ROOT_LIST_CASE | 2545 #undef ROOT_LIST_CASE |
| 2462 } | 2546 } |
| 2547 #endif // !V8_SHARED |
| 2463 | 2548 |
| 2464 | 2549 |
| 2465 int Shell::Main(int argc, char* argv[]) { | 2550 int Shell::Main(int argc, char* argv[]) { |
| 2466 std::ofstream trace_file; | 2551 std::ofstream trace_file; |
| 2552 #ifndef V8_SHARED |
| 2467 v8::base::debug::EnableInProcessStackDumping(); | 2553 v8::base::debug::EnableInProcessStackDumping(); |
| 2554 #endif |
| 2468 #if (defined(_WIN32) || defined(_WIN64)) | 2555 #if (defined(_WIN32) || defined(_WIN64)) |
| 2469 UINT new_flags = | 2556 UINT new_flags = |
| 2470 SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX; | 2557 SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX; |
| 2471 UINT existing_flags = SetErrorMode(new_flags); | 2558 UINT existing_flags = SetErrorMode(new_flags); |
| 2472 SetErrorMode(existing_flags | new_flags); | 2559 SetErrorMode(existing_flags | new_flags); |
| 2473 #if defined(_MSC_VER) | 2560 #if defined(_MSC_VER) |
| 2474 _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_FILE); | 2561 _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_FILE); |
| 2475 _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); | 2562 _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); |
| 2476 _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_FILE); | 2563 _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_FILE); |
| 2477 _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR); | 2564 _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR); |
| 2478 _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_FILE); | 2565 _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_FILE); |
| 2479 _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR); | 2566 _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR); |
| 2480 _set_error_mode(_OUT_TO_STDERR); | 2567 _set_error_mode(_OUT_TO_STDERR); |
| 2481 #endif // defined(_MSC_VER) | 2568 #endif // defined(_MSC_VER) |
| 2482 #endif // defined(_WIN32) || defined(_WIN64) | 2569 #endif // defined(_WIN32) || defined(_WIN64) |
| 2483 if (!SetOptions(argc, argv)) return 1; | 2570 if (!SetOptions(argc, argv)) return 1; |
| 2484 v8::V8::InitializeICUDefaultLocation(argv[0], options.icu_data_file); | 2571 v8::V8::InitializeICUDefaultLocation(argv[0], options.icu_data_file); |
| 2572 #ifndef V8_SHARED |
| 2485 g_platform = i::FLAG_verify_predictable | 2573 g_platform = i::FLAG_verify_predictable |
| 2486 ? new PredictablePlatform() | 2574 ? new PredictablePlatform() |
| 2487 : v8::platform::CreateDefaultPlatform(); | 2575 : v8::platform::CreateDefaultPlatform(); |
| 2576 #else |
| 2577 g_platform = v8::platform::CreateDefaultPlatform(); |
| 2578 #endif // !V8_SHARED |
| 2488 | 2579 |
| 2489 v8::V8::InitializePlatform(g_platform); | 2580 v8::V8::InitializePlatform(g_platform); |
| 2490 v8::V8::Initialize(); | 2581 v8::V8::Initialize(); |
| 2491 if (options.natives_blob || options.snapshot_blob) { | 2582 if (options.natives_blob || options.snapshot_blob) { |
| 2492 v8::V8::InitializeExternalStartupData(options.natives_blob, | 2583 v8::V8::InitializeExternalStartupData(options.natives_blob, |
| 2493 options.snapshot_blob); | 2584 options.snapshot_blob); |
| 2494 } else { | 2585 } else { |
| 2495 v8::V8::InitializeExternalStartupData(argv[0]); | 2586 v8::V8::InitializeExternalStartupData(argv[0]); |
| 2496 } | 2587 } |
| 2497 SetFlagsFromString("--trace-hydrogen-file=hydrogen.cfg"); | 2588 SetFlagsFromString("--trace-hydrogen-file=hydrogen.cfg"); |
| 2498 SetFlagsFromString("--trace-turbo-cfg-file=turbo.cfg"); | 2589 SetFlagsFromString("--trace-turbo-cfg-file=turbo.cfg"); |
| 2499 SetFlagsFromString("--redirect-code-traces-to=code.asm"); | 2590 SetFlagsFromString("--redirect-code-traces-to=code.asm"); |
| 2500 int result = 0; | 2591 int result = 0; |
| 2501 Isolate::CreateParams create_params; | 2592 Isolate::CreateParams create_params; |
| 2502 ShellArrayBufferAllocator shell_array_buffer_allocator; | 2593 ShellArrayBufferAllocator shell_array_buffer_allocator; |
| 2503 MockArrayBufferAllocator mock_arraybuffer_allocator; | 2594 MockArrayBufferAllocator mock_arraybuffer_allocator; |
| 2504 if (options.mock_arraybuffer_allocator) { | 2595 if (options.mock_arraybuffer_allocator) { |
| 2505 Shell::array_buffer_allocator = &mock_arraybuffer_allocator; | 2596 Shell::array_buffer_allocator = &mock_arraybuffer_allocator; |
| 2506 } else { | 2597 } else { |
| 2507 Shell::array_buffer_allocator = &shell_array_buffer_allocator; | 2598 Shell::array_buffer_allocator = &shell_array_buffer_allocator; |
| 2508 } | 2599 } |
| 2509 create_params.array_buffer_allocator = Shell::array_buffer_allocator; | 2600 create_params.array_buffer_allocator = Shell::array_buffer_allocator; |
| 2510 #ifdef ENABLE_VTUNE_JIT_INTERFACE | 2601 #ifdef ENABLE_VTUNE_JIT_INTERFACE |
| 2511 create_params.code_event_handler = vTune::GetVtuneCodeEventHandler(); | 2602 create_params.code_event_handler = vTune::GetVtuneCodeEventHandler(); |
| 2512 #endif | 2603 #endif |
| 2604 #ifndef V8_SHARED |
| 2513 create_params.constraints.ConfigureDefaults( | 2605 create_params.constraints.ConfigureDefaults( |
| 2514 base::SysInfo::AmountOfPhysicalMemory(), | 2606 base::SysInfo::AmountOfPhysicalMemory(), |
| 2515 base::SysInfo::AmountOfVirtualMemory()); | 2607 base::SysInfo::AmountOfVirtualMemory()); |
| 2516 | 2608 |
| 2517 Shell::counter_map_ = new CounterMap(); | 2609 Shell::counter_map_ = new CounterMap(); |
| 2518 if (i::FLAG_dump_counters || i::FLAG_track_gc_object_stats) { | 2610 if (i::FLAG_dump_counters || i::FLAG_track_gc_object_stats) { |
| 2519 create_params.counter_lookup_callback = LookupCounter; | 2611 create_params.counter_lookup_callback = LookupCounter; |
| 2520 create_params.create_histogram_callback = CreateHistogram; | 2612 create_params.create_histogram_callback = CreateHistogram; |
| 2521 create_params.add_histogram_sample_callback = AddHistogramSample; | 2613 create_params.add_histogram_sample_callback = AddHistogramSample; |
| 2522 } | 2614 } |
| 2615 #endif |
| 2523 Isolate* isolate = Isolate::New(create_params); | 2616 Isolate* isolate = Isolate::New(create_params); |
| 2524 { | 2617 { |
| 2525 Isolate::Scope scope(isolate); | 2618 Isolate::Scope scope(isolate); |
| 2526 Initialize(isolate); | 2619 Initialize(isolate); |
| 2527 PerIsolateData data(isolate); | 2620 PerIsolateData data(isolate); |
| 2528 | 2621 |
| 2529 if (options.trace_enabled) { | 2622 if (options.trace_enabled) { |
| 2530 trace_file.open("v8_trace.json"); | 2623 trace_file.open("v8_trace.json"); |
| 2531 platform::tracing::TracingController* tracing_controller = | 2624 platform::tracing::TracingController* tracing_controller = |
| 2532 new platform::tracing::TracingController(); | 2625 new platform::tracing::TracingController(); |
| 2533 platform::tracing::TraceBuffer* trace_buffer = | 2626 platform::tracing::TraceBuffer* trace_buffer = |
| 2534 platform::tracing::TraceBuffer::CreateTraceBufferRingBuffer( | 2627 platform::tracing::TraceBuffer::CreateTraceBufferRingBuffer( |
| 2535 platform::tracing::TraceBuffer::kRingBufferChunks, | 2628 platform::tracing::TraceBuffer::kRingBufferChunks, |
| 2536 platform::tracing::TraceWriter::CreateJSONTraceWriter( | 2629 platform::tracing::TraceWriter::CreateJSONTraceWriter( |
| 2537 trace_file)); | 2630 trace_file)); |
| 2538 platform::tracing::TraceConfig* trace_config; | 2631 platform::tracing::TraceConfig* trace_config; |
| 2539 if (options.trace_config) { | 2632 if (options.trace_config) { |
| 2540 int size = 0; | 2633 int size = 0; |
| 2541 char* trace_config_json_str = | 2634 char* trace_config_json_str = |
| 2542 ReadChars(nullptr, options.trace_config, &size); | 2635 ReadChars(nullptr, options.trace_config, &size); |
| 2543 trace_config = | 2636 trace_config = |
| 2544 tracing::CreateTraceConfigFromJSON(isolate, trace_config_json_str); | 2637 tracing::CreateTraceConfigFromJSON(isolate, trace_config_json_str); |
| 2545 delete[] trace_config_json_str; | 2638 delete[] trace_config_json_str; |
| 2546 } else { | 2639 } else { |
| 2547 trace_config = | 2640 trace_config = |
| 2548 platform::tracing::TraceConfig::CreateDefaultTraceConfig(); | 2641 platform::tracing::TraceConfig::CreateDefaultTraceConfig(); |
| 2549 } | 2642 } |
| 2550 tracing_controller->Initialize(trace_buffer); | 2643 tracing_controller->Initialize(trace_buffer); |
| 2551 tracing_controller->StartTracing(trace_config); | 2644 tracing_controller->StartTracing(trace_config); |
| 2645 #ifndef V8_SHARED |
| 2552 if (!i::FLAG_verify_predictable) { | 2646 if (!i::FLAG_verify_predictable) { |
| 2553 platform::SetTracingController(g_platform, tracing_controller); | 2647 platform::SetTracingController(g_platform, tracing_controller); |
| 2554 } | 2648 } |
| 2649 #else |
| 2650 platform::SetTracingController(g_platform, tracing_controller); |
| 2651 #endif |
| 2555 } | 2652 } |
| 2556 | 2653 |
| 2654 #ifndef V8_SHARED |
| 2557 if (options.dump_heap_constants) { | 2655 if (options.dump_heap_constants) { |
| 2558 DumpHeapConstants(reinterpret_cast<i::Isolate*>(isolate)); | 2656 DumpHeapConstants(reinterpret_cast<i::Isolate*>(isolate)); |
| 2559 return 0; | 2657 return 0; |
| 2560 } | 2658 } |
| 2659 #endif |
| 2561 | 2660 |
| 2562 if (options.stress_opt || options.stress_deopt) { | 2661 if (options.stress_opt || options.stress_deopt) { |
| 2563 Testing::SetStressRunType(options.stress_opt | 2662 Testing::SetStressRunType(options.stress_opt |
| 2564 ? Testing::kStressTypeOpt | 2663 ? Testing::kStressTypeOpt |
| 2565 : Testing::kStressTypeDeopt); | 2664 : Testing::kStressTypeDeopt); |
| 2566 options.stress_runs = Testing::GetStressRuns(); | 2665 options.stress_runs = Testing::GetStressRuns(); |
| 2567 for (int i = 0; i < options.stress_runs && result == 0; i++) { | 2666 for (int i = 0; i < options.stress_runs && result == 0; i++) { |
| 2568 printf("============ Stress %d/%d ============\n", i + 1, | 2667 printf("============ Stress %d/%d ============\n", i + 1, |
| 2569 options.stress_runs); | 2668 options.stress_runs); |
| 2570 Testing::PrepareStressRun(i); | 2669 Testing::PrepareStressRun(i); |
| 2571 bool last_run = i == options.stress_runs - 1; | 2670 bool last_run = i == options.stress_runs - 1; |
| 2572 result = RunMain(isolate, argc, argv, last_run); | 2671 result = RunMain(isolate, argc, argv, last_run); |
| 2573 } | 2672 } |
| 2574 printf("======== Full Deoptimization =======\n"); | 2673 printf("======== Full Deoptimization =======\n"); |
| 2575 Testing::DeoptimizeAll(isolate); | 2674 Testing::DeoptimizeAll(isolate); |
| 2675 #if !defined(V8_SHARED) |
| 2576 } else if (i::FLAG_stress_runs > 0) { | 2676 } else if (i::FLAG_stress_runs > 0) { |
| 2577 options.stress_runs = i::FLAG_stress_runs; | 2677 options.stress_runs = i::FLAG_stress_runs; |
| 2578 for (int i = 0; i < options.stress_runs && result == 0; i++) { | 2678 for (int i = 0; i < options.stress_runs && result == 0; i++) { |
| 2579 printf("============ Run %d/%d ============\n", i + 1, | 2679 printf("============ Run %d/%d ============\n", i + 1, |
| 2580 options.stress_runs); | 2680 options.stress_runs); |
| 2581 bool last_run = i == options.stress_runs - 1; | 2681 bool last_run = i == options.stress_runs - 1; |
| 2582 result = RunMain(isolate, argc, argv, last_run); | 2682 result = RunMain(isolate, argc, argv, last_run); |
| 2583 } | 2683 } |
| 2684 #endif |
| 2584 } else { | 2685 } else { |
| 2585 bool last_run = true; | 2686 bool last_run = true; |
| 2586 result = RunMain(isolate, argc, argv, last_run); | 2687 result = RunMain(isolate, argc, argv, last_run); |
| 2587 } | 2688 } |
| 2588 | 2689 |
| 2589 // Run interactive shell if explicitly requested or if no script has been | 2690 // Run interactive shell if explicitly requested or if no script has been |
| 2590 // executed, but never on --test | 2691 // executed, but never on --test |
| 2591 if (options.use_interactive_shell()) { | 2692 if (options.use_interactive_shell()) { |
| 2592 RunShell(isolate); | 2693 RunShell(isolate); |
| 2593 } | 2694 } |
| 2594 | 2695 |
| 2696 #ifndef V8_SHARED |
| 2595 if (i::FLAG_ignition && i::FLAG_trace_ignition_dispatches && | 2697 if (i::FLAG_ignition && i::FLAG_trace_ignition_dispatches && |
| 2596 i::FLAG_trace_ignition_dispatches_output_file != nullptr) { | 2698 i::FLAG_trace_ignition_dispatches_output_file != nullptr) { |
| 2597 WriteIgnitionDispatchCountersFile(isolate); | 2699 WriteIgnitionDispatchCountersFile(isolate); |
| 2598 } | 2700 } |
| 2701 #endif |
| 2599 | 2702 |
| 2600 // Shut down contexts and collect garbage. | 2703 // Shut down contexts and collect garbage. |
| 2601 evaluation_context_.Reset(); | 2704 evaluation_context_.Reset(); |
| 2705 #ifndef V8_SHARED |
| 2602 stringify_function_.Reset(); | 2706 stringify_function_.Reset(); |
| 2707 #endif // !V8_SHARED |
| 2603 CollectGarbage(isolate); | 2708 CollectGarbage(isolate); |
| 2604 } | 2709 } |
| 2605 OnExit(isolate); | 2710 OnExit(isolate); |
| 2711 #ifndef V8_SHARED |
| 2606 // Dump basic block profiling data. | 2712 // Dump basic block profiling data. |
| 2607 if (i::BasicBlockProfiler* profiler = | 2713 if (i::BasicBlockProfiler* profiler = |
| 2608 reinterpret_cast<i::Isolate*>(isolate)->basic_block_profiler()) { | 2714 reinterpret_cast<i::Isolate*>(isolate)->basic_block_profiler()) { |
| 2609 i::OFStream os(stdout); | 2715 i::OFStream os(stdout); |
| 2610 os << *profiler; | 2716 os << *profiler; |
| 2611 } | 2717 } |
| 2718 #endif // !V8_SHARED |
| 2612 isolate->Dispose(); | 2719 isolate->Dispose(); |
| 2613 V8::Dispose(); | 2720 V8::Dispose(); |
| 2614 V8::ShutdownPlatform(); | 2721 V8::ShutdownPlatform(); |
| 2615 delete g_platform; | 2722 delete g_platform; |
| 2616 | 2723 |
| 2617 return result; | 2724 return result; |
| 2618 } | 2725 } |
| 2619 | 2726 |
| 2620 } // namespace v8 | 2727 } // namespace v8 |
| 2621 | 2728 |
| 2622 | 2729 |
| 2623 #ifndef GOOGLE3 | 2730 #ifndef GOOGLE3 |
| 2624 int main(int argc, char* argv[]) { | 2731 int main(int argc, char* argv[]) { |
| 2625 return v8::Shell::Main(argc, argv); | 2732 return v8::Shell::Main(argc, argv); |
| 2626 } | 2733 } |
| 2627 #endif | 2734 #endif |
| OLD | NEW |