| Index: src/d8.cc
|
| diff --git a/src/d8.cc b/src/d8.cc
|
| index 9aeac11bb0a439b59a8933a6b15cdc8f0ac1116f..70f58126add4f0b316a127c1ab9de5ec54b4f274 100644
|
| --- a/src/d8.cc
|
| +++ b/src/d8.cc
|
| @@ -296,7 +296,6 @@ bool Shell::ExecuteString(Isolate* isolate, Local<String> source,
|
| bool report_exceptions, SourceType source_type) {
|
| HandleScope handle_scope(isolate);
|
| TryCatch try_catch(isolate);
|
| - options.script_executed = true;
|
|
|
| MaybeLocal<Value> maybe_result;
|
| {
|
| @@ -1490,7 +1489,7 @@ void SourceGroup::ExecuteInThread() {
|
| Isolate::CreateParams create_params;
|
| create_params.array_buffer_allocator = Shell::array_buffer_allocator;
|
| Isolate* isolate = Isolate::New(create_params);
|
| - do {
|
| + for (int i = 0; i < Shell::options.stress_runs; ++i) {
|
| next_semaphore_.Wait();
|
| {
|
| Isolate::Scope iscope(isolate);
|
| @@ -1507,7 +1506,7 @@ void SourceGroup::ExecuteInThread() {
|
| Shell::CollectGarbage(isolate);
|
| }
|
| done_semaphore_.Signal();
|
| - } while (!Shell::options.last_run);
|
| + }
|
|
|
| isolate->Dispose();
|
| }
|
| @@ -1524,11 +1523,13 @@ void SourceGroup::StartExecuteInThread() {
|
|
|
| void SourceGroup::WaitForThread() {
|
| if (thread_ == NULL) return;
|
| - if (Shell::options.last_run) {
|
| - thread_->Join();
|
| - } else {
|
| - done_semaphore_.Wait();
|
| - }
|
| + done_semaphore_.Wait();
|
| +}
|
| +
|
| +
|
| +void SourceGroup::JoinThread() {
|
| + if (thread_ == NULL) return;
|
| + thread_->Join();
|
| }
|
|
|
|
|
| @@ -1934,6 +1935,11 @@ bool Shell::SetOptions(int argc, char* argv[]) {
|
| enable_harmony_modules = true;
|
| } else if (strncmp(argv[i], "--", 2) == 0) {
|
| printf("Warning: unknown flag %s.\nTry --help for options\n", argv[i]);
|
| + } else if (strcmp(str, "-e") == 0 && i + 1 < argc) {
|
| + options.script_executed = true;
|
| + } else if (strncmp(str, "-", 1) != 0) {
|
| + // Not a flag, so it must be a script to execute.
|
| + options.script_executed = true;
|
| }
|
| }
|
| current->End(argc);
|
| @@ -1950,7 +1956,7 @@ bool Shell::SetOptions(int argc, char* argv[]) {
|
| }
|
|
|
|
|
| -int Shell::RunMain(Isolate* isolate, 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();
|
| @@ -1959,7 +1965,7 @@ int Shell::RunMain(Isolate* isolate, int argc, char* argv[]) {
|
| {
|
| HandleScope scope(isolate);
|
| Local<Context> context = CreateEvaluationContext(isolate);
|
| - if (options.last_run && options.use_interactive_shell()) {
|
| + if (last_run && options.use_interactive_shell()) {
|
| // Keep using the same context in the interactive shell.
|
| evaluation_context_.Reset(isolate, context);
|
| }
|
| @@ -1972,7 +1978,11 @@ int Shell::RunMain(Isolate* isolate, int argc, char* argv[]) {
|
| CollectGarbage(isolate);
|
| #ifndef V8_SHARED
|
| for (int i = 1; i < options.num_isolates; ++i) {
|
| - options.isolate_sources[i].WaitForThread();
|
| + if (last_run) {
|
| + options.isolate_sources[i].JoinThread();
|
| + } else {
|
| + options.isolate_sources[i].WaitForThread();
|
| + }
|
| }
|
| CleanupWorkers();
|
| #endif // !V8_SHARED
|
| @@ -2098,6 +2108,7 @@ bool Shell::SerializeValue(Isolate* isolate, Local<Value> value,
|
| contents = sab->GetContents();
|
| } else {
|
| contents = sab->Externalize();
|
| + base::LockGuard<base::Mutex> lock_guard(workers_mutex_.Pointer());
|
| externalized_shared_contents_.Add(contents);
|
| }
|
| out_data->WriteSharedArrayBufferContents(contents);
|
| @@ -2253,10 +2264,8 @@ void Shell::CleanupWorkers() {
|
| }
|
|
|
| // Now that all workers are terminated, we can re-enable Worker creation.
|
| - {
|
| - base::LockGuard<base::Mutex> lock_guard(workers_mutex_.Pointer());
|
| - allow_new_workers_ = true;
|
| - }
|
| + base::LockGuard<base::Mutex> lock_guard(workers_mutex_.Pointer());
|
| + allow_new_workers_ = true;
|
|
|
| for (int i = 0; i < externalized_shared_contents_.length(); ++i) {
|
| const SharedArrayBuffer::Contents& contents =
|
| @@ -2398,26 +2407,29 @@ int Shell::Main(int argc, char* argv[]) {
|
| Testing::SetStressRunType(options.stress_opt
|
| ? Testing::kStressTypeOpt
|
| : Testing::kStressTypeDeopt);
|
| - int stress_runs = Testing::GetStressRuns();
|
| - for (int i = 0; i < stress_runs && result == 0; i++) {
|
| - printf("============ Stress %d/%d ============\n", i + 1, stress_runs);
|
| + options.stress_runs = Testing::GetStressRuns();
|
| + for (int i = 0; i < options.stress_runs && result == 0; i++) {
|
| + printf("============ Stress %d/%d ============\n", i + 1,
|
| + options.stress_runs);
|
| Testing::PrepareStressRun(i);
|
| - options.last_run = (i == stress_runs - 1);
|
| - result = RunMain(isolate, argc, argv);
|
| + bool last_run = i == options.stress_runs - 1;
|
| + result = RunMain(isolate, argc, argv, last_run);
|
| }
|
| printf("======== Full Deoptimization =======\n");
|
| Testing::DeoptimizeAll();
|
| #if !defined(V8_SHARED)
|
| } else if (i::FLAG_stress_runs > 0) {
|
| - int stress_runs = i::FLAG_stress_runs;
|
| - for (int i = 0; i < stress_runs && result == 0; i++) {
|
| - printf("============ Run %d/%d ============\n", i + 1, stress_runs);
|
| - options.last_run = (i == stress_runs - 1);
|
| - result = RunMain(isolate, argc, argv);
|
| + options.stress_runs = i::FLAG_stress_runs;
|
| + for (int i = 0; i < options.stress_runs && result == 0; i++) {
|
| + printf("============ Run %d/%d ============\n", i + 1,
|
| + options.stress_runs);
|
| + bool last_run = i == options.stress_runs - 1;
|
| + result = RunMain(isolate, argc, argv, last_run);
|
| }
|
| #endif
|
| } else {
|
| - result = RunMain(isolate, argc, argv);
|
| + bool last_run = true;
|
| + result = RunMain(isolate, argc, argv, last_run);
|
| }
|
|
|
| // Run interactive shell if explicitly requested or if no script has been
|
|
|