Ignore:
Timestamp:
Sep 24, 2013, 4:52:57 PM (12 years ago)
Author:
[email protected]
Message:

Change JSC debug hooks to pass a CallFrame* instead of a DebuggerCallFrame.
https://bugs.webkit.org/show_bug.cgi?id=121867.

Reviewed by Geoffrey Garen.

Source/JavaScriptCore:

  1. Removed the need for passing the line and column info to the debug hook callbacks. We now get the line and column info from the CallFrame.
  1. Simplify BytecodeGenerator::emitDebugHook() to only take 1 line number argument. The caller can determine whether to pass in the first or last line number of the block of source code as appropriate. Note: we still need to pass in the line and column info to emitDebugHook() because it uses this info to emit expression info which is later used by the StackVisitor to determine the line and column info for its "pc".
  1. Pass the exceptionValue explicitly to the exception() debug hook callback. It should not be embedded in the CallFrame / DebuggerCallFrame.
  1. Change the op_debug opcode size to 2 (from 5) since we've removing 3 arg values. Update the LLINT and JIT code to handle this.
  • bytecode/CodeBlock.cpp:

(JSC::CodeBlock::dumpBytecode):
(JSC::CodeBlock::CodeBlock):

  • bytecode/Opcode.h:

(JSC::padOpcodeName):

  • bytecompiler/BytecodeGenerator.cpp:

(JSC::BytecodeGenerator::emitDebugHook):

  • bytecompiler/BytecodeGenerator.h:
  • bytecompiler/NodesCodegen.cpp:

(JSC::ConstStatementNode::emitBytecode):
(JSC::EmptyStatementNode::emitBytecode):
(JSC::DebuggerStatementNode::emitBytecode):
(JSC::ExprStatementNode::emitBytecode):
(JSC::VarStatementNode::emitBytecode):
(JSC::IfElseNode::emitBytecode):
(JSC::DoWhileNode::emitBytecode):
(JSC::WhileNode::emitBytecode):
(JSC::ForNode::emitBytecode):
(JSC::ForInNode::emitBytecode):
(JSC::ContinueNode::emitBytecode):
(JSC::BreakNode::emitBytecode):
(JSC::ReturnNode::emitBytecode):
(JSC::WithNode::emitBytecode):
(JSC::SwitchNode::emitBytecode):
(JSC::LabelNode::emitBytecode):
(JSC::ThrowNode::emitBytecode):
(JSC::TryNode::emitBytecode):
(JSC::ProgramNode::emitBytecode):
(JSC::EvalNode::emitBytecode):
(JSC::FunctionBodyNode::emitBytecode):

  • debugger/Debugger.h:
  • debugger/DebuggerCallFrame.cpp:

(JSC::LineAndColumnFunctor::operator()):
(JSC::LineAndColumnFunctor::line):
(JSC::LineAndColumnFunctor::column):
(JSC::DebuggerCallFrame::DebuggerCallFrame):
(JSC::DebuggerCallFrame::clear):

  • debugger/DebuggerCallFrame.h:

(JSC::DebuggerCallFrame::line):
(JSC::DebuggerCallFrame::column):

  • interpreter/Interpreter.cpp:

(JSC::unwindCallFrame):
(JSC::UnwindFunctor::UnwindFunctor):
(JSC::UnwindFunctor::operator()):
(JSC::Interpreter::unwind):
(JSC::Interpreter::debug):

  • interpreter/Interpreter.h:
  • jit/JITOpcodes.cpp:

(JSC::JIT::emit_op_debug):

  • jit/JITOpcodes32_64.cpp:

(JSC::JIT::emit_op_debug):

  • jit/JITStubs.cpp:

(JSC::DEFINE_STUB_FUNCTION):

  • llint/LLIntSlowPaths.cpp:

(JSC::LLInt::LLINT_SLOW_PATH_DECL):

  • llint/LowLevelInterpreter.asm:

Source/WebCore:

No new tests.

  • bindings/js/ScriptDebugServer.cpp:

(WebCore::ScriptDebugServer::createCallFrame):
(WebCore::ScriptDebugServer::updateCallFrameAndPauseIfNeeded):
(WebCore::ScriptDebugServer::callEvent):
(WebCore::ScriptDebugServer::atStatement):
(WebCore::ScriptDebugServer::returnEvent):
(WebCore::ScriptDebugServer::exception):
(WebCore::ScriptDebugServer::willExecuteProgram):
(WebCore::ScriptDebugServer::didExecuteProgram):
(WebCore::ScriptDebugServer::didReachBreakpoint):

  • bindings/js/ScriptDebugServer.h:
  • bindings/js/WorkerScriptDebugServer.cpp:

(WebCore::WorkerScriptDebugServer::willExecuteProgram):

  • bindings/js/WorkerScriptDebugServer.h:

Source/WebKit/mac:

  • WebView/WebScriptDebugDelegate.mm:

(-[WebScriptCallFrame _initWithGlobalObject:debuggerCallFrame:exceptionValue:JSC::]):
(-[WebScriptCallFrame exception]):

  • WebView/WebScriptDebugger.h:
  • WebView/WebScriptDebugger.mm:

(WebScriptDebugger::exception):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp

    r155724 r156374  
    14451445void ConstStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
    14461446{
    1447     generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), startOffset(), lineStartOffset());
     1447    generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
    14481448    generator.emitNode(m_next);
    14491449}
     
    14881488void EmptyStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
    14891489{
    1490     generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), startOffset(), lineStartOffset());
     1490    generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
    14911491}
    14921492
     
    14951495void DebuggerStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
    14961496{
    1497     generator.emitDebugHook(DidReachBreakpoint, firstLine(), lastLine(), startOffset(), lineStartOffset());
     1497    generator.emitDebugHook(DidReachBreakpoint, lastLine(), startOffset(), lineStartOffset());
    14981498}
    14991499
     
    15031503{
    15041504    ASSERT(m_expr);
    1505     generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), startOffset(), lineStartOffset());
     1505    generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
    15061506    generator.emitNode(dst, m_expr);
    15071507}
     
    15121512{
    15131513    ASSERT(m_expr);
    1514     generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), startOffset(), lineStartOffset());
     1514    generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
    15151515    generator.emitNode(m_expr);
    15161516}
     
    15571557void IfElseNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    15581558{
    1559     generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), startOffset(), lineStartOffset());
     1559    generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
    15601560   
    15611561    RefPtr<Label> beforeThen = generator.newLabel();
     
    15941594    generator.emitLabel(topOfLoop.get());
    15951595    generator.emitLoopHint();
    1596     generator.emitDebugHook(WillExecuteStatement, lastLine(), lastLine(), startOffset(), lineStartOffset());
     1596    generator.emitDebugHook(WillExecuteStatement, lastLine(), startOffset(), lineStartOffset());
    15971597
    15981598    generator.emitNode(dst, m_statement);
    15991599
    16001600    generator.emitLabel(scope->continueTarget());
    1601     generator.emitDebugHook(WillExecuteStatement, lastLine(), lastLine(), startOffset(), lineStartOffset());
     1601    generator.emitDebugHook(WillExecuteStatement, lastLine(), startOffset(), lineStartOffset());
    16021602    generator.emitNodeInConditionContext(m_expr, topOfLoop.get(), scope->breakTarget(), FallThroughMeansFalse);
    16031603
     
    16121612    RefPtr<Label> topOfLoop = generator.newLabel();
    16131613
    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());
    16151615    generator.emitNodeInConditionContext(m_expr, topOfLoop.get(), scope->breakTarget(), FallThroughMeansTrue);
    16161616
     
    16211621
    16221622    generator.emitLabel(scope->continueTarget());
    1623     generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), startOffset(), lineStartOffset());
     1623    generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
    16241624
    16251625    generator.emitNodeInConditionContext(m_expr, topOfLoop.get(), scope->breakTarget(), FallThroughMeansFalse);
     
    16341634    LabelScopePtr scope = generator.newLabelScope(LabelScope::Loop);
    16351635
    1636     generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), startOffset(), lineStartOffset());
     1636    generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
    16371637
    16381638    if (m_expr1)
     
    16491649
    16501650    generator.emitLabel(scope->continueTarget());
    1651     generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), startOffset(), lineStartOffset());
     1651    generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
    16521652    if (m_expr3)
    16531653        generator.emitNode(generator.ignoredResult(), m_expr3);
     
    16721672    }
    16731673
    1674     generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), startOffset(), lineStartOffset());
     1674    generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
    16751675
    16761676    RefPtr<RegisterID> base = generator.newTemporary();
     
    17331733    generator.emitLabel(scope->continueTarget());
    17341734    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());
    17361736    generator.emitLabel(scope->breakTarget());
    17371737}
     
    17551755void ContinueNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
    17561756{
    1757     generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), startOffset(), lineStartOffset());
     1757    generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
    17581758   
    17591759    LabelScope* scope = generator.continueTarget(m_ident);
     
    17821782void BreakNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
    17831783{
    1784     generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), startOffset(), lineStartOffset());
     1784    generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
    17851785   
    17861786    LabelScope* scope = generator.breakTarget(m_ident);
     
    17951795void ReturnNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    17961796{
    1797     generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), startOffset(), lineStartOffset());
     1797    generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
    17981798    ASSERT(generator.codeType() == FunctionCode);
    17991799
     
    18071807    }
    18081808
    1809     generator.emitDebugHook(WillLeaveCallFrame, firstLine(), lastLine(), startOffset(), lineStartOffset());
     1809    generator.emitDebugHook(WillLeaveCallFrame, lastLine(), startOffset(), lineStartOffset());
    18101810    generator.emitReturn(returnRegister.get());
    18111811}
     
    18151815void WithNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    18161816{
    1817     generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), startOffset(), lineStartOffset());
     1817    generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
    18181818
    18191819    RefPtr<RegisterID> scope = generator.emitNode(m_expr);
     
    19891989void SwitchNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    19901990{
    1991     generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), startOffset(), lineStartOffset());
     1991    generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
    19921992   
    19931993    LabelScopePtr scope = generator.newLabelScope(LabelScope::Switch);
     
    20032003void LabelNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    20042004{
    2005     generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), startOffset(), lineStartOffset());
     2005    generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
    20062006
    20072007    ASSERT(!generator.breakTarget(m_name));
     
    20172017void ThrowNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    20182018{
    2019     generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), startOffset(), lineStartOffset());
     2019    generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
    20202020
    20212021    if (dst == generator.ignoredResult())
     
    20332033    // optimizer knows they may be jumped to from anywhere.
    20342034
    2035     generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), startOffset(), lineStartOffset());
     2035    generator.emitDebugHook(WillExecuteStatement, firstLine(), startOffset(), lineStartOffset());
    20362036
    20372037    ASSERT(m_catchBlock || m_finallyBlock);
     
    21012101void ProgramNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
    21022102{
    2103     generator.emitDebugHook(WillExecuteProgram, startLine(), startLine(), startStartOffset(), startLineStartOffset());
     2103    generator.emitDebugHook(WillExecuteProgram, startLine(), startStartOffset(), startLineStartOffset());
    21042104
    21052105    RefPtr<RegisterID> dstRegister = generator.newTemporary();
     
    21072107    emitStatementsBytecode(generator, dstRegister.get());
    21082108
    2109     generator.emitDebugHook(DidExecuteProgram, lastLine(), lastLine(), startOffset(), lineStartOffset());
     2109    generator.emitDebugHook(DidExecuteProgram, lastLine(), startOffset(), lineStartOffset());
    21102110    generator.emitEnd(dstRegister.get());
    21112111}
     
    21152115void EvalNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
    21162116{
    2117     generator.emitDebugHook(WillExecuteProgram, startLine(), startLine(), startStartOffset(), startLineStartOffset());
     2117    generator.emitDebugHook(WillExecuteProgram, startLine(), startStartOffset(), startLineStartOffset());
    21182118
    21192119    RefPtr<RegisterID> dstRegister = generator.newTemporary();
     
    21212121    emitStatementsBytecode(generator, dstRegister.get());
    21222122
    2123     generator.emitDebugHook(DidExecuteProgram, lastLine(), lastLine(), startOffset(), lineStartOffset());
     2123    generator.emitDebugHook(DidExecuteProgram, lastLine(), startOffset(), lineStartOffset());
    21242124    generator.emitEnd(dstRegister.get());
    21252125}
     
    21292129void FunctionBodyNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
    21302130{
    2131     generator.emitDebugHook(DidEnterCallFrame, startLine(), startLine(), startStartOffset(), startLineStartOffset());
     2131    generator.emitDebugHook(DidEnterCallFrame, startLine(), startStartOffset(), startLineStartOffset());
    21322132    emitStatementsBytecode(generator, generator.ignoredResult());
    21332133
     
    21462146        RegisterID* r0 = generator.isConstructor() ? generator.thisRegister() : generator.emitLoad(0, jsUndefined());
    21472147        ASSERT((startOffset() -  1) >= lineStartOffset());
    2148         generator.emitDebugHook(WillLeaveCallFrame, lastLine(), lastLine(), startOffset() - 1, lineStartOffset());
     2148        generator.emitDebugHook(WillLeaveCallFrame, lastLine(), startOffset() - 1, lineStartOffset());
    21492149        generator.emitReturn(r0);
    21502150        return;
Note: See TracChangeset for help on using the changeset viewer.