Chromium Code Reviews| Index: Source/bindings/v8/ScriptDebugServer.cpp |
| diff --git a/Source/bindings/v8/ScriptDebugServer.cpp b/Source/bindings/v8/ScriptDebugServer.cpp |
| index 9a3ab63027c6d50fbc79e181d212746436f78d65..1e3fdf0c90f0240c4d6cfb8ab0da0324429cc2d9 100644 |
| --- a/Source/bindings/v8/ScriptDebugServer.cpp |
| +++ b/Source/bindings/v8/ScriptDebugServer.cpp |
| @@ -382,11 +382,12 @@ v8::Handle<v8::Value> ScriptDebugServer::breakProgramCallback(const v8::Argument |
| ScriptDebugServer* thisPtr = toScriptDebugServer(args.Data()); |
| v8::Handle<v8::Value> exception; |
| - thisPtr->breakProgram(v8::Handle<v8::Object>::Cast(args[0]), exception); |
| + v8::Handle<v8::Array> hitBreakPoints; |
|
yurys
2013/06/05 08:07:36
hitBreakpoints
SeRya
2013/06/05 11:34:57
Done.
|
| + thisPtr->breakProgram(v8::Handle<v8::Object>::Cast(args[0]), exception, hitBreakPoints); |
| return v8::Undefined(); |
| } |
| -void ScriptDebugServer::breakProgram(v8::Handle<v8::Object> executionState, v8::Handle<v8::Value> exception) |
| +void ScriptDebugServer::breakProgram(v8::Handle<v8::Object> executionState, v8::Handle<v8::Value> exception, v8::Handle<v8::Array> hitBreakpointNumbers) |
| { |
| // Don't allow nested breaks. |
| if (isPaused()) |
| @@ -396,15 +397,29 @@ void ScriptDebugServer::breakProgram(v8::Handle<v8::Object> executionState, v8:: |
| if (!listener) |
| return; |
| + Vector<String> breakpointIDs; |
|
yurys
2013/06/05 08:07:36
breakpointIds
SeRya
2013/06/05 11:34:57
Done.
|
| + if (!hitBreakpointNumbers.IsEmpty()) { |
| + breakpointIDs.resize(hitBreakpointNumbers->Length()); |
| + for (size_t i = 0; i < hitBreakpointNumbers->Length(); i++) |
| + breakpointIDs[i] = toWebCoreStringWithUndefinedOrNullCheck(hitBreakpointNumbers->Get(i)); |
| + } |
| + |
| m_executionState.set(m_isolate, executionState); |
| ScriptState* currentCallFrameState = ScriptState::forContext(m_pausedContext); |
| - listener->didPause(currentCallFrameState, currentCallFrame(), ScriptValue(exception)); |
| + listener->didPause(currentCallFrameState, currentCallFrame(), ScriptValue(exception), breakpointIDs); |
| m_runningNestedMessageLoop = true; |
| runMessageLoopOnPause(m_pausedContext); |
| m_runningNestedMessageLoop = false; |
| } |
| +void ScriptDebugServer::breakProgram(const v8::Debug::EventDetails& eventDetails, v8::Handle<v8::Value> exception, v8::Handle<v8::Array> hitBreakpointNumbers) |
| +{ |
| + m_pausedContext = *eventDetails.GetEventContext(); |
| + breakProgram(eventDetails.GetExecutionState(), exception, hitBreakpointNumbers); |
| + m_pausedContext.Clear(); |
| +} |
| + |
| void ScriptDebugServer::v8DebugEventCallback(const v8::Debug::EventDetails& eventDetails) |
| { |
| ScriptDebugServer* thisPtr = toScriptDebugServer(eventDetails.GetCallbackData()); |
| @@ -454,30 +469,33 @@ void ScriptDebugServer::handleV8DebugEvent(const v8::Debug::EventDetails& eventD |
| m_scriptPreprocessor = preprocessor.release(); |
| } else if (event == v8::AfterCompile) { |
| v8::Context::Scope contextScope(v8::Debug::GetDebugContext()); |
| - v8::Handle<v8::Function> onAfterCompileFunction = v8::Local<v8::Function>::Cast(m_debuggerScript.get()->Get(v8::String::NewSymbol("getAfterCompileScript"))); |
| + v8::Handle<v8::Function> getAfterCompileFunction = v8::Local<v8::Function>::Cast(m_debuggerScript.get()->Get(v8::String::NewSymbol("getAfterCompileScript"))); |
|
yurys
2013/06/05 08:07:36
the new name doesn't seem better, maybe getAfterCo
SeRya
2013/06/05 11:34:57
Done.
|
| v8::Handle<v8::Value> argv[] = { eventDetails.GetEventData() }; |
| - v8::Handle<v8::Value> value = onAfterCompileFunction->Call(m_debuggerScript.get(), 1, argv); |
| + v8::Handle<v8::Value> value = getAfterCompileFunction->Call(m_debuggerScript.get(), 1, argv); |
| ASSERT(value->IsObject()); |
| v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(value); |
| dispatchDidParseSource(listener, object); |
| - } else if (event == v8::Break || event == v8::Exception) { |
| - v8::Handle<v8::Value> exception; |
| - if (event == v8::Exception) { |
| - v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(1); |
| - // Stack trace is empty in case of syntax error. Silently continue execution in such cases. |
| - if (!stackTrace->GetFrameCount()) |
| - return; |
| - v8::Handle<v8::Object> eventData = eventDetails.GetEventData(); |
| - v8::Handle<v8::Value> exceptionGetterValue = eventData->Get(v8::String::NewSymbol("exception")); |
| - ASSERT(!exceptionGetterValue.IsEmpty() && exceptionGetterValue->IsFunction()); |
| - v8::Handle<v8::Value> argv[] = { v8Undefined() }; |
| - V8RecursionScope::MicrotaskSuppression scope; |
| - exception = v8::Handle<v8::Function>::Cast(exceptionGetterValue)->Call(eventData, 0, argv); |
| - } |
| - |
| - m_pausedContext = *eventContext; |
| - breakProgram(eventDetails.GetExecutionState(), exception); |
| - m_pausedContext.Clear(); |
| + } else if (event == v8::Exception) { |
| + v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(1); |
| + // Stack trace is empty in case of syntax error. Silently continue execution in such cases. |
| + if (!stackTrace->GetFrameCount()) |
| + return; |
| + v8::Handle<v8::Object> eventData = eventDetails.GetEventData(); |
| + v8::Handle<v8::Value> exceptionGetterValue = eventData->Get(v8::String::NewSymbol("exception")); |
| + ASSERT(!exceptionGetterValue.IsEmpty() && exceptionGetterValue->IsFunction()); |
| + v8::Handle<v8::Value> argv[] = { v8Undefined() }; |
| + V8RecursionScope::MicrotaskSuppression scope; |
| + v8::Handle<v8::Value> exception = v8::Handle<v8::Function>::Cast(exceptionGetterValue)->Call(eventData, 0, argv); |
| + |
| + breakProgram(eventDetails, exception, v8::Handle<v8::Array>()); |
| + } else if (event == v8::Break) { |
| + // v8::Context::Scope contextScope(v8::Debug::GetDebugContext()); |
|
yurys
2013/06/05 08:07:36
delete this line.
SeRya
2013/06/05 11:34:57
Done.
|
| + v8::Handle<v8::Function> getBreakpointNumbersFunction = v8::Local<v8::Function>::Cast(m_debuggerScript.get()->Get(v8::String::NewSymbol("getBreakpointNumbers"))); |
| + v8::Handle<v8::Value> argv[] = { eventDetails.GetEventData() }; |
| + v8::Handle<v8::Value> hitBreakpoints = getBreakpointNumbersFunction->Call(m_debuggerScript.get(), 1, argv); |
|
yurys
2013/06/05 08:07:36
1 -> ARRAY_SIZE(argv)
SeRya
2013/06/05 11:34:57
Done.
|
| + ASSERT(hitBreakpoints.IsArray()); |
| + |
| + breakProgram(eventDetails, v8::Handle<v8::Value>(), hitBreakpoints.As<v8::Array>()); |
| } |
| } |
| } |