Ignore:
Timestamp:
Jul 30, 2009, 1:57:44 PM (16 years ago)
Author:
[email protected]
Message:

Merged nitro-extreme branch into trunk.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/parser/Nodes.cpp

    r45904 r46598  
    356356    int identifierStart = divot() - startOffset();
    357357    generator.emitExpressionInfo(identifierStart + m_ident.size(), m_ident.size(), 0);
    358     generator.emitResolveFunction(thisRegister.get(), func.get(), m_ident);
     358    generator.emitResolveWithBase(thisRegister.get(), func.get(), m_ident);
    359359    return generator.emitCall(generator.finalDestination(dst, func.get()), func.get(), thisRegister.get(), m_args, divot(), startOffset(), endOffset());
    360360}
     
    376376RegisterID* FunctionCallDotNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    377377{
    378     RefPtr<RegisterID> base = generator.emitNode(m_base);
     378    RefPtr<RegisterID> function = generator.tempDestination(dst);
     379    RefPtr<RegisterID> thisRegister = generator.newTemporary();
     380    generator.emitNode(thisRegister.get(), m_base);
    379381    generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffset() - m_subexpressionDivotOffset, m_subexpressionEndOffset);
    380382    generator.emitMethodCheck();
    381     RefPtr<RegisterID> function = generator.emitGetById(generator.tempDestination(dst), base.get(), m_ident);
    382     RefPtr<RegisterID> thisRegister = generator.emitMove(generator.newTemporary(), base.get());
     383    generator.emitGetById(function.get(), thisRegister.get(), m_ident);
    383384    return generator.emitCall(generator.finalDestination(dst, function.get()), function.get(), thisRegister.get(), m_args, divot(), startOffset(), endOffset());
    384385}
     
    13741375RegisterID* ForNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    13751376{
    1376     if (dst == generator.ignoredResult())
    1377         dst = 0;
    1378 
    13791377    RefPtr<LabelScope> scope = generator.newLabelScope(LabelScope::Loop);
    13801378
     
    15641562        if (clauseExpression->isNumber()) {
    15651563            double value = static_cast<NumberNode*>(clauseExpression)->value();
    1566             JSValue jsValue = JSValue::makeInt32Fast(static_cast<int32_t>(value));
    1567             if ((typeForTable & ~SwitchNumber) || !jsValue || (jsValue.getInt32Fast() != value)) {
     1564            int32_t intVal = static_cast<int32_t>(value);
     1565            if ((typeForTable & ~SwitchNumber) || (intVal != value)) {
    15681566                typeForTable = SwitchNeither;
    15691567                break;
    15701568            }
    1571             int32_t intVal = static_cast<int32_t>(value);
    1572             ASSERT(intVal == value);
    15731569            if (intVal < min_num)
    15741570                min_num = intVal;
     
    17411737RegisterID* TryNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    17421738{
     1739    // NOTE: The catch and finally blocks must be labeled explicitly, so the
     1740    // optimizer knows they may be jumped to from anywhere.
     1741
    17431742    generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine());
    17441743
    17451744    RefPtr<Label> tryStartLabel = generator.newLabel();
    1746     RefPtr<Label> tryEndLabel = generator.newLabel();
    17471745    RefPtr<Label> finallyStart;
    17481746    RefPtr<RegisterID> finallyReturnAddr;
     
    17521750        generator.pushFinallyContext(finallyStart.get(), finallyReturnAddr.get());
    17531751    }
     1752
    17541753    generator.emitLabel(tryStartLabel.get());
    17551754    generator.emitNode(dst, m_tryBlock);
    1756     generator.emitLabel(tryEndLabel.get());
    17571755
    17581756    if (m_catchBlock) {
    1759         RefPtr<Label> handlerEndLabel = generator.newLabel();
    1760         generator.emitJump(handlerEndLabel.get());
    1761         RefPtr<RegisterID> exceptionRegister = generator.emitCatch(generator.newTemporary(), tryStartLabel.get(), tryEndLabel.get());
     1757        RefPtr<Label> catchEndLabel = generator.newLabel();
     1758       
     1759        // Normal path: jump over the catch block.
     1760        generator.emitJump(catchEndLabel.get());
     1761
     1762        // Uncaught exception path: the catch block.
     1763        RefPtr<Label> here = generator.emitLabel(generator.newLabel().get());
     1764        RefPtr<RegisterID> exceptionRegister = generator.emitCatch(generator.newTemporary(), tryStartLabel.get(), here.get());
    17621765        if (m_catchHasEval) {
    17631766            RefPtr<RegisterID> dynamicScopeObject = generator.emitNewObject(generator.newTemporary());
     
    17691772        generator.emitNode(dst, m_catchBlock);
    17701773        generator.emitPopScope();
    1771         generator.emitLabel(handlerEndLabel.get());
     1774        generator.emitLabel(catchEndLabel.get());
    17721775    }
    17731776
     
    17801783        RefPtr<RegisterID> highestUsedRegister = generator.highestUsedRegister();
    17811784        RefPtr<Label> finallyEndLabel = generator.newLabel();
     1785
     1786        // Normal path: invoke the finally block, then jump over it.
    17821787        generator.emitJumpSubroutine(finallyReturnAddr.get(), finallyStart.get());
    1783         // Use a label to record the subtle fact that sret will return to the
    1784         // next instruction. sret is the only way to jump without an explicit label.
    1785         generator.emitLabel(generator.newLabel().get());
    17861788        generator.emitJump(finallyEndLabel.get());
    17871789
    1788         // Finally block for exception path
    1789         RefPtr<RegisterID> tempExceptionRegister = generator.emitCatch(generator.newTemporary(), tryStartLabel.get(), generator.emitLabel(generator.newLabel().get()).get());
     1790        // Uncaught exception path: invoke the finally block, then re-throw the exception.
     1791        RefPtr<Label> here = generator.emitLabel(generator.newLabel().get());
     1792        RefPtr<RegisterID> tempExceptionRegister = generator.emitCatch(generator.newTemporary(), tryStartLabel.get(), here.get());
    17901793        generator.emitJumpSubroutine(finallyReturnAddr.get(), finallyStart.get());
    1791         // Use a label to record the subtle fact that sret will return to the
    1792         // next instruction. sret is the only way to jump without an explicit label.
    1793         generator.emitLabel(generator.newLabel().get());
    17941794        generator.emitThrow(tempExceptionRegister.get());
    17951795
    1796         // emit the finally block itself
     1796        // The finally block.
    17971797        generator.emitLabel(finallyStart.get());
    17981798        generator.emitNode(dst, m_finallyBlock);
Note: See TracChangeset for help on using the changeset viewer.