Changeset 34555 in webkit for trunk/JavaScriptCore/kjs/nodes.cpp


Ignore:
Timestamp:
Jun 14, 2008, 10:24:21 PM (17 years ago)
Author:
[email protected]
Message:

2008-06-14 Cameron Zwarich <[email protected]>

Reviewed by Maciej.

Make code generation not use a temporary for the left-hand side of an
expression if the right-hand side is a local variable.

  • VM/CodeGenerator.cpp: (KJS::CodeGenerator::isLocal):
  • VM/CodeGenerator.h: (KJS::CodeGenerator::leftHandSideNeedsCopy): (KJS::CodeGenerator::emitNodeForLeftHandSide):
  • kjs/nodes.cpp: (KJS::ResolveNode::isPure): (KJS::BracketAccessorNode::emitCode): (KJS::AddNode::emitCode): (KJS::SubNode::emitCode): (KJS::ReadModifyResolveNode::emitCode): (KJS::AssignDotNode::emitCode): (KJS::ReadModifyDotNode::emitCode): (KJS::AssignBracketNode::emitCode): (KJS::ReadModifyBracketNode::emitCode):
  • kjs/nodes.h: (KJS::ExpressionNode::): (KJS::BooleanNode::): (KJS::NumberNode::): (KJS::StringNode::):
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/kjs/nodes.cpp

    r34544 r34555  
    328328// ------------------------------ ResolveNode ----------------------------------
    329329
     330bool ResolveNode::isPure(CodeGenerator& generator) const
     331{
     332    return generator.isLocal(m_ident);
     333}
     334
    330335RegisterID* ResolveNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    331336{
     
    403408RegisterID* BracketAccessorNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    404409{
    405     RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_subscriptHasAssignments, m_subscript.get()->isConstant());
     410    RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_subscriptHasAssignments, m_subscript.get()->isPure(generator));
    406411    RegisterID* property = generator.emitNode(m_subscript.get());
    407412
     
    824829RegisterID* AddNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    825830{
    826     RefPtr<RegisterID> src1 = generator.emitNodeForLeftHandSide(m_term1.get(), m_rightHasAssignments, m_term2.get()->isConstant());
     831    RefPtr<RegisterID> src1 = generator.emitNodeForLeftHandSide(m_term1.get(), m_rightHasAssignments, m_term2.get()->isPure(generator));
    827832    RegisterID* src2 = generator.emitNode(m_term2.get());
    828833    return generator.emitAdd(generator.finalDestination(dst, src1.get()), src1.get(), src2);
     
    831836RegisterID* SubNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    832837{
    833     RefPtr<RegisterID> src1 = generator.emitNodeForLeftHandSide(m_term1.get(), m_rightHasAssignments, m_term2.get()->isConstant());
     838    RefPtr<RegisterID> src1 = generator.emitNodeForLeftHandSide(m_term1.get(), m_rightHasAssignments, m_term2.get()->isPure(generator));
    834839    RegisterID* src2 = generator.emitNode(m_term2.get());
    835840    return generator.emitSub(generator.finalDestination(dst, src1.get()), src1.get(), src2);
     
    10491054        }
    10501055       
    1051         if (generator.leftHandSideNeedsCopy(m_rightHasAssignments, m_right.get()->isConstant())) {
     1056        if (generator.leftHandSideNeedsCopy(m_rightHasAssignments, m_right.get()->isPure(generator))) {
    10521057            RefPtr<RegisterID> result = generator.newTemporary();
    10531058            generator.emitMove(result.get(), local);
     
    11091114RegisterID* AssignDotNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    11101115{
    1111     RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_rightHasAssignments, m_right.get()->isConstant());
     1116    RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_rightHasAssignments, m_right.get()->isPure(generator));
    11121117    RefPtr<RegisterID> value = generator.destinationForAssignResult(dst);
    11131118    RegisterID* result = generator.emitNode(value.get(), m_right.get());
     
    11201125RegisterID* ReadModifyDotNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    11211126{
    1122     RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_rightHasAssignments, m_right.get()->isConstant());
     1127    RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_rightHasAssignments, m_right.get()->isPure(generator));
    11231128    RefPtr<RegisterID> value = generator.emitGetById(generator.tempDestination(dst), base.get(), m_ident);
    11241129    RegisterID* change = generator.emitNode(m_right.get());
     
    11381143RegisterID* AssignBracketNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    11391144{
    1140     RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_subscriptHasAssignments || m_rightHasAssignments, m_subscript.get()->isConstant() && m_right.get()->isConstant());
    1141     RefPtr<RegisterID> property = generator.emitNodeForLeftHandSide(m_subscript.get(), m_rightHasAssignments, m_right.get()->isConstant());
     1145    RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_subscriptHasAssignments || m_rightHasAssignments, m_subscript.get()->isPure(generator) && m_right.get()->isPure(generator));
     1146    RefPtr<RegisterID> property = generator.emitNodeForLeftHandSide(m_subscript.get(), m_rightHasAssignments, m_right.get()->isPure(generator));
    11421147    RefPtr<RegisterID> value = generator.destinationForAssignResult(dst);
    11431148    RegisterID* result = generator.emitNode(value.get(), m_right.get());
     
    11481153RegisterID* ReadModifyBracketNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    11491154{
    1150     RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_subscriptHasAssignments || m_rightHasAssignments, m_subscript.get()->isConstant() && m_right.get()->isConstant());
    1151     RefPtr<RegisterID> property = generator.emitNodeForLeftHandSide(m_subscript.get(), m_rightHasAssignments, m_right.get()->isConstant());
     1155    RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base.get(), m_subscriptHasAssignments || m_rightHasAssignments, m_subscript.get()->isPure(generator) && m_right.get()->isPure(generator));
     1156    RefPtr<RegisterID> property = generator.emitNodeForLeftHandSide(m_subscript.get(), m_rightHasAssignments, m_right.get()->isPure(generator));
    11521157
    11531158    RefPtr<RegisterID> value = generator.emitGetByVal(generator.tempDestination(dst), base.get(), property.get());
Note: See TracChangeset for help on using the changeset viewer.