| Index: src/debug.cc
|
| diff --git a/src/debug.cc b/src/debug.cc
|
| index 3ecf8bada73ee24de75b07fadabd801c075b0299..e8fcd8100c2afb732a6a6d08e105cd7c86252840 100644
|
| --- a/src/debug.cc
|
| +++ b/src/debug.cc
|
| @@ -49,18 +49,6 @@ Debug::~Debug() {
|
| }
|
|
|
|
|
| -static void PrintLn(v8::Local<v8::Value> value) {
|
| - v8::Local<v8::String> s = value->ToString();
|
| - ScopedVector<char> data(s->Utf8Length() + 1);
|
| - if (data.start() == NULL) {
|
| - V8::FatalProcessOutOfMemory("PrintLn");
|
| - return;
|
| - }
|
| - s->WriteUtf8(data.start());
|
| - PrintF("%s\n", data.start());
|
| -}
|
| -
|
| -
|
| static v8::Handle<v8::Context> GetDebugEventContext(Isolate* isolate) {
|
| Handle<Context> context = isolate->debug()->debugger_entry()->GetContext();
|
| // Isolate::context() may have been NULL when "script collected" event
|
| @@ -2675,10 +2663,8 @@ Debugger::Debugger(Isolate* isolate)
|
| force_debugger_active_(false),
|
| message_handler_(NULL),
|
| debugger_unload_pending_(false),
|
| - host_dispatch_handler_(NULL),
|
| debug_message_dispatch_handler_(NULL),
|
| message_dispatch_helper_thread_(NULL),
|
| - host_dispatch_period_(TimeDelta::FromMilliseconds(100)),
|
| agent_(NULL),
|
| command_queue_(isolate->logger(), kQueueInitialSize),
|
| command_received_(0),
|
| @@ -3068,7 +3054,6 @@ void Debugger::NotifyMessageHandler(v8::DebugEvent event,
|
| Handle<JSObject> exec_state,
|
| Handle<JSObject> event_data,
|
| bool auto_continue) {
|
| - v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(isolate_);
|
| HandleScope scope(isolate_);
|
|
|
| if (!isolate_->debug()->Load()) return;
|
| @@ -3122,45 +3107,24 @@ void Debugger::NotifyMessageHandler(v8::DebugEvent event,
|
| return;
|
| }
|
|
|
| - v8::TryCatch try_catch;
|
| -
|
| // DebugCommandProcessor goes here.
|
| - v8::Local<v8::Object> cmd_processor;
|
| - {
|
| - v8::Local<v8::Object> api_exec_state =
|
| - v8::Utils::ToLocal(Handle<JSObject>::cast(exec_state));
|
| - v8::Local<v8::String> fun_name = v8::String::NewFromUtf8(
|
| - isolate, "debugCommandProcessor");
|
| - v8::Local<v8::Function> fun =
|
| - v8::Local<v8::Function>::Cast(api_exec_state->Get(fun_name));
|
| -
|
| - v8::Handle<v8::Boolean> running = v8::Boolean::New(isolate, auto_continue);
|
| - static const int kArgc = 1;
|
| - v8::Handle<Value> argv[kArgc] = { running };
|
| - cmd_processor = v8::Local<v8::Object>::Cast(
|
| - fun->Call(api_exec_state, kArgc, argv));
|
| - if (try_catch.HasCaught()) {
|
| - PrintLn(try_catch.Exception());
|
| - return;
|
| - }
|
| - }
|
| -
|
| bool running = auto_continue;
|
|
|
| + Handle<Object> cmd_processor_ctor = Object::GetProperty(
|
| + isolate_, exec_state, "debugCommandProcessor").ToHandleChecked();
|
| + Handle<Object> ctor_args[] = { isolate_->factory()->ToBoolean(running) };
|
| + Handle<Object> cmd_processor = Execution::Call(
|
| + isolate_, cmd_processor_ctor, exec_state, 1, ctor_args).ToHandleChecked();
|
| + Handle<JSFunction> process_debug_request = Handle<JSFunction>::cast(
|
| + Object::GetProperty(
|
| + isolate_, cmd_processor, "processDebugRequest").ToHandleChecked());
|
| + Handle<Object> is_running = Object::GetProperty(
|
| + isolate_, cmd_processor, "isRunning").ToHandleChecked();
|
| +
|
| // Process requests from the debugger.
|
| - while (true) {
|
| + do {
|
| // Wait for new command in the queue.
|
| - if (Debugger::host_dispatch_handler_) {
|
| - // In case there is a host dispatch - do periodic dispatches.
|
| - if (!command_received_.WaitFor(host_dispatch_period_)) {
|
| - // Timout expired, do the dispatch.
|
| - Debugger::host_dispatch_handler_();
|
| - continue;
|
| - }
|
| - } else {
|
| - // In case there is no host dispatch - just wait.
|
| - command_received_.Wait();
|
| - }
|
| + command_received_.Wait();
|
|
|
| // Get the command from the queue.
|
| CommandMessage command = command_queue_.Get();
|
| @@ -3172,69 +3136,50 @@ void Debugger::NotifyMessageHandler(v8::DebugEvent event,
|
| return;
|
| }
|
|
|
| - // Invoke JavaScript to process the debug request.
|
| - v8::Local<v8::String> fun_name;
|
| - v8::Local<v8::Function> fun;
|
| - v8::Local<v8::Value> request;
|
| - v8::TryCatch try_catch;
|
| - fun_name = v8::String::NewFromUtf8(isolate, "processDebugRequest");
|
| - fun = v8::Local<v8::Function>::Cast(cmd_processor->Get(fun_name));
|
| -
|
| - request = v8::String::NewFromTwoByte(isolate, command.text().start(),
|
| - v8::String::kNormalString,
|
| - command.text().length());
|
| - static const int kArgc = 1;
|
| - v8::Handle<Value> argv[kArgc] = { request };
|
| - v8::Local<v8::Value> response_val = fun->Call(cmd_processor, kArgc, argv);
|
| -
|
| - // Get the response.
|
| - v8::Local<v8::String> response;
|
| - if (!try_catch.HasCaught()) {
|
| - // Get response string.
|
| - if (!response_val->IsUndefined()) {
|
| - response = v8::Local<v8::String>::Cast(response_val);
|
| + Vector<const uc16> command_text(
|
| + const_cast<const uc16*>(command.text().start()),
|
| + command.text().length());
|
| + Handle<String> request_text = isolate_->factory()->NewStringFromTwoByte(
|
| + command_text).ToHandleChecked();
|
| + Handle<Object> request_args[] = { request_text };
|
| + Handle<Object> exception;
|
| + Handle<Object> answer_value;
|
| + Handle<String> answer;
|
| + MaybeHandle<Object> maybe_result = Execution::TryCall(
|
| + process_debug_request, cmd_processor, 1, request_args, &exception);
|
| +
|
| + if (maybe_result.ToHandle(&answer_value)) {
|
| + if (answer_value->IsUndefined()) {
|
| + answer = isolate_->factory()->empty_string();
|
| } else {
|
| - response = v8::String::NewFromUtf8(isolate, "");
|
| + answer = Handle<String>::cast(answer_value);
|
| }
|
|
|
| // Log the JSON request/response.
|
| if (FLAG_trace_debug_json) {
|
| - PrintLn(request);
|
| - PrintLn(response);
|
| + PrintF("%s\n", request_text->ToCString().get());
|
| + PrintF("%s\n", answer->ToCString().get());
|
| }
|
|
|
| - // Get the running state.
|
| - fun_name = v8::String::NewFromUtf8(isolate, "isRunning");
|
| - fun = v8::Local<v8::Function>::Cast(cmd_processor->Get(fun_name));
|
| - static const int kArgc = 1;
|
| - v8::Handle<Value> argv[kArgc] = { response };
|
| - v8::Local<v8::Value> running_val = fun->Call(cmd_processor, kArgc, argv);
|
| - if (!try_catch.HasCaught()) {
|
| - running = running_val->ToBoolean()->Value();
|
| - }
|
| + Handle<Object> is_running_args[] = { answer };
|
| + maybe_result = Execution::Call(
|
| + isolate_, is_running, cmd_processor, 1, is_running_args);
|
| + running = maybe_result.ToHandleChecked()->IsTrue();
|
| } else {
|
| - // In case of failure the result text is the exception text.
|
| - response = try_catch.Exception()->ToString();
|
| + answer = Handle<String>::cast(
|
| + Execution::ToString(isolate_, exception).ToHandleChecked());
|
| }
|
|
|
| // Return the result.
|
| MessageImpl message = MessageImpl::NewResponse(
|
| - event,
|
| - running,
|
| - Handle<JSObject>::cast(exec_state),
|
| - Handle<JSObject>::cast(event_data),
|
| - Handle<String>(Utils::OpenHandle(*response)),
|
| - command.client_data());
|
| + event, running, exec_state, event_data, answer, command.client_data());
|
| InvokeMessageHandler(message);
|
| command.Dispose();
|
|
|
| // Return from debug event processing if either the VM is put into the
|
| // running state (through a continue command) or auto continue is active
|
| // and there are no more commands queued.
|
| - if (running && !HasCommands()) {
|
| - return;
|
| - }
|
| - }
|
| + } while (!running || HasCommands());
|
| }
|
|
|
|
|
| @@ -3302,13 +3247,6 @@ void Debugger::ListenersChanged() {
|
| }
|
|
|
|
|
| -void Debugger::SetHostDispatchHandler(v8::Debug::HostDispatchHandler handler,
|
| - TimeDelta period) {
|
| - host_dispatch_handler_ = handler;
|
| - host_dispatch_period_ = period;
|
| -}
|
| -
|
| -
|
| void Debugger::SetDebugMessageDispatchHandler(
|
| v8::Debug::DebugMessageDispatchHandler handler, bool provide_locker) {
|
| LockGuard<Mutex> lock_guard(&dispatch_handler_access_);
|
|
|