| Index: test/cctest/test-debug.cc
|
| diff --git a/test/cctest/test-debug.cc b/test/cctest/test-debug.cc
|
| index 0adcc0a2bc53b8a68cfac9d5441c28bd33d56efc..69c10c29d0fd141dfbe02152d13c5978c721f2bf 100644
|
| --- a/test/cctest/test-debug.cc
|
| +++ b/test/cctest/test-debug.cc
|
| @@ -73,16 +73,23 @@ using ::v8::internal::StrLength;
|
| class DebugLocalContext {
|
| public:
|
| inline DebugLocalContext(
|
| + v8::Isolate* isolate, v8::ExtensionConfiguration* extensions = 0,
|
| + v8::Handle<v8::ObjectTemplate> global_template =
|
| + v8::Handle<v8::ObjectTemplate>(),
|
| + v8::Handle<v8::Value> global_object = v8::Handle<v8::Value>())
|
| + : scope_(isolate),
|
| + context_(v8::Context::New(isolate, extensions, global_template,
|
| + global_object)) {
|
| + context_->Enter();
|
| + }
|
| + inline DebugLocalContext(
|
| v8::ExtensionConfiguration* extensions = 0,
|
| v8::Handle<v8::ObjectTemplate> global_template =
|
| v8::Handle<v8::ObjectTemplate>(),
|
| v8::Handle<v8::Value> global_object = v8::Handle<v8::Value>())
|
| : scope_(CcTest::isolate()),
|
| - context_(
|
| - v8::Context::New(CcTest::isolate(),
|
| - extensions,
|
| - global_template,
|
| - global_object)) {
|
| + context_(v8::Context::New(CcTest::isolate(), extensions,
|
| + global_template, global_object)) {
|
| context_->Enter();
|
| }
|
| inline ~DebugLocalContext() {
|
| @@ -137,8 +144,7 @@ static v8::Local<v8::Function> CompileFunction(v8::Isolate* isolate,
|
| const char* source,
|
| const char* function_name) {
|
| v8::Script::Compile(v8::String::NewFromUtf8(isolate, source))->Run();
|
| - v8::Local<v8::Object> global =
|
| - CcTest::isolate()->GetCurrentContext()->Global();
|
| + v8::Local<v8::Object> global = isolate->GetCurrentContext()->Global();
|
| return v8::Local<v8::Function>::Cast(
|
| global->Get(v8::String::NewFromUtf8(isolate, function_name)));
|
| }
|
| @@ -5155,12 +5161,20 @@ class V8Thread : public v8::base::Thread {
|
| public:
|
| V8Thread() : Thread(Options("V8Thread")) {}
|
| void Run();
|
| + v8::Isolate* isolate() { return isolate_; }
|
| +
|
| + private:
|
| + v8::Isolate* isolate_;
|
| };
|
|
|
| class DebuggerThread : public v8::base::Thread {
|
| public:
|
| - DebuggerThread() : Thread(Options("DebuggerThread")) {}
|
| + explicit DebuggerThread(v8::Isolate* isolate)
|
| + : Thread(Options("DebuggerThread")), isolate_(isolate) {}
|
| void Run();
|
| +
|
| + private:
|
| + v8::Isolate* isolate_;
|
| };
|
|
|
|
|
| @@ -5203,22 +5217,25 @@ void V8Thread::Run() {
|
| "\n"
|
| "foo();\n";
|
|
|
| - v8::Isolate* isolate = CcTest::isolate();
|
| - v8::Isolate::Scope isolate_scope(isolate);
|
| - DebugLocalContext env;
|
| - v8::HandleScope scope(env->GetIsolate());
|
| - v8::Debug::SetMessageHandler(&ThreadedMessageHandler);
|
| - v8::Handle<v8::ObjectTemplate> global_template =
|
| - v8::ObjectTemplate::New(env->GetIsolate());
|
| - global_template->Set(
|
| - v8::String::NewFromUtf8(env->GetIsolate(), "ThreadedAtBarrier1"),
|
| - v8::FunctionTemplate::New(isolate, ThreadedAtBarrier1));
|
| - v8::Handle<v8::Context> context = v8::Context::New(isolate,
|
| - NULL,
|
| - global_template);
|
| - v8::Context::Scope context_scope(context);
|
| -
|
| - CompileRun(source);
|
| + isolate_ = v8::Isolate::New();
|
| + threaded_debugging_barriers.barrier_3.Wait();
|
| + {
|
| + v8::Isolate::Scope isolate_scope(isolate_);
|
| + DebugLocalContext env(isolate_);
|
| + v8::HandleScope scope(isolate_);
|
| + v8::Debug::SetMessageHandler(&ThreadedMessageHandler);
|
| + v8::Handle<v8::ObjectTemplate> global_template =
|
| + v8::ObjectTemplate::New(env->GetIsolate());
|
| + global_template->Set(
|
| + v8::String::NewFromUtf8(env->GetIsolate(), "ThreadedAtBarrier1"),
|
| + v8::FunctionTemplate::New(isolate_, ThreadedAtBarrier1));
|
| + v8::Handle<v8::Context> context =
|
| + v8::Context::New(isolate_, NULL, global_template);
|
| + v8::Context::Scope context_scope(context);
|
| +
|
| + CompileRun(source);
|
| + }
|
| + isolate_->Dispose();
|
| }
|
|
|
|
|
| @@ -5234,21 +5251,21 @@ void DebuggerThread::Run() {
|
| "\"type\":\"request\","
|
| "\"command\":\"continue\"}";
|
|
|
| - v8::Isolate* isolate = CcTest::isolate();
|
| threaded_debugging_barriers.barrier_1.Wait();
|
| - v8::Debug::DebugBreak(isolate);
|
| + v8::Debug::DebugBreak(isolate_);
|
| threaded_debugging_barriers.barrier_2.Wait();
|
| - v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_1, buffer));
|
| - v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_2, buffer));
|
| + v8::Debug::SendCommand(isolate_, buffer, AsciiToUtf16(command_1, buffer));
|
| + v8::Debug::SendCommand(isolate_, buffer, AsciiToUtf16(command_2, buffer));
|
| }
|
|
|
|
|
| TEST(ThreadedDebugging) {
|
| - DebuggerThread debugger_thread;
|
| V8Thread v8_thread;
|
|
|
| // Create a V8 environment
|
| v8_thread.Start();
|
| + threaded_debugging_barriers.barrier_3.Wait();
|
| + DebuggerThread debugger_thread(v8_thread.isolate());
|
| debugger_thread.Start();
|
|
|
| v8_thread.Join();
|
| @@ -5267,17 +5284,24 @@ class BreakpointsV8Thread : public v8::base::Thread {
|
| public:
|
| BreakpointsV8Thread() : Thread(Options("BreakpointsV8Thread")) {}
|
| void Run();
|
| +
|
| + v8::Isolate* isolate() { return isolate_; }
|
| +
|
| + private:
|
| + v8::Isolate* isolate_;
|
| };
|
|
|
| class BreakpointsDebuggerThread : public v8::base::Thread {
|
| public:
|
| - explicit BreakpointsDebuggerThread(bool global_evaluate)
|
| + BreakpointsDebuggerThread(bool global_evaluate, v8::Isolate* isolate)
|
| : Thread(Options("BreakpointsDebuggerThread")),
|
| - global_evaluate_(global_evaluate) {}
|
| + global_evaluate_(global_evaluate),
|
| + isolate_(isolate) {}
|
| void Run();
|
|
|
| private:
|
| bool global_evaluate_;
|
| + v8::Isolate* isolate_;
|
| };
|
|
|
|
|
| @@ -5322,16 +5346,20 @@ void BreakpointsV8Thread::Run() {
|
| const char* source_2 = "cat(17);\n"
|
| "cat(19);\n";
|
|
|
| - v8::Isolate* isolate = CcTest::isolate();
|
| - v8::Isolate::Scope isolate_scope(isolate);
|
| - DebugLocalContext env;
|
| - v8::HandleScope scope(isolate);
|
| - v8::Debug::SetMessageHandler(&BreakpointsMessageHandler);
|
| -
|
| - CompileRun(source_1);
|
| - breakpoints_barriers->barrier_1.Wait();
|
| - breakpoints_barriers->barrier_2.Wait();
|
| - CompileRun(source_2);
|
| + isolate_ = v8::Isolate::New();
|
| + breakpoints_barriers->barrier_3.Wait();
|
| + {
|
| + v8::Isolate::Scope isolate_scope(isolate_);
|
| + DebugLocalContext env(isolate_);
|
| + v8::HandleScope scope(isolate_);
|
| + v8::Debug::SetMessageHandler(&BreakpointsMessageHandler);
|
| +
|
| + CompileRun(source_1);
|
| + breakpoints_barriers->barrier_1.Wait();
|
| + breakpoints_barriers->barrier_2.Wait();
|
| + CompileRun(source_2);
|
| + }
|
| + isolate_->Dispose();
|
| }
|
|
|
|
|
| @@ -5397,14 +5425,12 @@ void BreakpointsDebuggerThread::Run() {
|
| "\"command\":\"continue\"}";
|
|
|
|
|
| - v8::Isolate* isolate = CcTest::isolate();
|
| - v8::Isolate::Scope isolate_scope(isolate);
|
| // v8 thread initializes, runs source_1
|
| breakpoints_barriers->barrier_1.Wait();
|
| // 1:Set breakpoint in cat() (will get id 1).
|
| - v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_1, buffer));
|
| + v8::Debug::SendCommand(isolate_, buffer, AsciiToUtf16(command_1, buffer));
|
| // 2:Set breakpoint in dog() (will get id 2).
|
| - v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_2, buffer));
|
| + v8::Debug::SendCommand(isolate_, buffer, AsciiToUtf16(command_2, buffer));
|
| breakpoints_barriers->barrier_2.Wait();
|
| // V8 thread starts compiling source_2.
|
| // Automatic break happens, to run queued commands
|
| @@ -5416,43 +5442,42 @@ void BreakpointsDebuggerThread::Run() {
|
| // Must have hit breakpoint #1.
|
| CHECK_EQ(1, break_event_breakpoint_id);
|
| // 4:Evaluate dog() (which has a breakpoint).
|
| - v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_3, buffer));
|
| + v8::Debug::SendCommand(isolate_, buffer, AsciiToUtf16(command_3, buffer));
|
| // V8 thread hits breakpoint in dog().
|
| breakpoints_barriers->semaphore_1.Wait(); // wait for break event
|
| // Must have hit breakpoint #2.
|
| CHECK_EQ(2, break_event_breakpoint_id);
|
| // 5:Evaluate (x + 1).
|
| - v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_4, buffer));
|
| + v8::Debug::SendCommand(isolate_, buffer, AsciiToUtf16(command_4, buffer));
|
| // Evaluate (x + 1) finishes.
|
| breakpoints_barriers->semaphore_1.Wait();
|
| // Must have result 108.
|
| CHECK_EQ(108, evaluate_int_result);
|
| // 6:Continue evaluation of dog().
|
| - v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_5, buffer));
|
| + v8::Debug::SendCommand(isolate_, buffer, AsciiToUtf16(command_5, buffer));
|
| // Evaluate dog() finishes.
|
| breakpoints_barriers->semaphore_1.Wait();
|
| // Must have result 107.
|
| CHECK_EQ(107, evaluate_int_result);
|
| // 7:Continue evaluation of source_2, finish cat(17), hit breakpoint
|
| // in cat(19).
|
| - v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_6, buffer));
|
| + v8::Debug::SendCommand(isolate_, buffer, AsciiToUtf16(command_6, buffer));
|
| // Message callback gets break event.
|
| breakpoints_barriers->semaphore_1.Wait(); // wait for break event
|
| // Must have hit breakpoint #1.
|
| CHECK_EQ(1, break_event_breakpoint_id);
|
| // 8: Evaluate dog() with breaks disabled.
|
| - v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_7, buffer));
|
| + v8::Debug::SendCommand(isolate_, buffer, AsciiToUtf16(command_7, buffer));
|
| // Evaluate dog() finishes.
|
| breakpoints_barriers->semaphore_1.Wait();
|
| // Must have result 116.
|
| CHECK_EQ(116, evaluate_int_result);
|
| // 9: Continue evaluation of source2, reach end.
|
| - v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_8, buffer));
|
| + v8::Debug::SendCommand(isolate_, buffer, AsciiToUtf16(command_8, buffer));
|
| }
|
|
|
|
|
| void TestRecursiveBreakpointsGeneric(bool global_evaluate) {
|
| - BreakpointsDebuggerThread breakpoints_debugger_thread(global_evaluate);
|
| BreakpointsV8Thread breakpoints_v8_thread;
|
|
|
| // Create a V8 environment
|
| @@ -5460,6 +5485,9 @@ void TestRecursiveBreakpointsGeneric(bool global_evaluate) {
|
| breakpoints_barriers = &stack_allocated_breakpoints_barriers;
|
|
|
| breakpoints_v8_thread.Start();
|
| + breakpoints_barriers->barrier_3.Wait();
|
| + BreakpointsDebuggerThread breakpoints_debugger_thread(
|
| + global_evaluate, breakpoints_v8_thread.isolate());
|
| breakpoints_debugger_thread.Start();
|
|
|
| breakpoints_v8_thread.Join();
|
|
|