Changeset 34182 in webkit for trunk/JavaScriptCore
- Timestamp:
- May 28, 2008, 1:47:13 PM (17 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r34180 r34182 1 2008-05-27 Geoffrey Garen <[email protected]> 2 3 Reviewed by Tim Hatcher. 4 5 Fixed https://bugs.webkit.org/show_bug.cgi?id=19183 6 REGRESSION (r33979): Crash in DebuggerCallFrame::functionName when 7 clicking button in returnEvent-crash.html 8 9 Added two new debugger hooks, willExecuteProgram and didExecuteProgram, 10 along with code to generate them, code to invoke them when unwinding 11 due to an exception, and code to dump them. 12 13 SunSpider reports no change. 14 15 * VM/CodeBlock.cpp: 16 (KJS::debugHookName): I had to mark this function NEVER_INLINE to avoid 17 a .4% performance regression. The mind boggles. 18 1 19 2008-05-28 Adam Roben <[email protected]> 2 20 -
trunk/JavaScriptCore/VM/CodeBlock.cpp
r34157 r34182 96 96 } 97 97 98 static const char* debugHookName(int debugHookID) 99 { 100 if (debugHookID == DidEnterCallFrame) 98 NEVER_INLINE static const char* debugHookName(int debugHookID) 99 { 100 switch((DebugHookID)debugHookID) { 101 case DidEnterCallFrame: 101 102 return "didEnterCallFrame"; 102 else if (debugHookID == WillLeaveCallFrame)103 case WillLeaveCallFrame: 103 104 return "willLeaveCallFrame"; 104 else { 105 ASSERT(debugHookID == WillExecuteStatement); 105 case WillExecuteStatement: 106 106 return "willExecuteStatement"; 107 } 107 case WillExecuteProgram: 108 return "willExecuteProgram"; 109 case DidExecuteProgram: 110 return "didExecuteProgram"; 111 } 112 113 ASSERT_NOT_REACHED(); 114 return ""; 108 115 } 109 116 -
trunk/JavaScriptCore/VM/Machine.cpp
r34172 r34182 565 565 { 566 566 CodeBlock* oldCodeBlock = codeBlock; 567 567 Register* callFrame = r - oldCodeBlock->numLocals - CallFrameHeaderSize; 568 568 569 if (Debugger* debugger = exec->dynamicGlobalObject()->debugger()) { 569 if (!isGlobalCallFrame(registerBase, r)) {570 DebuggerCallFrame debuggerCallFrame(this, exec->dynamicGlobalObject(), codeBlock, scopeChain, exceptionValue, registerBase, r - *registerBase);570 DebuggerCallFrame debuggerCallFrame(this, exec->dynamicGlobalObject(), codeBlock, scopeChain, exceptionValue, registerBase, r - *registerBase); 571 if (!isGlobalCallFrame(registerBase, r) && callFrame[Callee].u.jsObject) // Check for global and eval code 571 572 debugger->returnEvent(debuggerCallFrame, codeBlock->ownerNode->sourceId(), codeBlock->ownerNode->lastLine()); 572 } 573 } 574 575 Register* callFrame = r - oldCodeBlock->numLocals - CallFrameHeaderSize; 576 573 else 574 debugger->didExecuteProgram(debuggerCallFrame, codeBlock->ownerNode->sourceId(), codeBlock->ownerNode->lastLine()); 575 } 576 577 577 if (Profiler* profiler = *Profiler::enabledProfilerReference()) { 578 578 if (!isGlobalCallFrame(registerBase, r) && callFrame[Callee].u.jsObject) // Check for global and eval code … … 850 850 case WillExecuteStatement: { 851 851 debugger->atStatement(debuggerCallFrame, codeBlock->ownerNode->sourceId(), firstLine); 852 return; 853 } 854 case WillExecuteProgram: { 855 debugger->willExecuteProgram(debuggerCallFrame, codeBlock->ownerNode->sourceId(), lastLine); 856 return; 857 } 858 case DidExecuteProgram: { 859 debugger->didExecuteProgram(debuggerCallFrame, codeBlock->ownerNode->sourceId(), firstLine); 852 860 return; 853 861 } … … 2352 2360 /* debug debugHookID(n) firstLine(n) lastLine(n) 2353 2361 2354 Notifies the debugger of the current state of execution: 2355 didEnterCallFrame; willLeaveCallFrame; or willExecuteStatement. 2356 2357 This opcode is only generated while the debugger is attached. 2362 Notifies the debugger of the current state of execution. This opcode 2363 is only generated while the debugger is attached. 2358 2364 */ 2359 2365 -
trunk/JavaScriptCore/VM/Machine.h
r33979 r34182 48 48 49 49 enum DebugHookID { 50 WillExecuteStatement, 50 WillExecuteProgram, 51 DidExecuteProgram, 51 52 DidEnterCallFrame, 52 WillLeaveCallFrame 53 WillLeaveCallFrame, 54 WillExecuteStatement 53 55 }; 54 56 -
trunk/JavaScriptCore/kjs/debugger.h
r33979 r34182 165 165 virtual void returnEvent(const DebuggerCallFrame&, int sourceId, int lineno) = 0; 166 166 167 virtual void willExecuteProgram(const DebuggerCallFrame&, int sourceId, int lineno) = 0; 168 virtual void didExecuteProgram(const DebuggerCallFrame&, int sourceId, int lineno) = 0; 169 167 170 private: 168 171 HashSet<JSGlobalObject*> m_globalObjects; -
trunk/JavaScriptCore/kjs/nodes.cpp
r34177 r34182 5826 5826 RegisterID* EvalNode::emitCode(CodeGenerator& generator, RegisterID*) 5827 5827 { 5828 generator.emitDebugHook(WillExecuteProgram, firstLine(), lastLine()); 5829 5828 5830 RefPtr<RegisterID> dstRegister = generator.newTemporary(); 5829 5831 generator.emitLoad(dstRegister.get(), jsUndefined()); 5830 5832 statementListEmitCode(m_children, generator, dstRegister.get()); 5833 5834 generator.emitDebugHook(DidExecuteProgram, firstLine(), lastLine()); 5831 5835 generator.emitEnd(dstRegister.get()); 5832 5836 return 0; … … 5902 5906 RegisterID* ProgramNode::emitCode(CodeGenerator& generator, RegisterID*) 5903 5907 { 5908 generator.emitDebugHook(WillExecuteProgram, firstLine(), lastLine()); 5909 5904 5910 RefPtr<RegisterID> dstRegister = generator.newTemporary(); 5905 5911 generator.emitLoad(dstRegister.get(), jsUndefined()); 5906 5912 statementListEmitCode(m_children, generator, dstRegister.get()); 5913 5914 generator.emitDebugHook(DidExecuteProgram, firstLine(), lastLine()); 5907 5915 generator.emitEnd(dstRegister.get()); 5908 5916 return 0;
Note:
See TracChangeset
for help on using the changeset viewer.