OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2010-2011 Google Inc. All rights reserved. | 2 * Copyright (c) 2010-2011 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
399 void* p = v8::Handle<v8::External>::Cast(data)->Value(); | 399 void* p = v8::Handle<v8::External>::Cast(data)->Value(); |
400 return static_cast<ScriptDebugServer*>(p); | 400 return static_cast<ScriptDebugServer*>(p); |
401 } | 401 } |
402 | 402 |
403 v8::Handle<v8::Value> ScriptDebugServer::breakProgramCallback(const v8::Argument s& args) | 403 v8::Handle<v8::Value> ScriptDebugServer::breakProgramCallback(const v8::Argument s& args) |
404 { | 404 { |
405 ASSERT(2 == args.Length()); | 405 ASSERT(2 == args.Length()); |
406 | 406 |
407 ScriptDebugServer* thisPtr = toScriptDebugServer(args.Data()); | 407 ScriptDebugServer* thisPtr = toScriptDebugServer(args.Data()); |
408 v8::Handle<v8::Value> exception; | 408 v8::Handle<v8::Value> exception; |
409 thisPtr->breakProgram(v8::Handle<v8::Object>::Cast(args[0]), exception); | 409 v8::Handle<v8::Array> hitBreakPoints; |
410 thisPtr->breakProgram(v8::Handle<v8::Object>::Cast(args[0]), exception, hitB reakPoints); | |
410 return v8::Undefined(); | 411 return v8::Undefined(); |
411 } | 412 } |
412 | 413 |
413 void ScriptDebugServer::breakProgram(v8::Handle<v8::Object> executionState, v8:: Handle<v8::Value> exception) | 414 void ScriptDebugServer::breakProgram(v8::Handle<v8::Object> executionState, v8:: Handle<v8::Value> exception, v8::Handle<v8::Array> hitBreakpointNumbers) |
414 { | 415 { |
415 // Don't allow nested breaks. | 416 // Don't allow nested breaks. |
416 if (isPaused()) | 417 if (isPaused()) |
417 return; | 418 return; |
418 | 419 |
419 ScriptDebugListener* listener = getDebugListenerForContext(m_pausedContext); | 420 ScriptDebugListener* listener = getDebugListenerForContext(m_pausedContext); |
420 if (!listener) | 421 if (!listener) |
421 return; | 422 return; |
422 | 423 |
424 Vector<String> breakpointIDs; | |
425 if (!hitBreakpointNumbers.IsEmpty()) { | |
426 breakpointIDs.resize(hitBreakpointNumbers->Length()); | |
427 for (size_t i = 0; i < hitBreakpointNumbers->Length(); i++) | |
428 breakpointIDs[i] = toWebCoreStringWithUndefinedOrNullCheck(hitBreakp ointNumbers->Get(i)); | |
429 } | |
430 | |
423 m_executionState.set(executionState); | 431 m_executionState.set(executionState); |
424 ScriptState* currentCallFrameState = ScriptState::forContext(m_pausedContext ); | 432 ScriptState* currentCallFrameState = ScriptState::forContext(m_pausedContext ); |
425 listener->didPause(currentCallFrameState, currentCallFrame(), ScriptValue(ex ception)); | 433 listener->didPause(currentCallFrameState, currentCallFrame(), ScriptValue(ex ception), breakpointIDs); |
426 | 434 |
427 m_runningNestedMessageLoop = true; | 435 m_runningNestedMessageLoop = true; |
428 runMessageLoopOnPause(m_pausedContext); | 436 runMessageLoopOnPause(m_pausedContext); |
429 m_runningNestedMessageLoop = false; | 437 m_runningNestedMessageLoop = false; |
430 } | 438 } |
431 | 439 |
432 void ScriptDebugServer::v8DebugEventCallback(const v8::Debug::EventDetails& even tDetails) | 440 void ScriptDebugServer::v8DebugEventCallback(const v8::Debug::EventDetails& even tDetails) |
433 { | 441 { |
434 ScriptDebugServer* thisPtr = toScriptDebugServer(eventDetails.GetCallbackDat a()); | 442 ScriptDebugServer* thisPtr = toScriptDebugServer(eventDetails.GetCallbackDat a()); |
435 thisPtr->handleV8DebugEvent(eventDetails); | 443 thisPtr->handleV8DebugEvent(eventDetails); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
471 v8::Handle<v8::Value> scriptName = getScriptNameFunction->Call(m_deb uggerScript.get(), 1, argv1); | 479 v8::Handle<v8::Value> scriptName = getScriptNameFunction->Call(m_deb uggerScript.get(), 1, argv1); |
472 | 480 |
473 v8::Handle<v8::Function> setScriptSourceFunction = v8::Local<v8::Fun ction>::Cast(m_debuggerScript.get()->Get(v8::String::New("setScriptSource"))); | 481 v8::Handle<v8::Function> setScriptSourceFunction = v8::Local<v8::Fun ction>::Cast(m_debuggerScript.get()->Get(v8::String::New("setScriptSource"))); |
474 String patchedScript = preprocessor->preprocessSourceCode(toWebCoreS tringWithUndefinedOrNullCheck(script), toWebCoreStringWithUndefinedOrNullCheck(s criptName)); | 482 String patchedScript = preprocessor->preprocessSourceCode(toWebCoreS tringWithUndefinedOrNullCheck(script), toWebCoreStringWithUndefinedOrNullCheck(s criptName)); |
475 | 483 |
476 v8::Handle<v8::Value> argv2[] = { eventDetails.GetEventData(), v8Str ing(patchedScript, debugContext->GetIsolate()) }; | 484 v8::Handle<v8::Value> argv2[] = { eventDetails.GetEventData(), v8Str ing(patchedScript, debugContext->GetIsolate()) }; |
477 setScriptSourceFunction->Call(m_debuggerScript.get(), 2, argv2); | 485 setScriptSourceFunction->Call(m_debuggerScript.get(), 2, argv2); |
478 m_scriptPreprocessor = preprocessor.release(); | 486 m_scriptPreprocessor = preprocessor.release(); |
479 } else if (event == v8::AfterCompile) { | 487 } else if (event == v8::AfterCompile) { |
480 v8::Context::Scope contextScope(v8::Debug::GetDebugContext()); | 488 v8::Context::Scope contextScope(v8::Debug::GetDebugContext()); |
481 v8::Handle<v8::Function> onAfterCompileFunction = v8::Local<v8::Func tion>::Cast(m_debuggerScript.get()->Get(v8::String::NewSymbol("getAfterCompileSc ript"))); | 489 v8::Handle<v8::Function> getAfterCompileFunction = v8::Local<v8::Fun ction>::Cast(m_debuggerScript.get()->Get(v8::String::NewSymbol("getAfterCompileS cript"))); |
482 v8::Handle<v8::Value> argv[] = { eventDetails.GetEventData() }; | 490 v8::Handle<v8::Value> argv[] = { eventDetails.GetEventData() }; |
483 v8::Handle<v8::Value> value = onAfterCompileFunction->Call(m_debugge rScript.get(), 1, argv); | 491 v8::Handle<v8::Value> value = getAfterCompileFunction->Call(m_debugg erScript.get(), 1, argv); |
484 ASSERT(value->IsObject()); | 492 ASSERT(value->IsObject()); |
485 v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(value); | 493 v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(value); |
486 dispatchDidParseSource(listener, object); | 494 dispatchDidParseSource(listener, object); |
487 } else if (event == v8::Break || event == v8::Exception) { | 495 } else if (event == v8::Exception) { |
496 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackT race(1); | |
497 // Stack trace is empty in case of syntax error. Silently continue e xecution in such cases. | |
498 if (!stackTrace->GetFrameCount()) | |
499 return; | |
500 v8::Handle<v8::Object> eventData = eventDetails.GetEventData(); | |
501 v8::Handle<v8::Value> exceptionGetterValue = eventData->Get(v8::Stri ng::NewSymbol("exception")); | |
502 ASSERT(!exceptionGetterValue.IsEmpty() && exceptionGetterValue->IsFu nction()); | |
503 v8::Handle<v8::Value> argv[] = { v8Undefined() }; | |
504 V8RecursionScope::MicrotaskSuppression scope; | |
505 v8::Handle<v8::Value> exception = v8::Handle<v8::Function>::Cast(exc eptionGetterValue)->Call(eventData, 0, argv); | |
506 | |
507 v8::Handle<v8::Array> hitBreakpoints; | |
508 m_pausedContext = *eventContext; | |
509 breakProgram(eventDetails.GetExecutionState(), exception, hitBreakpo ints); | |
510 m_pausedContext.Clear(); | |
511 } else if (event == v8::Break) { | |
512 // v8::Context::Scope contextScope(v8::Debug::GetDebugContext()); | |
513 v8::Handle<v8::Function> getBreakpointNumbersFunction = v8::Local<v8 ::Function>::Cast(m_debuggerScript.get()->Get(v8::String::NewSymbol("getBreakpoi ntNumbers"))); | |
514 v8::Handle<v8::Value> argv[] = { eventDetails.GetEventData() }; | |
515 v8::Handle<v8::Value> hitBreakpoints = getBreakpointNumbersFunction- >Call(m_debuggerScript.get(), 1, argv); | |
516 ASSERT(hitBreakpoints.IsArray()); | |
517 | |
488 v8::Handle<v8::Value> exception; | 518 v8::Handle<v8::Value> exception; |
489 if (event == v8::Exception) { | |
490 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentSt ackTrace(1); | |
491 // Stack trace is empty in case of syntax error. Silently contin ue execution in such cases. | |
492 if (!stackTrace->GetFrameCount()) | |
493 return; | |
494 v8::Handle<v8::Object> eventData = eventDetails.GetEventData(); | |
495 v8::Handle<v8::Value> exceptionGetterValue = eventData->Get(v8:: String::NewSymbol("exception")); | |
496 ASSERT(!exceptionGetterValue.IsEmpty() && exceptionGetterValue-> IsFunction()); | |
497 v8::Handle<v8::Value> argv[] = { v8Undefined() }; | |
498 V8RecursionScope::MicrotaskSuppression scope; | |
499 exception = v8::Handle<v8::Function>::Cast(exceptionGetterValue) ->Call(eventData, 0, argv); | |
500 } | |
yurys
2013/05/16 19:52:53
Can you put breakpoint ids retrieval into else if
SeRya
2013/05/30 07:45:57
The code looks more clear for me without such an i
| |
501 | |
502 m_pausedContext = *eventContext; | 519 m_pausedContext = *eventContext; |
503 breakProgram(eventDetails.GetExecutionState(), exception); | 520 breakProgram(eventDetails.GetExecutionState(), exception, hitBreakpo ints.As<v8::Array>()); |
504 m_pausedContext.Clear(); | 521 m_pausedContext.Clear(); |
505 } | 522 } |
506 } | 523 } |
507 } | 524 } |
508 | 525 |
509 void ScriptDebugServer::dispatchDidParseSource(ScriptDebugListener* listener, v8 ::Handle<v8::Object> object) | 526 void ScriptDebugServer::dispatchDidParseSource(ScriptDebugListener* listener, v8 ::Handle<v8::Object> object) |
510 { | 527 { |
511 String sourceID = toWebCoreStringWithUndefinedOrNullCheck(object->Get(v8::St ring::NewSymbol("id"))); | 528 String sourceID = toWebCoreStringWithUndefinedOrNullCheck(object->Get(v8::St ring::NewSymbol("id"))); |
512 | 529 |
513 ScriptDebugListener::Script script; | 530 ScriptDebugListener::Script script; |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
633 *wasThrown = true; | 650 *wasThrown = true; |
634 *result = ScriptValue(tryCatch.Exception()); | 651 *result = ScriptValue(tryCatch.Exception()); |
635 v8::Local<v8::Message> message = tryCatch.Message(); | 652 v8::Local<v8::Message> message = tryCatch.Message(); |
636 if (!message.IsEmpty()) | 653 if (!message.IsEmpty()) |
637 *exceptionMessage = toWebCoreStringWithUndefinedOrNullCheck(message- >Get()); | 654 *exceptionMessage = toWebCoreStringWithUndefinedOrNullCheck(message- >Get()); |
638 } else | 655 } else |
639 *result = ScriptValue(value); | 656 *result = ScriptValue(value); |
640 } | 657 } |
641 | 658 |
642 } // namespace WebCore | 659 } // namespace WebCore |
OLD | NEW |