Ignore:
Timestamp:
Apr 4, 2013, 4:16:20 PM (12 years ago)
Author:
[email protected]
Message:

Stop pretending that statements return a value
https://bugs.webkit.org/show_bug.cgi?id=113969

Reviewed by Oliver Hunt.

Expressions have an intrinsic value, which they return to their parent
in the AST.

Statements just execute for effect in sequence.

This patch moves emitBytecode into the ExpressionNode and StatementNode
subclasses, and changes the SatementNode subclass to return void. This
eliminates some cruft where we used to return 0, or try to save a bogus
register and return it, as if a statement had a consuming parent in the
AST.

  • bytecompiler/BytecodeGenerator.h:

(JSC::BytecodeGenerator::emitNode):
(BytecodeGenerator):
(JSC::BytecodeGenerator::emitNodeInConditionContext):

  • bytecompiler/NodesCodegen.cpp:

(JSC::ConstStatementNode::emitBytecode):
(JSC::BlockNode::emitBytecode):
(JSC::EmptyStatementNode::emitBytecode):
(JSC::DebuggerStatementNode::emitBytecode):
(JSC::ExprStatementNode::emitBytecode):
(JSC::VarStatementNode::emitBytecode):
(JSC::IfNode::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::CaseClauseNode::emitBytecode):
(JSC::CaseBlockNode::emitBytecodeForBlock):
(JSC::SwitchNode::emitBytecode):
(JSC::LabelNode::emitBytecode):
(JSC::ThrowNode::emitBytecode):
(JSC::TryNode::emitBytecode):
(JSC::ScopeNode::emitStatementsBytecode):
(JSC::ProgramNode::emitBytecode):
(JSC::EvalNode::emitBytecode):
(JSC::FunctionBodyNode::emitBytecode):
(JSC::FuncDeclNode::emitBytecode):

  • parser/NodeConstructors.h:

(JSC::PropertyListNode::PropertyListNode):
(JSC::ArgumentListNode::ArgumentListNode):

  • parser/Nodes.h:

(Node):
(ExpressionNode):
(StatementNode):
(ConstStatementNode):
(BlockNode):
(EmptyStatementNode):
(DebuggerStatementNode):
(ExprStatementNode):
(VarStatementNode):
(IfNode):
(IfElseNode):
(DoWhileNode):
(WhileNode):
(ForNode):
(ForInNode):
(ContinueNode):
(BreakNode):
(ReturnNode):
(WithNode):
(LabelNode):
(ThrowNode):
(TryNode):
(ProgramNode):
(EvalNode):
(FunctionBodyNode):
(FuncDeclNode):
(CaseBlockNode):
(SwitchNode):

File:
1 edited

Legend:

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

    r147658 r147677  
    14321432// ------------------------------ ConstStatementNode -----------------------------
    14331433
    1434 RegisterID* ConstStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
     1434void ConstStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
    14351435{
    14361436    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), charPosition());
    1437     return generator.emitNode(m_next);
     1437    generator.emitNode(m_next);
    14381438}
    14391439
     
    14661466}
    14671467
    1468 RegisterID* BlockNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    1469 {
    1470     if (m_statements)
    1471         m_statements->emitBytecode(generator, dst);
    1472     return 0;
     1468void BlockNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
     1469{
     1470    if (!m_statements)
     1471        return;
     1472    m_statements->emitBytecode(generator, dst);
    14731473}
    14741474
    14751475// ------------------------------ EmptyStatementNode ---------------------------
    14761476
    1477 RegisterID* EmptyStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
     1477void EmptyStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
    14781478{
    14791479    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), charPosition());
    1480     return dst;
    14811480}
    14821481
    14831482// ------------------------------ DebuggerStatementNode ---------------------------
    14841483
    1485 RegisterID* DebuggerStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
     1484void DebuggerStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
    14861485{
    14871486    generator.emitDebugHook(DidReachBreakpoint, firstLine(), lastLine(), charPosition());
    1488     return dst;
    14891487}
    14901488
    14911489// ------------------------------ ExprStatementNode ----------------------------
    14921490
    1493 RegisterID* ExprStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
     1491void ExprStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    14941492{
    14951493    ASSERT(m_expr);
    14961494    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), charPosition());
    1497     return generator.emitNode(dst, m_expr);
     1495    generator.emitNode(dst, m_expr);
    14981496}
    14991497
    15001498// ------------------------------ VarStatementNode ----------------------------
    15011499
    1502 RegisterID* VarStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
     1500void VarStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
    15031501{
    15041502    ASSERT(m_expr);
    15051503    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), charPosition());
    1506     return generator.emitNode(m_expr);
     1504    generator.emitNode(m_expr);
    15071505}
    15081506
    15091507// ------------------------------ IfNode ---------------------------------------
    15101508
    1511 RegisterID* IfNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
     1509void IfNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    15121510{
    15131511    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), charPosition());
     
    15211519    generator.emitNode(dst, m_ifBlock);
    15221520    generator.emitLabel(afterThen.get());
    1523 
    1524     // FIXME: This should return the last statement executed so that it can be returned as a Completion.
    1525     return 0;
    15261521}
    15271522
    15281523// ------------------------------ IfElseNode ---------------------------------------
    15291524
    1530 RegisterID* IfElseNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
     1525void IfElseNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    15311526{
    15321527    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), charPosition());
     
    15471542
    15481543    generator.emitLabel(afterElse.get());
    1549 
    1550     // FIXME: This should return the last statement executed so that it can be returned as a Completion.
    1551     return 0;
    15521544}
    15531545
    15541546// ------------------------------ DoWhileNode ----------------------------------
    15551547
    1556 RegisterID* DoWhileNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
     1548void DoWhileNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    15571549{
    15581550    LabelScopePtr scope = generator.newLabelScope(LabelScope::Loop);
     
    15631555    generator.emitDebugHook(WillExecuteStatement, lastLine(), lastLine(), charPosition());
    15641556
    1565     RefPtr<RegisterID> result = generator.emitNode(dst, m_statement);
     1557    generator.emitNode(dst, m_statement);
    15661558
    15671559    generator.emitLabel(scope->continueTarget());
     
    15701562
    15711563    generator.emitLabel(scope->breakTarget());
    1572     return result.get();
    15731564}
    15741565
    15751566// ------------------------------ WhileNode ------------------------------------
    15761567
    1577 RegisterID* WhileNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
     1568void WhileNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    15781569{
    15791570    LabelScopePtr scope = generator.newLabelScope(LabelScope::Loop);
     
    15941585
    15951586    generator.emitLabel(scope->breakTarget());
    1596    
    1597     // FIXME: This should return the last statement executed so that it can be returned as a Completion
    1598     return 0;
    15991587}
    16001588
    16011589// ------------------------------ ForNode --------------------------------------
    16021590
    1603 RegisterID* ForNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
     1591void ForNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    16041592{
    16051593    LabelScopePtr scope = generator.newLabelScope(LabelScope::Loop);
     
    16171605    generator.emitLoopHint();
    16181606
    1619     RefPtr<RegisterID> result = generator.emitNode(dst, m_statement);
     1607    generator.emitNode(dst, m_statement);
    16201608
    16211609    generator.emitLabel(scope->continueTarget());
     
    16301618
    16311619    generator.emitLabel(scope->breakTarget());
    1632     return result.get();
    16331620}
    16341621
    16351622// ------------------------------ ForInNode ------------------------------------
    16361623
    1637 RegisterID* ForInNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
     1624void ForInNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    16381625{
    16391626    LabelScopePtr scope = generator.newLabelScope(LabelScope::Loop);
    16401627
    1641     if (!m_lexpr->isLocation())
    1642         return emitThrowReferenceError(generator, "Left side of for-in statement is not a reference.");
     1628    if (!m_lexpr->isLocation()) {
     1629        emitThrowReferenceError(generator, "Left side of for-in statement is not a reference.");
     1630        return;
     1631    }
    16431632
    16441633    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), charPosition());
     
    17081697    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), charPosition());
    17091698    generator.emitLabel(scope->breakTarget());
    1710     return dst;
    17111699}
    17121700
    17131701// ------------------------------ ContinueNode ---------------------------------
    17141702
    1715 // ECMA 12.7
    1716 RegisterID* ContinueNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
     1703void ContinueNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
    17171704{
    17181705    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), charPosition());
     
    17231710    generator.emitPopScopes(scope->scopeDepth());
    17241711    generator.emitJump(scope->continueTarget());
    1725     return dst;
    17261712}
    17271713
    17281714// ------------------------------ BreakNode ------------------------------------
    17291715
    1730 // ECMA 12.8
    1731 RegisterID* BreakNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
     1716void BreakNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
    17321717{
    17331718    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), charPosition());
     
    17381723    generator.emitPopScopes(scope->scopeDepth());
    17391724    generator.emitJump(scope->breakTarget());
    1740     return dst;
    17411725}
    17421726
    17431727// ------------------------------ ReturnNode -----------------------------------
    17441728
    1745 RegisterID* ReturnNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
     1729void ReturnNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    17461730{
    17471731    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), charPosition());
     
    17581742
    17591743    generator.emitDebugHook(WillLeaveCallFrame, firstLine(), lastLine(), charPosition());
    1760     return generator.emitReturn(returnRegister.get());
     1744    generator.emitReturn(returnRegister.get());
    17611745}
    17621746
    17631747// ------------------------------ WithNode -------------------------------------
    17641748
    1765 RegisterID* WithNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
     1749void WithNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    17661750{
    17671751    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), charPosition());
     
    17701754    generator.emitExpressionInfo(m_divot, m_expressionLength, 0);
    17711755    generator.emitPushWithScope(scope.get());
    1772     RegisterID* result = generator.emitNode(dst, m_statement);
     1756    generator.emitNode(dst, m_statement);
    17731757    generator.emitPopScope();
    1774     return result;
    17751758}
    17761759
     
    17791762inline void CaseClauseNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    17801763{
    1781     if (m_statements)
    1782         m_statements->emitBytecode(generator, dst);
     1764    if (!m_statements)
     1765        return;
     1766    m_statements->emitBytecode(generator, dst);
    17831767}
    17841768
     
    18741858}
    18751859
    1876 RegisterID* CaseBlockNode::emitBytecodeForBlock(BytecodeGenerator& generator, RegisterID* switchExpression, RegisterID* dst)
     1860void CaseBlockNode::emitBytecodeForBlock(BytecodeGenerator& generator, RegisterID* switchExpression, RegisterID* dst)
    18771861{
    18781862    RefPtr<Label> defaultLabel;
     
    19101894    }
    19111895
    1912     RegisterID* result = 0;
    1913 
    19141896    size_t i = 0;
    19151897    for (ClauseListNode* list = m_list1; list; list = list->getNext()) {
     
    19351917        generator.endSwitch(labelVector.size(), labelVector.data(), literalVector.data(), defaultLabel.get(), min_num, max_num);
    19361918    }
    1937     return result;
    19381919}
    19391920
    19401921// ------------------------------ SwitchNode -----------------------------------
    19411922
    1942 RegisterID* SwitchNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
     1923void SwitchNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    19431924{
    19441925    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), charPosition());
     
    19471928
    19481929    RefPtr<RegisterID> r0 = generator.emitNode(m_expr);
    1949     RegisterID* r1 = m_block->emitBytecodeForBlock(generator, r0.get(), dst);
     1930    m_block->emitBytecodeForBlock(generator, r0.get(), dst);
    19501931
    19511932    generator.emitLabel(scope->breakTarget());
    1952     return r1;
    19531933}
    19541934
    19551935// ------------------------------ LabelNode ------------------------------------
    19561936
    1957 RegisterID* LabelNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
     1937void LabelNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    19581938{
    19591939    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), charPosition());
     
    19621942
    19631943    LabelScopePtr scope = generator.newLabelScope(LabelScope::NamedLabel, &m_name);
    1964     RegisterID* r0 = generator.emitNode(dst, m_statement);
     1944    generator.emitNode(dst, m_statement);
    19651945
    19661946    generator.emitLabel(scope->breakTarget());
    1967     return r0;
    19681947}
    19691948
    19701949// ------------------------------ ThrowNode ------------------------------------
    19711950
    1972 RegisterID* ThrowNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
     1951void ThrowNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    19731952{
    19741953    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), charPosition());
     
    19791958    generator.emitExpressionInfo(divot(), startOffset(), endOffset());
    19801959    generator.emitThrow(expr.get());
    1981     return 0;
    19821960}
    19831961
    19841962// ------------------------------ TryNode --------------------------------------
    19851963
    1986 RegisterID* TryNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
     1964void TryNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    19871965{
    19881966    // NOTE: The catch and finally blocks must be labeled explicitly, so the
     
    20422020        generator.emitLabel(finallyEndLabel.get());
    20432021    }
    2044 
    2045     return dst;
    20462022}
    20472023
     
    20502026inline void ScopeNode::emitStatementsBytecode(BytecodeGenerator& generator, RegisterID* dst)
    20512027{
    2052     if (m_statements)
    2053         m_statements->emitBytecode(generator, dst);
     2028    if (!m_statements)
     2029        return;
     2030    m_statements->emitBytecode(generator, dst);
    20542031}
    20552032
    20562033// ------------------------------ ProgramNode -----------------------------
    20572034
    2058 RegisterID* ProgramNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
     2035void ProgramNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
    20592036{
    20602037    generator.emitDebugHook(WillExecuteProgram, startLine(), startLine(), startCharPosition());
     
    20662043    generator.emitDebugHook(DidExecuteProgram, lastLine(), lastLine(), charPosition() - 1);
    20672044    generator.emitEnd(dstRegister.get());
    2068     return 0;
    20692045}
    20702046
    20712047// ------------------------------ EvalNode -----------------------------
    20722048
    2073 RegisterID* EvalNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
     2049void EvalNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
    20742050{
    20752051    generator.emitDebugHook(WillExecuteProgram, startLine(), startLine(), startCharPosition());
     
    20812057    generator.emitDebugHook(DidExecuteProgram, lastLine(), lastLine(), charPosition() - 1);
    20822058    generator.emitEnd(dstRegister.get());
    2083     return 0;
    20842059}
    20852060
    20862061// ------------------------------ FunctionBodyNode -----------------------------
    20872062
    2088 RegisterID* FunctionBodyNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
     2063void FunctionBodyNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
    20892064{
    20902065    generator.emitDebugHook(DidEnterCallFrame, startLine(), startLine(), startCharPosition());
     
    21072082        generator.emitDebugHook(WillLeaveCallFrame, lastLine(), lastLine(), charPosition() - 1);
    21082083        generator.emitReturn(r0);
    2109         return 0;
     2084        return;
    21102085    }
    21112086
     
    21252100        }
    21262101    }
    2127 
    2128     return 0;
    21292102}
    21302103
    21312104// ------------------------------ FuncDeclNode ---------------------------------
    21322105
    2133 RegisterID* FuncDeclNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    2134 {
    2135     if (dst == generator.ignoredResult())
    2136         dst = 0;
    2137     return dst;
     2106void FuncDeclNode::emitBytecode(BytecodeGenerator&, RegisterID*)
     2107{
    21382108}
    21392109
Note: See TracChangeset for help on using the changeset viewer.