Ignore:
Timestamp:
Apr 4, 2013, 11:31:37 AM (12 years ago)
Author:
[email protected]
Message:

Simplified bytecode generation by merging prefix and postfix nodes
https://bugs.webkit.org/show_bug.cgi?id=113925

Reviewed by Filip Pizlo.

PostfixNode now inherits from PrefixNode, so when we detect that we're
in a context where postifx and prefix are equivalent, PostFixNode can
just call through to PrefixNode codegen, instead of duplicating the
logic.

  • bytecompiler/NodesCodegen.cpp:

(JSC::PostfixNode::emitResolve):
(JSC::PostfixNode::emitBracket):
(JSC::PostfixNode::emitDot):

  • parser/NodeConstructors.h:

(JSC::PostfixNode::PostfixNode):

  • parser/Nodes.h:

(JSC):
(PrefixNode):
(PostfixNode):

File:
1 edited

Legend:

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

    r147234 r147658  
    625625RegisterID* PostfixNode::emitResolve(BytecodeGenerator& generator, RegisterID* dst)
    626626{
     627    if (dst == generator.ignoredResult())
     628        return PrefixNode::emitResolve(generator, dst);
     629
    627630    ASSERT(m_expr->isResolveNode());
    628631    ResolveNode* resolve = static_cast<ResolveNode*>(m_expr);
     
    636639            return generator.emitToJSNumber(generator.finalDestination(dst), local);
    637640        }
    638         if (dst == generator.ignoredResult())
    639             return emitPreIncOrDec(generator, local, m_operator);
    640641        return emitPostIncOrDec(generator, generator.finalDestination(dst), local, m_operator);
    641642    }
     
    643644    if (resolveResult.isStatic() && !resolveResult.isReadOnly()) {
    644645        RefPtr<RegisterID> value = generator.emitGetStaticVar(generator.newTemporary(), resolveResult, ident);
    645         RegisterID* oldValue;
    646         if (dst == generator.ignoredResult()) {
    647             oldValue = 0;
    648             emitPreIncOrDec(generator, value.get(), m_operator);
    649         } else
    650             oldValue = emitPostIncOrDec(generator, generator.finalDestination(dst), value.get(), m_operator);
     646        RefPtr<RegisterID> oldValue = emitPostIncOrDec(generator, generator.finalDestination(dst), value.get(), m_operator);
    651647        generator.emitPutStaticVar(resolveResult, ident, value.get());
    652         return oldValue;
     648        return oldValue.get();
    653649    }
    654650
     
    657653    NonlocalResolveInfo resolveInfo;
    658654    RefPtr<RegisterID> base = generator.emitResolveWithBaseForPut(generator.newTemporary(), value.get(), resolveResult, ident, resolveInfo);
    659     RegisterID* oldValue;
    660     if (dst == generator.ignoredResult()) {
    661         oldValue = 0;
    662         emitPreIncOrDec(generator, value.get(), m_operator);
    663     } else
    664         oldValue = emitPostIncOrDec(generator, generator.finalDestination(dst), value.get(), m_operator);
     655    RefPtr<RegisterID> oldValue = emitPostIncOrDec(generator, generator.finalDestination(dst), value.get(), m_operator);
    665656    generator.emitPutToBase(base.get(), ident, value.get(), resolveInfo);
    666     return oldValue;
     657    return oldValue.get();
    667658}
    668659
    669660RegisterID* PostfixNode::emitBracket(BytecodeGenerator& generator, RegisterID* dst)
    670661{
     662    if (dst == generator.ignoredResult())
     663        return PrefixNode::emitBracket(generator, dst);
     664
    671665    ASSERT(m_expr->isBracketAccessorNode());
    672666    BracketAccessorNode* bracketAccessor = static_cast<BracketAccessorNode*>(m_expr);
     
    679673    generator.emitExpressionInfo(bracketAccessor->divot(), bracketAccessor->startOffset(), bracketAccessor->endOffset());
    680674    RefPtr<RegisterID> value = generator.emitGetByVal(generator.newTemporary(), base.get(), property.get());
    681     if (dst == generator.ignoredResult()) {
    682         emitPreIncOrDec(generator, value.get(), m_operator);
    683         generator.emitExpressionInfo(divot(), startOffset(), endOffset());
    684         generator.emitPutByVal(base.get(), property.get(), value.get());
    685         return 0;
    686     }
    687675    RegisterID* oldValue = emitPostIncOrDec(generator, generator.tempDestination(dst), value.get(), m_operator);
    688676    generator.emitExpressionInfo(divot(), startOffset(), endOffset());
     
    693681RegisterID* PostfixNode::emitDot(BytecodeGenerator& generator, RegisterID* dst)
    694682{
     683    if (dst == generator.ignoredResult())
     684        return PrefixNode::emitDot(generator, dst);
     685
    695686    ASSERT(m_expr->isDotAccessorNode());
    696687    DotAccessorNode* dotAccessor = static_cast<DotAccessorNode*>(m_expr);
     
    702693    generator.emitExpressionInfo(dotAccessor->divot(), dotAccessor->startOffset(), dotAccessor->endOffset());
    703694    RefPtr<RegisterID> value = generator.emitGetById(generator.newTemporary(), base.get(), ident);
    704     if (dst == generator.ignoredResult()) {
    705         emitPreIncOrDec(generator, value.get(), m_operator);
    706         generator.emitExpressionInfo(divot(), startOffset(), endOffset());
    707         generator.emitPutById(base.get(), ident, value.get());
    708         return 0;
    709     }
    710695    RegisterID* oldValue = emitPostIncOrDec(generator, generator.tempDestination(dst), value.get(), m_operator);
    711696    generator.emitExpressionInfo(divot(), startOffset(), endOffset());
Note: See TracChangeset for help on using the changeset viewer.