Changeset 174610 in webkit


Ignore:
Timestamp:
Oct 10, 2014, 1:30:32 PM (11 years ago)
Author:
[email protected]
Message:

Unreviewed, rolling out r174606.
https://bugs.webkit.org/show_bug.cgi?id=137621

broke a JSC test (Requested by estes on #webkit).

Reverted changeset:

"Various arguments optimisations in codegen fail to account
for arguments being in lexical record"
https://bugs.webkit.org/show_bug.cgi?id=137617
http://trac.webkit.org/changeset/174606

Location:
trunk/Source/JavaScriptCore
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r174606 r174610  
     12014-10-10  Commit Queue  <[email protected]>
     2
     3        Unreviewed, rolling out r174606.
     4        https://bugs.webkit.org/show_bug.cgi?id=137621
     5
     6        broke a JSC test (Requested by estes on #webkit).
     7
     8        Reverted changeset:
     9
     10        "Various arguments optimisations in codegen fail to account
     11        for arguments being in lexical record"
     12        https://bugs.webkit.org/show_bug.cgi?id=137617
     13        http://trac.webkit.org/changeset/174606
     14
    1152014-10-10  Oliver Hunt  <[email protected]>
    216
  • trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp

    r174606 r174610  
    38883888        if (codeBlock->usesArguments() && virtualReg == codeBlock->argumentsRegister())
    38893889            return;
    3890         if (codeBlock->usesArguments() && virtualReg == unmodifiedArgumentsRegister(codeBlock->argumentsRegister()))
    3891             return;
    38923890
    38933891        if (codeBlock->captureCount() && codeBlock->symbolTable()->isCaptured(operand)) {
  • trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp

    r174606 r174610  
    168168    , m_emptyValueRegister(0)
    169169    , m_globalObjectRegister(0)
    170     , m_localArgumentsRegister(0)
    171170    , m_finallyDepth(0)
    172171    , m_localScopeDepth(0)
     
    213212    , m_emptyValueRegister(0)
    214213    , m_globalObjectRegister(0)
    215     , m_localArgumentsRegister(0)
    216214    , m_finallyDepth(0)
    217215    , m_localScopeDepth(0)
     
    253251        instructions().append(m_lexicalEnvironmentRegister->index());
    254252    }
    255     RegisterID* localArgumentsRegister = nullptr;
    256253    RegisterID* scratch = addVar();
    257254    m_symbolTable->setCaptureStart(virtualRegisterForLocal(m_codeBlock->m_numVars).offset());
     
    260257        RegisterID* unmodifiedArgumentsRegister = addVar(); // Anonymous, so it can't be modified by user code.
    261258        RegisterID* argumentsRegister = addVar(propertyNames().arguments, IsVariable, NotWatchable); // Can be changed by assigning to 'arguments'.
    262 
    263         localArgumentsRegister = argumentsRegister;
    264259
    265260        // We can save a little space by hard-coding the knowledge that the two
     
    280275                RegisterID* uncheckedArgumentsRegister = &registerFor(JSC::unmodifiedArgumentsRegister(m_codeBlock->argumentsRegister()).offset());
    281276                initializeCapturedVariable(uncheckedArgumentsRegister, propertyNames().arguments, uncheckedArgumentsRegister);
    282                 if (functionBody->modifiesArguments()) {
    283                     emitOpcode(op_mov);
    284                     instructions().append(argumentsRegister->index());
    285                     instructions().append(addConstantValue(jsUndefined())->index());
    286                     emitOpcode(op_mov);
    287                     instructions().append(uncheckedArgumentsRegister->index());
    288                     instructions().append(addConstantValue(jsUndefined())->index());
    289                     localArgumentsRegister = nullptr;
    290                 }
    291277            }
    292278        }
     
    401387    m_thisRegister.setIndex(nextParameterIndex++);
    402388    m_codeBlock->addParameter();
    403 
    404389    for (size_t i = 0; i < parameters.size(); ++i, ++nextParameterIndex) {
    405390        int index = nextParameterIndex;
     
    435420        instructions().append(0);
    436421    }
    437     m_localArgumentsRegister = localArgumentsRegister;
    438422}
    439423
     
    448432    , m_emptyValueRegister(0)
    449433    , m_globalObjectRegister(0)
    450     , m_localArgumentsRegister(0)
    451434    , m_finallyDepth(0)
    452435    , m_localScopeDepth(0)
     
    563546        return false;
    564547
    565     if (m_codeBlock->usesArguments() && m_codeType == FunctionCode && m_localArgumentsRegister)
     548    if (m_codeBlock->usesArguments() && m_codeType == FunctionCode)
    566549        return true;
    567550   
     
    569552}
    570553
    571 RegisterID* BytecodeGenerator::uncheckedLocalArgumentsRegister()
     554RegisterID* BytecodeGenerator::uncheckedRegisterForArguments()
    572555{
    573556    ASSERT(willResolveToArguments(propertyNames().arguments));
    574     ASSERT(m_localArgumentsRegister);
    575     return m_localArgumentsRegister;
     557
     558    SymbolTableEntry entry = symbolTable().get(propertyNames().arguments.impl());
     559    ASSERT(!entry.isNull());
     560    return &registerFor(entry.getIndex());
    576561}
    577562
     
    18441829            RefPtr<RegisterID> argumentRegister;
    18451830            if (expression->isResolveNode() && willResolveToArguments(static_cast<ResolveNode*>(expression)->identifier()) && !symbolTable().slowArguments())
    1846                 argumentRegister = uncheckedLocalArgumentsRegister();
     1831                argumentRegister = uncheckedRegisterForArguments();
    18471832            else
    18481833                argumentRegister = expression->emitBytecode(*this, callArguments.argumentRegister(0));
     
    19861971            RefPtr<RegisterID> argumentRegister;
    19871972            if (expression->isResolveNode() && willResolveToArguments(static_cast<ResolveNode*>(expression)->identifier()) && !symbolTable().slowArguments())
    1988                 argumentRegister = uncheckedLocalArgumentsRegister();
     1973                argumentRegister = uncheckedRegisterForArguments();
    19891974            else
    19901975                argumentRegister = expression->emitBytecode(*this, callArguments.argumentRegister(0));
     
    25542539        emitLabel(loopStart.get());
    25552540        emitLoopHint();
    2556         emitGetArgumentByVal(value.get(), uncheckedLocalArgumentsRegister(), index.get());
     2541        emitGetArgumentByVal(value.get(), uncheckedRegisterForArguments(), index.get());
    25572542        callBack(*this, value.get());
    25582543   
     
    25602545        emitInc(index.get());
    25612546        emitLabel(loopCondition.get());
    2562         RefPtr<RegisterID> length = emitGetArgumentsLength(newTemporary(), uncheckedLocalArgumentsRegister());
     2547        RefPtr<RegisterID> length = emitGetArgumentsLength(newTemporary(), uncheckedRegisterForArguments());
    25632548        emitJumpIfTrue(emitEqualityOp(op_less, newTemporary(), index.get(), length.get()), loopStart.get());
    25642549        emitLabel(scope->breakTarget());
  • trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h

    r174606 r174610  
    278278
    279279        bool willResolveToArguments(const Identifier&);
    280 
    281         bool hasSafeLocalArgumentsRegister() { return m_localArgumentsRegister; }
    282         RegisterID* uncheckedLocalArgumentsRegister();
     280        RegisterID* uncheckedRegisterForArguments();
    283281
    284282        bool isCaptured(int operand);
     
    755753        RegisterID* m_emptyValueRegister;
    756754        RegisterID* m_globalObjectRegister;
    757         RegisterID* m_localArgumentsRegister;
    758 
    759755        Vector<Identifier, 16> m_watchableVariables;
    760756        SegmentedVector<RegisterID, 32> m_constantPoolRegisters;
  • trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp

    r174606 r174610  
    387387        RegisterID* property = generator.emitNode(m_subscript);
    388388        generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
    389         return generator.emitGetArgumentByVal(generator.finalDestination(dst), generator.uncheckedLocalArgumentsRegister(), property);
     389        return generator.emitGetArgumentByVal(generator.finalDestination(dst), generator.uncheckedRegisterForArguments(), property);
    390390    }
    391391
     
    413413            goto nonArgumentsPath;
    414414        generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
    415         return generator.emitGetArgumentsLength(generator.finalDestination(dst), generator.uncheckedLocalArgumentsRegister());
     415        return generator.emitGetArgumentsLength(generator.finalDestination(dst), generator.uncheckedRegisterForArguments());
    416416    }
    417417
     
    594594        && !generator.symbolTable().slowArguments()) {
    595595        generator.emitExpressionInfo(divot, divotStart, divotEnd);
    596         return generator.emitGetArgumentByVal(generator.finalDestination(dst), generator.uncheckedLocalArgumentsRegister(), property);
     596        return generator.emitGetArgumentByVal(generator.finalDestination(dst), generator.uncheckedRegisterForArguments(), property);
    597597    }
    598598    return nullptr;
     
    622622            RefPtr<RegisterID> argumentsRegister;
    623623            if (thisRegister)
    624                 argumentsRegister = generator.uncheckedLocalArgumentsRegister();
     624                argumentsRegister = generator.uncheckedRegisterForArguments();
    625625            else {
    626626                argumentsRegister = generator.emitNode(subject);
     
    750750        ArgumentListNode* args = m_args->m_listNode->m_next;
    751751        if (args->m_expr->isResolveNode() && generator.willResolveToArguments(static_cast<ResolveNode*>(args->m_expr)->identifier()) && !generator.symbolTable().slowArguments())
    752             argsRegister = generator.uncheckedLocalArgumentsRegister();
     752            argsRegister = generator.uncheckedRegisterForArguments();
    753753        else
    754754            argsRegister = generator.emitNode(args->m_expr);
     
    27222722    if (rhs->isResolveNode()
    27232723        && generator.willResolveToArguments(static_cast<ResolveNode*>(rhs)->identifier())
    2724         && generator.hasSafeLocalArgumentsRegister()&& !generator.symbolTable().slowArguments()) {
     2724        && !generator.symbolTable().slowArguments()) {
    27252725        for (size_t i = 0; i < m_targetPatterns.size(); i++) {
    27262726            auto target = m_targetPatterns[i];
     
    27302730            RefPtr<RegisterID> temp = generator.newTemporary();
    27312731            generator.emitLoad(temp.get(), jsNumber(i));
    2732             generator.emitGetArgumentByVal(temp.get(), generator.uncheckedLocalArgumentsRegister(), temp.get());
     2732            generator.emitGetArgumentByVal(temp.get(), generator.uncheckedRegisterForArguments(), temp.get());
    27332733            target->bindValue(generator, temp.get());
    27342734        }
  • trunk/Source/JavaScriptCore/interpreter/StackVisitor.cpp

    r174606 r174610  
    296296#endif // ENABLE(DFG_JIT)
    297297        reg = codeBlock()->argumentsRegister();
    298 
    299     if (codeBlock()->needsActivation())
    300         return jsCast<Arguments*>(callFrame()->lexicalEnvironment()->registerAt(unmodifiedArgumentsRegister(reg).offset()).get());
    301298   
    302299    JSValue result = callFrame()->r(unmodifiedArgumentsRegister(reg).offset()).jsValue();
  • trunk/Source/JavaScriptCore/parser/Nodes.h

    r174606 r174610  
    14411441        bool usesArguments() const { return (m_features & ArgumentsFeature) && !(m_features & ShadowsArgumentsFeature); }
    14421442        bool modifiesParameter() const { return m_features & ModifiedParameterFeature; }
    1443         bool modifiesArguments() const { return m_features & (EvalFeature | ModifiedArgumentsFeature); }
    14441443        bool isStrictMode() const { return m_features & StrictModeFeature; }
    14451444        void setUsesArguments() { m_features |= ArgumentsFeature; }
  • trunk/Source/JavaScriptCore/parser/Parser.cpp

    r174606 r174610  
    272272    IdentifierSet capturedVariables;
    273273    bool modifiedParameter = false;
    274     bool modifiedArguments = false;
    275     scope->getCapturedVariables(capturedVariables, modifiedParameter, modifiedArguments);
     274    scope->getCapturedVariables(capturedVariables, modifiedParameter);
    276275   
    277276    CodeFeatures features = context.features();
     
    282281    if (modifiedParameter)
    283282        features |= ModifiedParameterFeature;
    284     if (modifiedArguments)
    285         features |= ModifiedArgumentsFeature;
     283   
    286284    Vector<RefPtr<StringImpl>> closedVariables;
    287285    if (m_parsingBuiltin) {
     
    295293            if (scope->hasDeclaredParameter(Identifier(m_vm, variable.get())))
    296294                continue;
    297 
    298             if (variable == m_vm->propertyNames->arguments.impl())
    299                 continue;
    300 
    301295            closedVariables.append(variable);
    302296        }
  • trunk/Source/JavaScriptCore/parser/Parser.h

    r174606 r174610  
    280280    }
    281281
    282     void getCapturedVariables(IdentifierSet& capturedVariables, bool& modifiedParameter, bool& modifiedArguments)
     282    void getCapturedVariables(IdentifierSet& capturedVariables, bool& modifiedParameter)
    283283    {
    284284        if (m_needsFullActivation || m_usesEval) {
     
    293293        }
    294294        modifiedParameter = false;
    295         if (shadowsArguments())
    296             modifiedArguments = true;
    297295        if (m_declaredParameters.size()) {
    298296            IdentifierSet::iterator end = m_writtenVariables.end();
    299297            for (IdentifierSet::iterator ptr = m_writtenVariables.begin(); ptr != end; ++ptr) {
    300                 if (*ptr == m_vm->propertyNames->arguments.impl())
    301                     modifiedArguments = true;
    302298                if (!m_declaredParameters.contains(*ptr))
    303299                    continue;
  • trunk/Source/JavaScriptCore/parser/ParserModes.h

    r174606 r174610  
    7676const CodeFeatures ShadowsArgumentsFeature = 1 << 6;
    7777const CodeFeatures ModifiedParameterFeature = 1 << 7;
    78 const CodeFeatures ModifiedArgumentsFeature = 1 << 8;
    7978
    8079const CodeFeatures AllFeatures = EvalFeature | ArgumentsFeature | WithFeature | CatchFeature | ThisFeature | StrictModeFeature | ShadowsArgumentsFeature | ModifiedParameterFeature;
Note: See TracChangeset for help on using the changeset viewer.