summaryrefslogtreecommitdiffstats
path: root/src/3rdparty
diff options
context:
space:
mode:
authorJedrzej Nowacki <jedrzej.nowacki@nokia.com>2009-08-21 09:02:19 (GMT)
committerJedrzej Nowacki <jedrzej.nowacki@nokia.com>2009-08-21 09:39:20 (GMT)
commiteaa0ad5325c8f3af5f1de8ccd6a81d9599e07e51 (patch)
tree9d66f80e8f68b49eebf99689e3f51da5ab1a4d16 /src/3rdparty
parent2f877cfd438aebcc7da533c37a3825f65b5393ef (diff)
downloadQt-eaa0ad5325c8f3af5f1de8ccd6a81d9599e07e51.zip
Qt-eaa0ad5325c8f3af5f1de8ccd6a81d9599e07e51.tar.gz
Qt-eaa0ad5325c8f3af5f1de8ccd6a81d9599e07e51.tar.bz2
JSC::Debugger fix. Events exceptionThrow and functionExit modification
JSC::Debugger::exceptionThrow event was moved _before_ stacks unwinding so there is possibility to check stack state before it's deletion. Missing functionExit event was added in Interpreter::unwind() Reviewed-by: Kent Hansen
Diffstat (limited to 'src/3rdparty')
-rw-r--r--src/3rdparty/webkit/JavaScriptCore/interpreter/Interpreter.cpp36
1 files changed, 26 insertions, 10 deletions
diff --git a/src/3rdparty/webkit/JavaScriptCore/interpreter/Interpreter.cpp b/src/3rdparty/webkit/JavaScriptCore/interpreter/Interpreter.cpp
index c78466e..3af4a29 100644
--- a/src/3rdparty/webkit/JavaScriptCore/interpreter/Interpreter.cpp
+++ b/src/3rdparty/webkit/JavaScriptCore/interpreter/Interpreter.cpp
@@ -471,9 +471,12 @@ NEVER_INLINE bool Interpreter::unwindCallFrame(CallFrame*& callFrame, JSValue ex
if (Debugger* debugger = callFrame->dynamicGlobalObject()->debugger()) {
DebuggerCallFrame debuggerCallFrame(callFrame, exceptionValue);
- if (callFrame->callee())
+ if (callFrame->callee()) {
debugger->returnEvent(debuggerCallFrame, codeBlock->ownerNode()->sourceID(), codeBlock->ownerNode()->lastLine());
- else
+#ifdef QT_BUILD_SCRIPT_LIB
+ debugger->functionExit(exceptionValue, codeBlock->ownerNode()->sourceID());
+#endif
+ } else
debugger->didExecuteProgram(debuggerCallFrame, codeBlock->ownerNode()->sourceID(), codeBlock->ownerNode()->lastLine());
}
@@ -575,19 +578,32 @@ NEVER_INLINE HandlerInfo* Interpreter::throwException(CallFrame*& callFrame, JSV
// Calculate an exception handler vPC, unwinding call frames as necessary.
HandlerInfo* handler = 0;
- while (!(handler = codeBlock->handlerForBytecodeOffset(bytecodeOffset))) {
- if (!unwindCallFrame(callFrame, exceptionValue, bytecodeOffset, codeBlock)) {
+
#ifdef QT_BUILD_SCRIPT_LIB
- if (debugger)
- debugger->exceptionThrow(DebuggerCallFrame(callFrame, exceptionValue), codeBlock->ownerNode()->sourceID(),false);
-#endif
- return 0;
+ //try to find handler
+ bool hasHandler = true;
+ CallFrame *callFrameTemp = callFrame;
+ unsigned bytecodeOffsetTemp = bytecodeOffset;
+ CodeBlock *codeBlockTemp = codeBlock;
+ while (!(handler = codeBlockTemp->handlerForBytecodeOffset(bytecodeOffsetTemp))) {
+ callFrameTemp = callFrameTemp->callerFrame();
+ if (callFrameTemp->hasHostCallFrameFlag()) {
+ hasHandler = false;
+ break;
+ } else {
+ codeBlockTemp = callFrameTemp->codeBlock();
+ bytecodeOffsetTemp = bytecodeOffsetForPC(callFrameTemp, codeBlockTemp, callFrameTemp->returnPC());
}
}
-#ifdef QT_BUILD_SCRIPT_LIB
if (debugger)
- debugger->exceptionThrow(DebuggerCallFrame(callFrame, exceptionValue), codeBlock->ownerNode()->sourceID(),true);
+ debugger->exceptionThrow(DebuggerCallFrame(callFrame, exceptionValue), codeBlock->ownerNode()->sourceID(), hasHandler);
#endif
+
+ while (!(handler = codeBlock->handlerForBytecodeOffset(bytecodeOffset))) {
+ if (!unwindCallFrame(callFrame, exceptionValue, bytecodeOffset, codeBlock)) {
+ return 0;
+ }
+ }
// Now unwind the scope chain within the exception handler's call frame.
ScopeChainNode* scopeChain = callFrame->scopeChain();