Changeset 156374 in webkit
- Timestamp:
- Sep 24, 2013, 4:52:57 PM (12 years ago)
- Location:
- trunk/Source
- Files:
-
- 25 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r156371 r156374 1 2013-09-24 Mark Lam <mark.lam@apple.com> 2 3 Change JSC debug hooks to pass a CallFrame* instead of a DebuggerCallFrame. 4 https://bugs.webkit.org/show_bug.cgi?id=121867. 5 6 Reviewed by Geoffrey Garen. 7 8 1. Removed the need for passing the line and column info to the debug hook 9 callbacks. We now get the line and column info from the CallFrame. 10 11 2. Simplify BytecodeGenerator::emitDebugHook() to only take 1 line number 12 argument. The caller can determine whether to pass in the first or last 13 line number of the block of source code as appropriate. 14 Note: we still need to pass in the line and column info to emitDebugHook() 15 because it uses this info to emit expression info which is later used by 16 the StackVisitor to determine the line and column info for its "pc". 17 18 3. Pass the exceptionValue explicitly to the exception() debug hook 19 callback. It should not be embedded in the CallFrame / DebuggerCallFrame. 20 21 4. Change the op_debug opcode size to 2 (from 5) since we've removing 3 arg 22 values. Update the LLINT and JIT code to handle this. 23 24 * bytecode/CodeBlock.cpp: 25 (JSC::CodeBlock::dumpBytecode): 26 (JSC::CodeBlock::CodeBlock): 27 * bytecode/Opcode.h: 28 (JSC::padOpcodeName): 29 * bytecompiler/BytecodeGenerator.cpp: 30 (JSC::BytecodeGenerator::emitDebugHook): 31 * bytecompiler/BytecodeGenerator.h: 32 * bytecompiler/NodesCodegen.cpp: 33 (JSC::ConstStatementNode::emitBytecode): 34 (JSC::EmptyStatementNode::emitBytecode): 35 (JSC::DebuggerStatementNode::emitBytecode): 36 (JSC::ExprStatementNode::emitBytecode): 37 (JSC::VarStatementNode::emitBytecode): 38 (JSC::IfElseNode::emitBytecode): 39 (JSC::DoWhileNode::emitBytecode): 40 (JSC::WhileNode::emitBytecode): 41 (JSC::ForNode::emitBytecode): 42 (JSC::ForInNode::emitBytecode): 43 (JSC::ContinueNode::emitBytecode): 44 (JSC::BreakNode::emitBytecode): 45 (JSC::ReturnNode::emitBytecode): 46 (JSC::WithNode::emitBytecode): 47 (JSC::SwitchNode::emitBytecode): 48 (JSC::LabelNode::emitBytecode): 49 (JSC::ThrowNode::emitBytecode): 50 (JSC::TryNode::emitBytecode): 51 (JSC::ProgramNode::emitBytecode): 52 (JSC::EvalNode::emitBytecode): 53 (JSC::FunctionBodyNode::emitBytecode): 54 * debugger/Debugger.h: 55 * debugger/DebuggerCallFrame.cpp: 56 (JSC::LineAndColumnFunctor::operator()): 57 (JSC::LineAndColumnFunctor::line): 58 (JSC::LineAndColumnFunctor::column): 59 (JSC::DebuggerCallFrame::DebuggerCallFrame): 60 (JSC::DebuggerCallFrame::clear): 61 * debugger/DebuggerCallFrame.h: 62 (JSC::DebuggerCallFrame::line): 63 (JSC::DebuggerCallFrame::column): 64 * interpreter/Interpreter.cpp: 65 (JSC::unwindCallFrame): 66 (JSC::UnwindFunctor::UnwindFunctor): 67 (JSC::UnwindFunctor::operator()): 68 (JSC::Interpreter::unwind): 69 (JSC::Interpreter::debug): 70 * interpreter/Interpreter.h: 71 * jit/JITOpcodes.cpp: 72 (JSC::JIT::emit_op_debug): 73 * jit/JITOpcodes32_64.cpp: 74 (JSC::JIT::emit_op_debug): 75 * jit/JITStubs.cpp: 76 (JSC::DEFINE_STUB_FUNCTION): 77 * llint/LLIntSlowPaths.cpp: 78 (JSC::LLInt::LLINT_SLOW_PATH_DECL): 79 * llint/LowLevelInterpreter.asm: 80 1 81 2013-09-24 Filip Pizlo <fpizlo@apple.com> 2 82 -
trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp
r156300 r156374 1326 1326 case op_debug: { 1327 1327 int debugHookID = (++it)->u.operand; 1328 int firstLine = (++it)->u.operand;1329 int lastLine = (++it)->u.operand;1330 int column = (++it)->u.operand;1331 1328 printLocationAndOp(out, exec, location, it, "debug"); 1332 out.printf("%s , %d, %d, %d", debugHookName(debugHookID), firstLine, lastLine, column);1329 out.printf("%s", debugHookName(debugHookID)); 1333 1330 break; 1334 1331 } … … 1872 1869 instructions[i + 5].u.structure.set(*vm(), ownerExecutable, op.structure); 1873 1870 instructions[i + 6].u.pointer = reinterpret_cast<void*>(op.operand); 1874 break;1875 }1876 1877 case op_debug: {1878 instructions[i + 4] = columnNumberForBytecodeOffset(i);1879 1871 break; 1880 1872 } -
trunk/Source/JavaScriptCore/bytecode/Opcode.h
r153221 r156374 181 181 macro(op_throw_static_error, 3) \ 182 182 \ 183 macro(op_debug, 5) \183 macro(op_debug, 2) \ 184 184 macro(op_profile_will_call, 2) \ 185 185 macro(op_profile_did_call, 2) \ -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
r156079 r156374 1859 1859 } 1860 1860 1861 void BytecodeGenerator::emitDebugHook(DebugHookID debugHookID, unsigned firstLine, unsigned lastLine, unsigned charOffset, unsigned lineStart)1861 void BytecodeGenerator::emitDebugHook(DebugHookID debugHookID, unsigned line, unsigned charOffset, unsigned lineStart) 1862 1862 { 1863 1863 #if ENABLE(DEBUG_WITH_BREAKPOINT) … … 1868 1868 return; 1869 1869 #endif 1870 JSTextPosition divot( firstLine, charOffset, lineStart);1870 JSTextPosition divot(line, charOffset, lineStart); 1871 1871 emitExpressionInfo(divot, divot, divot); 1872 unsigned charPosition = charOffset - m_scopeNode->source().startOffset();1873 1872 emitOpcode(op_debug); 1874 1873 instructions().append(debugHookID); 1875 instructions().append(firstLine);1876 instructions().append(lastLine);1877 instructions().append(charPosition);1878 1874 } 1879 1875 -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
r155711 r156374 406 406 void emitPopScope(); 407 407 408 void emitDebugHook(DebugHookID, unsigned firstLine, unsigned lastLine, unsigned charOffset, unsigned lineStart);408 void emitDebugHook(DebugHookID, unsigned line, unsigned charOffset, unsigned lineStart); 409 409 410 410 int scopeDepth() { return m_localScopeDepth + m_finallyDepth; } -
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r155724 r156374 1445 1445 void ConstStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID*) 1446 1446 { 1447 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(),startOffset(), lineStartOffset());1447 generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset()); 1448 1448 generator.emitNode(m_next); 1449 1449 } … … 1488 1488 void EmptyStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID*) 1489 1489 { 1490 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(),startOffset(), lineStartOffset());1490 generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset()); 1491 1491 } 1492 1492 … … 1495 1495 void DebuggerStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID*) 1496 1496 { 1497 generator.emitDebugHook(DidReachBreakpoint, firstLine(),lastLine(), startOffset(), lineStartOffset());1497 generator.emitDebugHook(DidReachBreakpoint, lastLine(), startOffset(), lineStartOffset()); 1498 1498 } 1499 1499 … … 1503 1503 { 1504 1504 ASSERT(m_expr); 1505 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(),startOffset(), lineStartOffset());1505 generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset()); 1506 1506 generator.emitNode(dst, m_expr); 1507 1507 } … … 1512 1512 { 1513 1513 ASSERT(m_expr); 1514 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(),startOffset(), lineStartOffset());1514 generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset()); 1515 1515 generator.emitNode(m_expr); 1516 1516 } … … 1557 1557 void IfElseNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 1558 1558 { 1559 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(),startOffset(), lineStartOffset());1559 generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset()); 1560 1560 1561 1561 RefPtr<Label> beforeThen = generator.newLabel(); … … 1594 1594 generator.emitLabel(topOfLoop.get()); 1595 1595 generator.emitLoopHint(); 1596 generator.emitDebugHook(WillExecuteStatement, lastLine(), lastLine(),startOffset(), lineStartOffset());1596 generator.emitDebugHook(WillExecuteStatement, lastLine(), startOffset(), lineStartOffset()); 1597 1597 1598 1598 generator.emitNode(dst, m_statement); 1599 1599 1600 1600 generator.emitLabel(scope->continueTarget()); 1601 generator.emitDebugHook(WillExecuteStatement, lastLine(), lastLine(),startOffset(), lineStartOffset());1601 generator.emitDebugHook(WillExecuteStatement, lastLine(), startOffset(), lineStartOffset()); 1602 1602 generator.emitNodeInConditionContext(m_expr, topOfLoop.get(), scope->breakTarget(), FallThroughMeansFalse); 1603 1603 … … 1612 1612 RefPtr<Label> topOfLoop = generator.newLabel(); 1613 1613 1614 generator.emitDebugHook(WillExecuteStatement, m_expr->lineNo(), m_expr-> lineNo(), m_expr->startOffset(), m_expr->lineStartOffset());1614 generator.emitDebugHook(WillExecuteStatement, m_expr->lineNo(), m_expr->startOffset(), m_expr->lineStartOffset()); 1615 1615 generator.emitNodeInConditionContext(m_expr, topOfLoop.get(), scope->breakTarget(), FallThroughMeansTrue); 1616 1616 … … 1621 1621 1622 1622 generator.emitLabel(scope->continueTarget()); 1623 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(),startOffset(), lineStartOffset());1623 generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset()); 1624 1624 1625 1625 generator.emitNodeInConditionContext(m_expr, topOfLoop.get(), scope->breakTarget(), FallThroughMeansFalse); … … 1634 1634 LabelScopePtr scope = generator.newLabelScope(LabelScope::Loop); 1635 1635 1636 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(),startOffset(), lineStartOffset());1636 generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset()); 1637 1637 1638 1638 if (m_expr1) … … 1649 1649 1650 1650 generator.emitLabel(scope->continueTarget()); 1651 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(),startOffset(), lineStartOffset());1651 generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset()); 1652 1652 if (m_expr3) 1653 1653 generator.emitNode(generator.ignoredResult(), m_expr3); … … 1672 1672 } 1673 1673 1674 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(),startOffset(), lineStartOffset());1674 generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset()); 1675 1675 1676 1676 RefPtr<RegisterID> base = generator.newTemporary(); … … 1733 1733 generator.emitLabel(scope->continueTarget()); 1734 1734 generator.emitNextPropertyName(propertyName, base.get(), i.get(), size.get(), iter.get(), loopStart.get()); 1735 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(),startOffset(), lineStartOffset());1735 generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset()); 1736 1736 generator.emitLabel(scope->breakTarget()); 1737 1737 } … … 1755 1755 void ContinueNode::emitBytecode(BytecodeGenerator& generator, RegisterID*) 1756 1756 { 1757 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(),startOffset(), lineStartOffset());1757 generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset()); 1758 1758 1759 1759 LabelScope* scope = generator.continueTarget(m_ident); … … 1782 1782 void BreakNode::emitBytecode(BytecodeGenerator& generator, RegisterID*) 1783 1783 { 1784 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(),startOffset(), lineStartOffset());1784 generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset()); 1785 1785 1786 1786 LabelScope* scope = generator.breakTarget(m_ident); … … 1795 1795 void ReturnNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 1796 1796 { 1797 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(),startOffset(), lineStartOffset());1797 generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset()); 1798 1798 ASSERT(generator.codeType() == FunctionCode); 1799 1799 … … 1807 1807 } 1808 1808 1809 generator.emitDebugHook(WillLeaveCallFrame, firstLine(),lastLine(), startOffset(), lineStartOffset());1809 generator.emitDebugHook(WillLeaveCallFrame, lastLine(), startOffset(), lineStartOffset()); 1810 1810 generator.emitReturn(returnRegister.get()); 1811 1811 } … … 1815 1815 void WithNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 1816 1816 { 1817 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(),startOffset(), lineStartOffset());1817 generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset()); 1818 1818 1819 1819 RefPtr<RegisterID> scope = generator.emitNode(m_expr); … … 1989 1989 void SwitchNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 1990 1990 { 1991 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(),startOffset(), lineStartOffset());1991 generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset()); 1992 1992 1993 1993 LabelScopePtr scope = generator.newLabelScope(LabelScope::Switch); … … 2003 2003 void LabelNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 2004 2004 { 2005 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(),startOffset(), lineStartOffset());2005 generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset()); 2006 2006 2007 2007 ASSERT(!generator.breakTarget(m_name)); … … 2017 2017 void ThrowNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 2018 2018 { 2019 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(),startOffset(), lineStartOffset());2019 generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset()); 2020 2020 2021 2021 if (dst == generator.ignoredResult()) … … 2033 2033 // optimizer knows they may be jumped to from anywhere. 2034 2034 2035 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(),startOffset(), lineStartOffset());2035 generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset()); 2036 2036 2037 2037 ASSERT(m_catchBlock || m_finallyBlock); … … 2101 2101 void ProgramNode::emitBytecode(BytecodeGenerator& generator, RegisterID*) 2102 2102 { 2103 generator.emitDebugHook(WillExecuteProgram, startLine(), start Line(), startStartOffset(), startLineStartOffset());2103 generator.emitDebugHook(WillExecuteProgram, startLine(), startStartOffset(), startLineStartOffset()); 2104 2104 2105 2105 RefPtr<RegisterID> dstRegister = generator.newTemporary(); … … 2107 2107 emitStatementsBytecode(generator, dstRegister.get()); 2108 2108 2109 generator.emitDebugHook(DidExecuteProgram, lastLine(), lastLine(),startOffset(), lineStartOffset());2109 generator.emitDebugHook(DidExecuteProgram, lastLine(), startOffset(), lineStartOffset()); 2110 2110 generator.emitEnd(dstRegister.get()); 2111 2111 } … … 2115 2115 void EvalNode::emitBytecode(BytecodeGenerator& generator, RegisterID*) 2116 2116 { 2117 generator.emitDebugHook(WillExecuteProgram, startLine(), start Line(), startStartOffset(), startLineStartOffset());2117 generator.emitDebugHook(WillExecuteProgram, startLine(), startStartOffset(), startLineStartOffset()); 2118 2118 2119 2119 RefPtr<RegisterID> dstRegister = generator.newTemporary(); … … 2121 2121 emitStatementsBytecode(generator, dstRegister.get()); 2122 2122 2123 generator.emitDebugHook(DidExecuteProgram, lastLine(), lastLine(),startOffset(), lineStartOffset());2123 generator.emitDebugHook(DidExecuteProgram, lastLine(), startOffset(), lineStartOffset()); 2124 2124 generator.emitEnd(dstRegister.get()); 2125 2125 } … … 2129 2129 void FunctionBodyNode::emitBytecode(BytecodeGenerator& generator, RegisterID*) 2130 2130 { 2131 generator.emitDebugHook(DidEnterCallFrame, startLine(), start Line(), startStartOffset(), startLineStartOffset());2131 generator.emitDebugHook(DidEnterCallFrame, startLine(), startStartOffset(), startLineStartOffset()); 2132 2132 emitStatementsBytecode(generator, generator.ignoredResult()); 2133 2133 … … 2146 2146 RegisterID* r0 = generator.isConstructor() ? generator.thisRegister() : generator.emitLoad(0, jsUndefined()); 2147 2147 ASSERT((startOffset() - 1) >= lineStartOffset()); 2148 generator.emitDebugHook(WillLeaveCallFrame, lastLine(), lastLine(),startOffset() - 1, lineStartOffset());2148 generator.emitDebugHook(WillLeaveCallFrame, lastLine(), startOffset() - 1, lineStartOffset()); 2149 2149 generator.emitReturn(r0); 2150 2150 return; -
trunk/Source/JavaScriptCore/debugger/Debugger.h
r155622 r156374 34 34 class SourceProvider; 35 35 36 typedef ExecState CallFrame; 37 36 38 class JS_EXPORT_PRIVATE Debugger { 37 39 public: … … 43 45 virtual void sourceParsed(ExecState*, SourceProvider*, int errorLineNumber, const WTF::String& errorMessage) = 0; 44 46 45 virtual void exception( const DebuggerCallFrame&, bool) = 0;46 virtual void atStatement( const DebuggerCallFrame&) = 0;47 virtual void callEvent( const DebuggerCallFrame&) = 0;48 virtual void returnEvent( const DebuggerCallFrame&) = 0;47 virtual void exception(CallFrame*, JSValue exceptionValue, bool hasHandler) = 0; 48 virtual void atStatement(CallFrame*) = 0; 49 virtual void callEvent(CallFrame*) = 0; 50 virtual void returnEvent(CallFrame*) = 0; 49 51 50 virtual void willExecuteProgram( const DebuggerCallFrame&) = 0;51 virtual void didExecuteProgram( const DebuggerCallFrame&) = 0;52 virtual void didReachBreakpoint( const DebuggerCallFrame&) = 0;52 virtual void willExecuteProgram(CallFrame*) = 0; 53 virtual void didExecuteProgram(CallFrame*) = 0; 54 virtual void didReachBreakpoint(CallFrame*) = 0; 53 55 54 56 void recompileAllJSFunctions(VM*); -
trunk/Source/JavaScriptCore/debugger/DebuggerCallFrame.cpp
r155622 r156374 35 35 #include "Operations.h" 36 36 #include "Parser.h" 37 #include "StackVisitor.h" 37 38 38 39 namespace JSC { 40 41 class LineAndColumnFunctor { 42 public: 43 StackVisitor::Status operator()(StackVisitor& visitor) 44 { 45 visitor->computeLineAndColumn(m_line, m_column); 46 return StackVisitor::Done; 47 } 48 49 unsigned line() const { return m_line; } 50 unsigned column() const { return m_column; } 51 52 private: 53 unsigned m_line; 54 unsigned m_column; 55 }; 56 57 DebuggerCallFrame::DebuggerCallFrame(CallFrame* callFrame) 58 : m_callFrame(callFrame) 59 { 60 LineAndColumnFunctor functor; 61 m_callFrame->iterate(functor); 62 m_line = functor.line(); 63 m_column = functor.column(); 64 } 39 65 40 66 intptr_t DebuggerCallFrame::sourceId() const … … 115 141 { 116 142 m_callFrame = 0; 117 m_exception = JSValue();118 143 } 119 144 -
trunk/Source/JavaScriptCore/debugger/DebuggerCallFrame.h
r155622 r156374 38 38 enum Type { ProgramType, FunctionType }; 39 39 40 DebuggerCallFrame(CallFrame* callFrame, int line, int column) 41 : m_callFrame(callFrame) 42 , m_line(line) 43 , m_column(column) 44 { 45 } 46 47 DebuggerCallFrame(CallFrame* callFrame, int line, int column, JSValue exception) 48 : m_callFrame(callFrame) 49 , m_line(line) 50 , m_column(column) 51 , m_exception(exception) 52 { 53 } 40 JS_EXPORT_PRIVATE explicit DebuggerCallFrame(CallFrame*); 54 41 55 42 CallFrame* callFrame() const { return m_callFrame; } 56 43 JS_EXPORT_PRIVATE intptr_t sourceId() const; 57 intline() const { return m_line; }58 intcolumn() const { return m_column; }44 unsigned line() const { return m_line; } 45 unsigned column() const { return m_column; } 59 46 JSGlobalObject* dynamicGlobalObject() const { return m_callFrame->dynamicGlobalObject(); } 60 47 JSScope* scope() const { return m_callFrame->scope(); } … … 64 51 JS_EXPORT_PRIVATE JSObject* thisObject() const; 65 52 JS_EXPORT_PRIVATE JSValue evaluate(const String&, JSValue& exception) const; 66 JSValue exception() const { return m_exception; }67 53 68 54 void clear(); … … 70 56 private: 71 57 CallFrame* m_callFrame; 72 int m_line; 73 int m_column; 74 JSValue m_exception; 58 unsigned m_line; 59 unsigned m_column; 75 60 }; 76 61 -
trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp
r156242 r156374 390 390 } 391 391 392 static bool unwindCallFrame(StackVisitor& visitor , JSValue exceptionValue)392 static bool unwindCallFrame(StackVisitor& visitor) 393 393 { 394 394 CallFrame* callFrame = visitor->callFrame(); … … 398 398 399 399 if (Debugger* debugger = callFrame->dynamicGlobalObject()->debugger()) { 400 int line = codeBlock->ownerExecutable()->lastLine();401 DebuggerCallFrame debuggerCallFrame(callFrame, line, 0, exceptionValue);402 400 if (callFrame->callee()) 403 debugger->returnEvent( debuggerCallFrame);401 debugger->returnEvent(callFrame); 404 402 else 405 debugger->didExecuteProgram( debuggerCallFrame);403 debugger->didExecuteProgram(callFrame); 406 404 } 407 405 … … 604 602 class UnwindFunctor { 605 603 public: 606 UnwindFunctor(CallFrame*& callFrame, JSValue& exceptionValue,bool isTermination, CodeBlock*& codeBlock, HandlerInfo*& handler)604 UnwindFunctor(CallFrame*& callFrame, bool isTermination, CodeBlock*& codeBlock, HandlerInfo*& handler) 607 605 : m_callFrame(callFrame) 608 , m_exceptionValue(exceptionValue)609 606 , m_isTermination(isTermination) 610 607 , m_codeBlock(codeBlock) … … 621 618 622 619 if (m_isTermination || !(m_handler = m_codeBlock->handlerForBytecodeOffset(bytecodeOffset))) { 623 if (!unwindCallFrame(visitor , m_exceptionValue)) {620 if (!unwindCallFrame(visitor)) { 624 621 if (LegacyProfiler* profiler = vm.enabledProfiler()) 625 622 profiler->exceptionUnwind(m_callFrame); … … 634 631 private: 635 632 CallFrame*& m_callFrame; 636 JSValue& m_exceptionValue;637 633 bool m_isTermination; 638 634 CodeBlock*& m_codeBlock; … … 667 663 // frames. 668 664 // https://bugs.webkit.org/show_bug.cgi?id=121754 669 unsigned bytecodeOffset = callFrame->bytecodeOffset();670 int line = codeBlock->lineNumberForBytecodeOffset(bytecodeOffset);671 int column = codeBlock->columnNumberForBytecodeOffset(bytecodeOffset);672 DebuggerCallFrame debuggerCallFrame(callFrame, line, column, exceptionValue);673 665 674 666 bool hasHandler; … … 681 673 } 682 674 683 debugger->exception( debuggerCallFrame, hasHandler);675 debugger->exception(callFrame, exceptionValue, hasHandler); 684 676 } 685 677 … … 688 680 VM& vm = callFrame->vm(); 689 681 ASSERT(callFrame == vm.topCallFrame); 690 UnwindFunctor functor(callFrame, exceptionValue,isTermination, codeBlock, handler);682 UnwindFunctor functor(callFrame, isTermination, codeBlock, handler); 691 683 callFrame->iterate(functor); 692 684 if (!handler) … … 1261 1253 } 1262 1254 1263 NEVER_INLINE void Interpreter::debug(CallFrame* callFrame, DebugHookID debugHookID , int firstLine, int lastLine, int column)1255 NEVER_INLINE void Interpreter::debug(CallFrame* callFrame, DebugHookID debugHookID) 1264 1256 { 1265 1257 Debugger* debugger = callFrame->dynamicGlobalObject()->debugger(); … … 1269 1261 switch (debugHookID) { 1270 1262 case DidEnterCallFrame: 1271 debugger->callEvent( DebuggerCallFrame(callFrame, firstLine, column));1263 debugger->callEvent(callFrame); 1272 1264 return; 1273 1265 case WillLeaveCallFrame: 1274 debugger->returnEvent( DebuggerCallFrame(callFrame, lastLine, column));1266 debugger->returnEvent(callFrame); 1275 1267 return; 1276 1268 case WillExecuteStatement: 1277 debugger->atStatement( DebuggerCallFrame(callFrame, firstLine, column));1269 debugger->atStatement(callFrame); 1278 1270 return; 1279 1271 case WillExecuteProgram: 1280 debugger->willExecuteProgram( DebuggerCallFrame(callFrame, firstLine, column));1272 debugger->willExecuteProgram(callFrame); 1281 1273 return; 1282 1274 case DidExecuteProgram: 1283 debugger->didExecuteProgram( DebuggerCallFrame(callFrame, lastLine, column));1275 debugger->didExecuteProgram(callFrame); 1284 1276 return; 1285 1277 case DidReachBreakpoint: 1286 debugger->didReachBreakpoint( DebuggerCallFrame(callFrame, lastLine, column));1278 debugger->didReachBreakpoint(callFrame); 1287 1279 return; 1288 1280 } -
trunk/Source/JavaScriptCore/interpreter/Interpreter.h
r156242 r156374 240 240 241 241 NEVER_INLINE HandlerInfo* unwind(CallFrame*&, JSValue&); 242 NEVER_INLINE void debug(CallFrame*, DebugHookID , int firstLine, int lastLine, int column);242 NEVER_INLINE void debug(CallFrame*, DebugHookID); 243 243 JSString* stackTraceAsString(ExecState*, Vector<StackFrame>); 244 244 -
trunk/Source/JavaScriptCore/jit/JITOpcodes.cpp
r155711 r156374 758 758 JITStubCall stubCall(this, cti_op_debug); 759 759 stubCall.addArgument(TrustedImm32(currentInstruction[1].u.operand)); 760 stubCall.addArgument(TrustedImm32(currentInstruction[2].u.operand));761 stubCall.addArgument(TrustedImm32(currentInstruction[3].u.operand));762 stubCall.addArgument(TrustedImm32(currentInstruction[4].u.operand));763 760 stubCall.call(); 764 761 #endif -
trunk/Source/JavaScriptCore/jit/JITOpcodes32_64.cpp
r155711 r156374 1084 1084 JITStubCall stubCall(this, cti_op_debug); 1085 1085 stubCall.addArgument(Imm32(currentInstruction[1].u.operand)); 1086 stubCall.addArgument(Imm32(currentInstruction[2].u.operand));1087 stubCall.addArgument(Imm32(currentInstruction[3].u.operand));1088 stubCall.addArgument(Imm32(currentInstruction[4].u.operand));1089 1086 stubCall.call(); 1090 1087 #endif -
trunk/Source/JavaScriptCore/jit/JITStubs.cpp
r156242 r156374 2148 2148 2149 2149 int debugHookID = stackFrame.args[0].int32(); 2150 int firstLine = stackFrame.args[1].int32(); 2151 int lastLine = stackFrame.args[2].int32(); 2152 int column = stackFrame.args[3].int32(); 2153 2154 stackFrame.vm->interpreter->debug(callFrame, static_cast<DebugHookID>(debugHookID), firstLine, lastLine, column); 2150 stackFrame.vm->interpreter->debug(callFrame, static_cast<DebugHookID>(debugHookID)); 2155 2151 } 2156 2152 -
trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp
r156242 r156374 1240 1240 LLINT_BEGIN(); 1241 1241 int debugHookID = pc[1].u.operand; 1242 int firstLine = pc[2].u.operand; 1243 int lastLine = pc[3].u.operand; 1244 int column = pc[4].u.operand; 1245 1246 vm.interpreter->debug(exec, static_cast<DebugHookID>(debugHookID), firstLine, lastLine, column); 1242 vm.interpreter->debug(exec, static_cast<DebugHookID>(debugHookID)); 1247 1243 1248 1244 LLINT_END(); -
trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm
r155711 r156374 796 796 traceExecution() 797 797 callSlowPath(_llint_slow_path_debug) 798 dispatch( 5)798 dispatch(2) 799 799 800 800 -
trunk/Source/WebCore/ChangeLog
r156372 r156374 1 2013-09-24 Mark Lam <mark.lam@apple.com> 2 3 Change JSC debug hooks to pass a CallFrame* instead of a DebuggerCallFrame. 4 https://bugs.webkit.org/show_bug.cgi?id=121867. 5 6 Reviewed by Geoffrey Garen. 7 8 No new tests. 9 10 * bindings/js/ScriptDebugServer.cpp: 11 (WebCore::ScriptDebugServer::createCallFrame): 12 (WebCore::ScriptDebugServer::updateCallFrameAndPauseIfNeeded): 13 (WebCore::ScriptDebugServer::callEvent): 14 (WebCore::ScriptDebugServer::atStatement): 15 (WebCore::ScriptDebugServer::returnEvent): 16 (WebCore::ScriptDebugServer::exception): 17 (WebCore::ScriptDebugServer::willExecuteProgram): 18 (WebCore::ScriptDebugServer::didExecuteProgram): 19 (WebCore::ScriptDebugServer::didReachBreakpoint): 20 * bindings/js/ScriptDebugServer.h: 21 * bindings/js/WorkerScriptDebugServer.cpp: 22 (WebCore::WorkerScriptDebugServer::willExecuteProgram): 23 * bindings/js/WorkerScriptDebugServer.h: 24 1 25 2013-09-24 Andreas Kling <akling@apple.com> 2 26 -
trunk/Source/WebCore/bindings/js/ScriptDebugServer.cpp
r155736 r156374 430 430 } 431 431 432 void ScriptDebugServer::createCallFrame( const DebuggerCallFrame& debuggerCallFrame)433 { 434 intptr_t sourceId = debuggerCallFrame.sourceId();432 void ScriptDebugServer::createCallFrame(CallFrame* callFrame) 433 { 434 DebuggerCallFrame debuggerCallFrame(callFrame); 435 435 m_currentCallFrame = JavaScriptCallFrame::create(debuggerCallFrame, m_currentCallFrame); 436 intptr_t sourceId = m_currentCallFrame->sourceID(); 436 437 if (m_lastExecutedSourceId != sourceId) { 437 438 m_lastExecutedLine = -1; … … 440 441 } 441 442 442 void ScriptDebugServer::updateCallFrameAndPauseIfNeeded( const DebuggerCallFrame& debuggerCallFrame)443 void ScriptDebugServer::updateCallFrameAndPauseIfNeeded(CallFrame* callFrame) 443 444 { 444 445 // ASSERT(m_currentCallFrame); … … 446 447 return; 447 448 448 m_currentCallFrame->update( debuggerCallFrame);449 pauseIfNeeded( debuggerCallFrame.dynamicGlobalObject());449 m_currentCallFrame->update(DebuggerCallFrame(callFrame)); 450 pauseIfNeeded(callFrame->dynamicGlobalObject()); 450 451 } 451 452 … … 493 494 } 494 495 495 void ScriptDebugServer::callEvent( const DebuggerCallFrame& debuggerCallFrame)496 void ScriptDebugServer::callEvent(CallFrame* callFrame) 496 497 { 497 498 if (!m_paused) { 498 createCallFrame( debuggerCallFrame);499 pauseIfNeeded( debuggerCallFrame.dynamicGlobalObject());500 } 501 } 502 503 void ScriptDebugServer::atStatement( const DebuggerCallFrame& debuggerCallFrame)499 createCallFrame(callFrame); 500 pauseIfNeeded(callFrame->dynamicGlobalObject()); 501 } 502 } 503 504 void ScriptDebugServer::atStatement(CallFrame* callFrame) 504 505 { 505 506 if (!m_paused) 506 updateCallFrameAndPauseIfNeeded( debuggerCallFrame);507 } 508 509 void ScriptDebugServer::returnEvent( const DebuggerCallFrame& debuggerCallFrame)507 updateCallFrameAndPauseIfNeeded(callFrame); 508 } 509 510 void ScriptDebugServer::returnEvent(CallFrame* callFrame) 510 511 { 511 512 if (m_paused) 512 513 return; 513 514 514 updateCallFrameAndPauseIfNeeded( debuggerCallFrame);515 updateCallFrameAndPauseIfNeeded(callFrame); 515 516 516 517 // detach may have been called during pauseIfNeeded … … 524 525 } 525 526 526 void ScriptDebugServer::exception( const DebuggerCallFrame& debuggerCallFrame, bool hasHandler)527 void ScriptDebugServer::exception(CallFrame* callFrame, JSValue, bool hasHandler) 527 528 { 528 529 if (m_paused) … … 532 533 m_pauseOnNextStatement = true; 533 534 534 updateCallFrameAndPauseIfNeeded( debuggerCallFrame);535 } 536 537 void ScriptDebugServer::willExecuteProgram( const DebuggerCallFrame& debuggerCallFrame)535 updateCallFrameAndPauseIfNeeded(callFrame); 536 } 537 538 void ScriptDebugServer::willExecuteProgram(CallFrame* callFrame) 538 539 { 539 540 if (!m_paused) { 540 createCallFrame( debuggerCallFrame);541 pauseIfNeeded( debuggerCallFrame.dynamicGlobalObject());542 } 543 } 544 545 void ScriptDebugServer::didExecuteProgram( const DebuggerCallFrame& debuggerCallFrame)541 createCallFrame(callFrame); 542 pauseIfNeeded(callFrame->dynamicGlobalObject()); 543 } 544 } 545 546 void ScriptDebugServer::didExecuteProgram(CallFrame* callFrame) 546 547 { 547 548 if (m_paused) 548 549 return; 549 550 550 updateCallFrameAndPauseIfNeeded( debuggerCallFrame);551 updateCallFrameAndPauseIfNeeded(callFrame); 551 552 552 553 // Treat stepping over the end of a program like stepping out. … … 561 562 } 562 563 563 void ScriptDebugServer::didReachBreakpoint( const DebuggerCallFrame& debuggerCallFrame)564 void ScriptDebugServer::didReachBreakpoint(CallFrame* callFrame) 564 565 { 565 566 if (m_paused) … … 567 568 568 569 m_pauseOnNextStatement = true; 569 updateCallFrameAndPauseIfNeeded( debuggerCallFrame);570 updateCallFrameAndPauseIfNeeded(callFrame); 570 571 } 571 572 -
trunk/Source/WebCore/bindings/js/ScriptDebugServer.h
r155736 r156374 136 136 void dispatchFailedToParseSource(const ListenerSet& listeners, JSC::SourceProvider*, int errorLine, const String& errorMessage); 137 137 138 void createCallFrame( const JSC::DebuggerCallFrame&);139 void updateCallFrameAndPauseIfNeeded( const JSC::DebuggerCallFrame&);138 void createCallFrame(JSC::CallFrame*); 139 void updateCallFrameAndPauseIfNeeded(JSC::CallFrame*); 140 140 void pauseIfNeeded(JSC::JSGlobalObject* dynamicGlobalObject); 141 141 142 virtual void detach(JSC::JSGlobalObject*) ;142 virtual void detach(JSC::JSGlobalObject*) OVERRIDE; 143 143 144 virtual void sourceParsed(JSC::ExecState*, JSC::SourceProvider*, int errorLine, const String& errorMsg) ;145 virtual void callEvent( const JSC::DebuggerCallFrame&);146 virtual void atStatement( const JSC::DebuggerCallFrame&);147 virtual void returnEvent( const JSC::DebuggerCallFrame&);148 virtual void exception( const JSC::DebuggerCallFrame&, bool hasHandler);149 virtual void willExecuteProgram( const JSC::DebuggerCallFrame&);150 virtual void didExecuteProgram( const JSC::DebuggerCallFrame&);151 virtual void didReachBreakpoint( const JSC::DebuggerCallFrame&);144 virtual void sourceParsed(JSC::ExecState*, JSC::SourceProvider*, int errorLine, const String& errorMsg) OVERRIDE; 145 virtual void callEvent(JSC::CallFrame*) OVERRIDE; 146 virtual void atStatement(JSC::CallFrame*) OVERRIDE; 147 virtual void returnEvent(JSC::CallFrame*) OVERRIDE; 148 virtual void exception(JSC::CallFrame*, JSC::JSValue exceptionValue, bool hasHandler) OVERRIDE; 149 virtual void willExecuteProgram(JSC::CallFrame*) OVERRIDE; 150 virtual void didExecuteProgram(JSC::CallFrame*) OVERRIDE; 151 virtual void didReachBreakpoint(JSC::CallFrame*) OVERRIDE; 152 152 153 153 typedef Vector<ScriptBreakpoint> BreakpointsInLine; -
trunk/Source/WebCore/bindings/js/WorkerScriptDebugServer.cpp
r155622 r156374 61 61 } 62 62 63 void WorkerScriptDebugServer::willExecuteProgram( const JSC::DebuggerCallFrame& debuggerCallFrame)63 void WorkerScriptDebugServer::willExecuteProgram(JSC::CallFrame* callFrame) 64 64 { 65 65 if (!m_paused) 66 createCallFrame( debuggerCallFrame);66 createCallFrame(callFrame); 67 67 } 68 68 -
trunk/Source/WebCore/bindings/js/WorkerScriptDebugServer.h
r155622 r156374 40 40 class WorkerGlobalScope; 41 41 42 class WorkerScriptDebugServer : public ScriptDebugServer {42 class WorkerScriptDebugServer FINAL : public ScriptDebugServer { 43 43 WTF_MAKE_NONCOPYABLE(WorkerScriptDebugServer); 44 44 public: … … 54 54 55 55 private: 56 virtual ListenerSet* getListenersForGlobalObject(JSC::JSGlobalObject*) { return &m_listeners; }57 virtual void didPause(JSC::JSGlobalObject*) { }58 virtual void didContinue(JSC::JSGlobalObject*) { }56 virtual ListenerSet* getListenersForGlobalObject(JSC::JSGlobalObject*) OVERRIDE { return &m_listeners; } 57 virtual void didPause(JSC::JSGlobalObject*) OVERRIDE { } 58 virtual void didContinue(JSC::JSGlobalObject*) OVERRIDE { } 59 59 60 virtual bool isContentScript(JSC::ExecState*) { return false; }60 virtual bool isContentScript(JSC::ExecState*) OVERRIDE { return false; } 61 61 62 virtual void willExecuteProgram( const JSC::DebuggerCallFrame&);62 virtual void willExecuteProgram(JSC::CallFrame*) OVERRIDE; 63 63 64 virtual void runEventLoopWhilePaused() ;64 virtual void runEventLoopWhilePaused() OVERRIDE; 65 65 66 66 WorkerGlobalScope* m_workerGlobalScope; -
trunk/Source/WebKit/mac/ChangeLog
r156350 r156374 1 2013-09-24 Mark Lam <mark.lam@apple.com> 2 3 Change JSC debug hooks to pass a CallFrame* instead of a DebuggerCallFrame. 4 https://bugs.webkit.org/show_bug.cgi?id=121867. 5 6 Reviewed by Geoffrey Garen. 7 8 * WebView/WebScriptDebugDelegate.mm: 9 (-[WebScriptCallFrame _initWithGlobalObject:debuggerCallFrame:exceptionValue:JSC::]): 10 (-[WebScriptCallFrame exception]): 11 * WebView/WebScriptDebugger.h: 12 * WebView/WebScriptDebugger.mm: 13 (WebScriptDebugger::exception): 14 1 15 2013-09-24 Enrica Casucci <enrica@apple.com> 2 16 -
trunk/Source/WebKit/mac/WebView/WebScriptDebugDelegate.mm
r156245 r156374 64 64 WebScriptObject *globalObject; // the global object's proxy (not retained) 65 65 DebuggerCallFrame* debuggerCallFrame; 66 JSC::JSValue exceptionValue; 66 67 } 67 68 @end … … 86 87 @implementation WebScriptCallFrame (WebScriptDebugDelegateInternal) 87 88 88 - (WebScriptCallFrame *)_initWithGlobalObject:(WebScriptObject *)globalObj debuggerCallFrame:(const DebuggerCallFrame&)debuggerCallFrame 89 - (WebScriptCallFrame *)_initWithGlobalObject:(WebScriptObject *)globalObj debuggerCallFrame:(const DebuggerCallFrame&)debuggerCallFrame exceptionValue:(JSC::JSValue)exceptionValue 89 90 { 90 91 if ((self = [super init])) { … … 92 93 _private->globalObject = globalObj; 93 94 _private->debuggerCallFrame = new DebuggerCallFrame(debuggerCallFrame); 95 _private->exceptionValue = exceptionValue; 94 96 } 95 97 return self; … … 161 163 return nil; 162 164 163 JSC::JSValue exception = _private-> debuggerCallFrame->exception();165 JSC::JSValue exception = _private->exceptionValue; 164 166 return exception ? [self _convertValueToObjcValue:exception] : nil; 165 167 } -
trunk/Source/WebKit/mac/WebView/WebScriptDebugger.h
r156245 r156374 49 49 @class WebScriptCallFrame; 50 50 51 class WebScriptDebugger : public JSC::Debugger {51 class WebScriptDebugger FINAL : public JSC::Debugger { 52 52 public: 53 53 WebScriptDebugger(JSC::JSGlobalObject*); … … 56 56 57 57 private: 58 virtual void sourceParsed(JSC::ExecState*, JSC::SourceProvider*, int errorLine, const WTF::String& errorMsg) ;59 virtual void callEvent( const JSC::DebuggerCallFrame&){ }60 virtual void atStatement( const JSC::DebuggerCallFrame&){ }61 virtual void returnEvent( const JSC::DebuggerCallFrame&){ }62 virtual void exception( const JSC::DebuggerCallFrame&, bool hasHandler);63 virtual void willExecuteProgram( const JSC::DebuggerCallFrame&){ }64 virtual void didExecuteProgram( const JSC::DebuggerCallFrame&){ }65 virtual void didReachBreakpoint( const JSC::DebuggerCallFrame&){ }58 virtual void sourceParsed(JSC::ExecState*, JSC::SourceProvider*, int errorLine, const WTF::String& errorMsg) OVERRIDE; 59 virtual void callEvent(JSC::CallFrame*) OVERRIDE { } 60 virtual void atStatement(JSC::CallFrame*) OVERRIDE { } 61 virtual void returnEvent(JSC::CallFrame*) OVERRIDE { } 62 virtual void exception(JSC::CallFrame*, JSC::JSValue exceptionValue, bool hasHandler) OVERRIDE; 63 virtual void willExecuteProgram(JSC::CallFrame*) OVERRIDE { } 64 virtual void didExecuteProgram(JSC::CallFrame*) OVERRIDE { } 65 virtual void didReachBreakpoint(JSC::CallFrame*) OVERRIDE { } 66 66 67 67 bool m_callingDelegate; -
trunk/Source/WebKit/mac/WebView/WebScriptDebugger.mm
r156245 r156374 47 47 48 48 @interface WebScriptCallFrame (WebScriptDebugDelegateInternal) 49 - (WebScriptCallFrame *)_initWithGlobalObject:(WebScriptObject *)globalObj debuggerCallFrame:(const DebuggerCallFrame&)debuggerCallFrame ;49 - (WebScriptCallFrame *)_initWithGlobalObject:(WebScriptObject *)globalObj debuggerCallFrame:(const DebuggerCallFrame&)debuggerCallFrame exceptionValue:(JSC::JSValue)exceptionValue; 50 50 @end 51 51 … … 117 117 } 118 118 119 void WebScriptDebugger::exception( const DebuggerCallFrame& debuggerCallFrame, bool hasHandler)119 void WebScriptDebugger::exception(JSC::CallFrame* callFrame, JSC::JSValue exceptionValue, bool hasHandler) 120 120 { 121 121 if (m_callingDelegate) … … 124 124 m_callingDelegate = true; 125 125 126 WebFrame *webFrame = toWebFrame( debuggerCallFrame.dynamicGlobalObject());126 WebFrame *webFrame = toWebFrame(callFrame->dynamicGlobalObject()); 127 127 WebView *webView = [webFrame webView]; 128 RetainPtr<WebScriptCallFrame> callFrame = adoptNS([[WebScriptCallFrame alloc] _initWithGlobalObject:core(webFrame)->script().windowScriptObject() debuggerCallFrame:debuggerCallFrame]); 128 DebuggerCallFrame debuggerCallFrame(callFrame); 129 RetainPtr<WebScriptCallFrame> webCallFrame = adoptNS([[WebScriptCallFrame alloc] _initWithGlobalObject:core(webFrame)->script().windowScriptObject() debuggerCallFrame:debuggerCallFrame exceptionValue:exceptionValue]); 129 130 130 131 WebScriptDebugDelegateImplementationCache* cache = WebViewGetScriptDebugDelegateImplementations(webView); 131 132 if (cache->exceptionWasRaisedFunc) { 132 133 if (cache->exceptionWasRaisedExpectsHasHandlerFlag) 133 CallScriptDebugDelegate(cache->exceptionWasRaisedFunc, webView, @selector(webView:exceptionWasRaised:hasHandler:sourceId:line:forWebFrame:), callFrame.get(), hasHandler, debuggerCallFrame.sourceId(), debuggerCallFrame.line(), webFrame);134 CallScriptDebugDelegate(cache->exceptionWasRaisedFunc, webView, @selector(webView:exceptionWasRaised:hasHandler:sourceId:line:forWebFrame:), webCallFrame.get(), hasHandler, debuggerCallFrame.sourceId(), debuggerCallFrame.line(), webFrame); 134 135 else 135 CallScriptDebugDelegate(cache->exceptionWasRaisedFunc, webView, @selector(webView:exceptionWasRaised:sourceId:line:forWebFrame:), callFrame.get(), debuggerCallFrame.sourceId(), debuggerCallFrame.line(), webFrame);136 CallScriptDebugDelegate(cache->exceptionWasRaisedFunc, webView, @selector(webView:exceptionWasRaised:sourceId:line:forWebFrame:), webCallFrame.get(), debuggerCallFrame.sourceId(), debuggerCallFrame.line(), webFrame); 136 137 } 137 138
Note:
See TracChangeset
for help on using the changeset viewer.