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


Ignore:
Timestamp:
Jun 28, 2008, 9:03:11 AM (17 years ago)
Author:
Darin Adler
Message:

2008-06-28 Darin Adler <Darin Adler>

Reviewed by Oliver.

SunSpider says 0.9% faster.

  • VM/CodeGenerator.h: (KJS::CodeGenerator::tempDestination): Create a new temporary for ignoredResult() too, just as we would for 0. (KJS::CodeGenerator::finalDestination): Use the temporary if the register passed in is ignoredResult() too, just as we would for 0. (KJS::CodeGenerator::destinationForAssignResult): Return 0 if the passed in register is ignoredResult(), just as we would for 0. (KJS::CodeGenerator::moveToDestinationIfNeeded): Return 0 if the register passed in is ignoredResult(). What matters is that we don't want to emit a move. The return value won't be looked at. (KJS::CodeGenerator::emitNode): Allow ignoredResult() and pass it through to the node's emitCode function.
  • VM/RegisterID.h: (KJS::ignoredResult): Added. Special value to indicate the result of a node will be ignored and need not be put in any register.
  • kjs/nodes.cpp: (KJS::NullNode::emitCode): Do nothing if dst == ignoredResult(). (KJS::BooleanNode::emitCode): Ditto. (KJS::NumberNode::emitCode): Ditto. (KJS::StringNode::emitCode): Ditto. (KJS::RegExpNode::emitCode): Ditto. (KJS::ThisNode::emitCode): Ditto. (KJS::ResolveNode::emitCode): Do nothing if dst == ignoredResult() and the identifier resolves to a local variable. (KJS::ObjectLiteralNode::emitCode): Do nothing if dst == ignoredResult() and the object is empty. (KJS::PostIncResolveNode::emitCode): If dst == ignoredResult(), then do nothing for the local constant case, and do a pre-increment in all the other cases. (KJS::PostDecResolveNode::emitCode): Ditto. (KJS::PostIncBracketNode::emitCode): Ditto. (KJS::PostDecBracketNode::emitCode): Ditto. (KJS::PostIncDotNode::emitCode): Ditto. (KJS::PostDecDotNode::emitCode): Ditto. (KJS::DeleteValueNode::emitCode): Pass ignoredResult() when evaluating the expression. (KJS::VoidNode::emitCode): Ditto. (KJS::TypeOfResolveNode::emitCode): If dst == ignoredResult(), do nothing if the identifier resolves to a local variable, and don't bother generating a typeof opcode in the other case. (KJS::TypeOfValueNode::emitCode): Ditto. (KJS::PreIncResolveNode::emitCode): Do nothing if dst == ignoredResult() and the identifier resolves to a local constant. (KJS::PreDecResolveNode::emitCode): Ditto. (KJS::AssignResolveNode::emitCode): Turn ignoredResult() into 0 in a couple places, because we need to put the result into a register so we can assign it. At other sites this is taken care of by functions like finalDestination. (KJS::CommaNode::emitCode): Pass ignoredResult() when evaluating the first expression. (KJS::ForNode::emitCode): Pass ignoredResult() when evaluating the first and third expressions. (KJS::ForInNode::emitCode): Pass ignoredResult() when evaluating the first expression.
File:
1 edited

Legend:

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

    r34851 r34852  
    272272RegisterID* NullNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    273273{
     274    if (dst == ignoredResult())
     275        return 0;
    274276    return generator.emitLoad(generator.finalDestination(dst), jsNull());
    275277}
     
    279281RegisterID* BooleanNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    280282{
     283    if (dst == ignoredResult())
     284        return 0;
    281285    return generator.emitLoad(generator.finalDestination(dst), m_value);
    282286}
     
    286290RegisterID* NumberNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    287291{
     292    if (dst == ignoredResult())
     293        return 0;
    288294    return generator.emitLoad(generator.finalDestination(dst), m_double);
    289295}
     
    293299RegisterID* StringNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    294300{
     301    if (dst == ignoredResult())
     302        return 0;
    295303    // FIXME: should we try to atomize constant strings?
    296304    return generator.emitLoad(generator.finalDestination(dst), jsOwnedString(generator.globalExec(), m_value));
     
    303311    if (!m_regExp->isValid())
    304312        return emitThrowError(generator, SyntaxError, ("Invalid regular expression: " + UString(m_regExp->errorMessage())).UTF8String().c_str());
     313    if (dst == ignoredResult())
     314        return 0;
    305315    return generator.emitNewRegExp(generator.finalDestination(dst), m_regExp.get());
    306316}
     
    310320RegisterID* ThisNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    311321{
     322    if (dst == ignoredResult())
     323        return 0;
    312324    return generator.moveToDestinationIfNeeded(dst, generator.thisRegister());
    313325}
     
    322334RegisterID* ResolveNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    323335{
    324     if (RegisterID* local = generator.registerForLocal(m_ident))
     336    if (RegisterID* local = generator.registerForLocal(m_ident)) {
     337        if (dst == ignoredResult())
     338            return 0;
    325339        return generator.moveToDestinationIfNeeded(dst, local);
     340    }
    326341
    327342    return generator.emitResolve(generator.finalDestination(dst), m_ident);
     
    365380RegisterID* ObjectLiteralNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    366381{
    367     if (m_list)
    368         return generator.emitNode(dst, m_list.get());
    369     return generator.emitNewObject(generator.finalDestination(dst));
     382     if (!m_list) {
     383         if (dst == ignoredResult())
     384             return 0;
     385         return generator.emitNewObject(generator.finalDestination(dst));
     386     }
     387     return generator.emitNode(dst, m_list.get());
    370388}
    371389
     
    487505RegisterID* PostIncResolveNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    488506{
    489     // FIXME: I think we can detect the absense of dependent expressions here,
    490     // and emit a PreInc instead of a PostInc. A post-pass to eliminate dead
    491     // code would work, too.
    492507    if (RegisterID* local = generator.registerForLocal(m_ident)) {
    493         if (generator.isLocalConstant(m_ident))
     508        if (generator.isLocalConstant(m_ident)) {
     509            if (dst == ignoredResult())
     510                return 0;
    494511            return generator.emitToJSNumber(generator.finalDestination(dst), local);
    495        
     512        }
     513
     514        if (dst == ignoredResult())
     515            return generator.emitPreInc(local);
    496516        return generator.emitPostInc(generator.finalDestination(dst), local);
    497517    }
     
    501521    if (generator.findScopedProperty(m_ident, index, depth) && index != missingSymbolMarker()) {
    502522        RefPtr<RegisterID> value = generator.emitGetScopedVar(generator.newTemporary(), depth, index);
    503         RegisterID* oldValue = generator.emitPostInc(generator.finalDestination(dst), value.get());
     523        RegisterID* oldValue;
     524        if (dst == ignoredResult()) {
     525            oldValue = 0;
     526            generator.emitPreInc(value.get());
     527        } else {
     528            oldValue = generator.emitPostInc(generator.finalDestination(dst), value.get());
     529        }
    504530        generator.emitPutScopedVar(depth, index, value.get());
    505531        return oldValue;
     
    508534    RefPtr<RegisterID> value = generator.newTemporary();
    509535    RefPtr<RegisterID> base = generator.emitResolveWithBase(generator.newTemporary(), value.get(), m_ident);
    510     RegisterID* oldValue = generator.emitPostInc(generator.finalDestination(dst), value.get());
     536    RegisterID* oldValue;
     537    if (dst == ignoredResult()) {
     538        oldValue = 0;
     539        generator.emitPreInc(value.get());
     540    } else {
     541        oldValue = generator.emitPostInc(generator.finalDestination(dst), value.get());
     542    }
    511543    generator.emitPutById(base.get(), m_ident, value.get());
    512544    return oldValue;
     
    515547RegisterID* PostDecResolveNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    516548{
    517     // FIXME: I think we can detect the absense of dependent expressions here,
    518     // and emit a PreDec instead of a PostDec. A post-pass to eliminate dead
    519     // code would work, too.
    520549    if (RegisterID* local = generator.registerForLocal(m_ident)) {
    521         if (generator.isLocalConstant(m_ident))
     550        if (generator.isLocalConstant(m_ident)) {
     551            if (dst == ignoredResult())
     552                return 0;
    522553            return generator.emitToJSNumber(generator.finalDestination(dst), local);
    523        
     554        }
     555
     556        if (dst == ignoredResult())
     557            return generator.emitPreDec(local);
    524558        return generator.emitPostDec(generator.finalDestination(dst), local);
    525559    }
     
    529563    if (generator.findScopedProperty(m_ident, index, depth) && index != missingSymbolMarker()) {
    530564        RefPtr<RegisterID> value = generator.emitGetScopedVar(generator.newTemporary(), depth, index);
    531         RegisterID* oldValue = generator.emitPostDec(generator.finalDestination(dst), value.get());
     565        RegisterID* oldValue;
     566        if (dst == ignoredResult()) {
     567            oldValue = 0;
     568            generator.emitPreDec(value.get());
     569        } else {
     570            oldValue = generator.emitPostDec(generator.finalDestination(dst), value.get());
     571        }
    532572        generator.emitPutScopedVar(depth, index, value.get());
    533573        return oldValue;
     
    536576    RefPtr<RegisterID> value = generator.newTemporary();
    537577    RefPtr<RegisterID> base = generator.emitResolveWithBase(generator.newTemporary(), value.get(), m_ident);
    538     RegisterID* oldValue = generator.emitPostDec(generator.finalDestination(dst), value.get());
     578    RegisterID* oldValue;
     579    if (dst == ignoredResult()) {
     580        oldValue = 0;
     581        generator.emitPreDec(value.get());
     582    } else {
     583        oldValue = generator.emitPostDec(generator.finalDestination(dst), value.get());
     584    }
    539585    generator.emitPutById(base.get(), m_ident, value.get());
    540586    return oldValue;
     
    548594    RefPtr<RegisterID> property = generator.emitNode(m_subscript.get());
    549595    RefPtr<RegisterID> value = generator.emitGetByVal(generator.newTemporary(), base.get(), property.get());
    550     RegisterID* oldValue = generator.emitPostInc(generator.finalDestination(dst), value.get());
     596    RegisterID* oldValue;
     597    if (dst == ignoredResult()) {
     598        oldValue = 0;
     599        generator.emitPreInc(value.get());
     600    } else {
     601        oldValue = generator.emitPostInc(generator.finalDestination(dst), value.get());
     602    }
    551603    generator.emitPutByVal(base.get(), property.get(), value.get());
    552604    return oldValue;
     
    558610    RefPtr<RegisterID> property = generator.emitNode(m_subscript.get());
    559611    RefPtr<RegisterID> value = generator.emitGetByVal(generator.newTemporary(), base.get(), property.get());
    560     RegisterID* oldValue = generator.emitPostDec(generator.finalDestination(dst), value.get());
     612    RegisterID* oldValue;
     613    if (dst == ignoredResult()) {
     614        oldValue = 0;
     615        generator.emitPreDec(value.get());
     616    } else {
     617        oldValue = generator.emitPostDec(generator.finalDestination(dst), value.get());
     618    }
    561619    generator.emitPutByVal(base.get(), property.get(), value.get());
    562620    return oldValue;
     
    569627    RefPtr<RegisterID> base = generator.emitNode(m_base.get());
    570628    RefPtr<RegisterID> value = generator.emitGetById(generator.newTemporary(), base.get(), m_ident);
    571     RegisterID* oldValue = generator.emitPostInc(generator.finalDestination(dst), value.get());
     629    RegisterID* oldValue;
     630    if (dst == ignoredResult()) {
     631        oldValue = 0;
     632        generator.emitPreInc(value.get());
     633    } else {
     634        oldValue = generator.emitPostInc(generator.finalDestination(dst), value.get());
     635    }
    572636    generator.emitPutById(base.get(), m_ident, value.get());
    573637    return oldValue;
     
    578642    RefPtr<RegisterID> base = generator.emitNode(m_base.get());
    579643    RefPtr<RegisterID> value = generator.emitGetById(generator.newTemporary(), base.get(), m_ident);
    580     RegisterID* oldValue = generator.emitPostDec(generator.finalDestination(dst), value.get());
     644    RegisterID* oldValue;
     645    if (dst == ignoredResult()) {
     646        oldValue = 0;
     647        generator.emitPreDec(value.get());
     648    } else {
     649        oldValue = generator.emitPostDec(generator.finalDestination(dst), value.get());
     650    }
    581651    generator.emitPutById(base.get(), m_ident, value.get());
    582652    return oldValue;
     
    622692RegisterID* DeleteValueNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    623693{
    624     generator.emitNode(m_expr.get());
     694    generator.emitNode(ignoredResult(), m_expr.get());
    625695
    626696    // delete on a non-location expression ignores the value and returns true
     
    632702RegisterID* VoidNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    633703{
     704    if (dst == ignoredResult()) {
     705        generator.emitNode(ignoredResult(), m_expr.get());
     706        return 0;
     707    }
    634708    RefPtr<RegisterID> r0 = generator.emitNode(m_expr.get());
    635709    return generator.emitLoad(generator.finalDestination(dst, r0.get()), jsUndefined());
     
    640714RegisterID* TypeOfResolveNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    641715{
    642     if (RegisterID* local = generator.registerForLocal(m_ident))
     716    if (RegisterID* local = generator.registerForLocal(m_ident)) {
     717        if (dst == ignoredResult())
     718            return 0;
    643719        return generator.emitTypeOf(generator.finalDestination(dst), local);
     720    }
    644721
    645722    RefPtr<RegisterID> scratch = generator.emitResolveBase(generator.tempDestination(dst), m_ident);
    646723    generator.emitGetById(scratch.get(), scratch.get(), m_ident);
     724    if (dst == ignoredResult())
     725        return 0;
    647726    return generator.emitTypeOf(generator.finalDestination(dst, scratch.get()), scratch.get());
    648727}
     
    652731RegisterID* TypeOfValueNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    653732{
     733    if (dst == ignoredResult()) {
     734        generator.emitNode(ignoredResult(), m_expr.get());
     735        return 0;
     736    }
    654737    RefPtr<RegisterID> src = generator.emitNode(m_expr.get());
    655738    return generator.emitTypeOf(generator.finalDestination(dst), src.get());
     
    662745    if (RegisterID* local = generator.registerForLocal(m_ident)) {
    663746        if (generator.isLocalConstant(m_ident)) {
     747            if (dst == ignoredResult())
     748                return 0;
    664749            RefPtr<RegisterID> r0 = generator.emitLoad(generator.finalDestination(dst), 1.0);
    665750            return generator.emitBinaryOp(op_add, r0.get(), local, r0.get());
    666751        }
    667        
     752
    668753        generator.emitPreInc(local);
    669754        return generator.moveToDestinationIfNeeded(dst, local);
     
    690775    if (RegisterID* local = generator.registerForLocal(m_ident)) {
    691776        if (generator.isLocalConstant(m_ident)) {
     777            if (dst == ignoredResult())
     778                return 0;
    692779            RefPtr<RegisterID> r0 = generator.emitLoad(generator.finalDestination(dst), -1.0);
    693780            return generator.emitBinaryOp(op_add, r0.get(), local, r0.get());
     
    9441031    size_t depth = 0;
    9451032    if (generator.findScopedProperty(m_ident, index, depth) && index != missingSymbolMarker()) {
     1033        if (dst == ignoredResult())
     1034            dst = 0;
    9461035        RegisterID* value = generator.emitNode(dst, m_right.get());
    9471036        generator.emitPutScopedVar(depth, index, value);
     
    9501039
    9511040    RefPtr<RegisterID> base = generator.emitResolveBase(generator.newTemporary(), m_ident);
     1041    if (dst == ignoredResult())
     1042        dst = 0;
    9521043    RegisterID* value = generator.emitNode(dst, m_right.get());
    9531044    return generator.emitPutById(base.get(), m_ident, value);
     
    10131104RegisterID* CommaNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    10141105{
    1015     generator.emitNode(m_expr1.get());
     1106    generator.emitNode(ignoredResult(), m_expr1.get());
    10161107    return generator.emitNode(dst, m_expr2.get());
    10171108}
     
    12341325{
    12351326    if (m_expr1)
    1236         generator.emitNode(m_expr1.get());
     1327        generator.emitNode(ignoredResult(), m_expr1.get());
    12371328   
    12381329    RefPtr<LabelID> topOfLoop = generator.newLabel();
     
    12481339    generator.emitLabel(continueTarget.get());
    12491340    if (m_expr3)
    1250         generator.emitNode(m_expr3.get());
     1341        generator.emitNode(ignoredResult(), m_expr3.get());
    12511342
    12521343    generator.emitLabel(beforeCondition.get());
     
    12821373{
    12831374    if (in)
    1284         m_init = new AssignResolveNode(globalData,ident, in, true);
     1375        m_init = new AssignResolveNode(globalData, ident, in, true);
    12851376    // for( var foo = bar in baz )
    12861377}
     
    12931384
    12941385    if (m_init)
    1295         generator.emitNode(m_init.get());
     1386        generator.emitNode(ignoredResult(), m_init.get());
    12961387    RegisterID* forInBase = generator.emitNode(m_expr.get());
    12971388    RefPtr<RegisterID> iter = generator.emitGetPropertyNames(generator.newTemporary(), forInBase);
Note: See TracChangeset for help on using the changeset viewer.