Ignore:
Timestamp:
Jan 16, 2015, 12:40:22 PM (10 years ago)
Author:
[email protected]
Message:

REGRESSION (r174226): Header on huffingtonpost.com is too large
https://bugs.webkit.org/show_bug.cgi?id=140306

Reviewed by Filip Pizlo.

Source/JavaScriptCore:

BytecodeGenerator::willResolveToArguments() is used to check to see if we can use the
arguments register or whether we need to resolve "arguments". If the arguments have
been captured, then they are stored in the lexical environment and the arguments
register is not used.

Changed BytecodeGenerator::willResolveToArguments() to also check to see if the arguments
register is captured. Renamed the function to willResolveToArgumentsRegister() to
better indicate what we are checking.

Aligned 32 and 64 bit paths in ArgumentsRecoveryGenerator::generateFor() for creating
an arguments object that was optimized out of an inlined callFrame. The 32 bit path
incorrectly calculated the location of the reified callee frame. This alignment resulted
in the removal of operationCreateInlinedArgumentsDuringOSRExit()

  • bytecompiler/BytecodeGenerator.cpp:

(JSC::BytecodeGenerator::willResolveToArgumentsRegister):
(JSC::BytecodeGenerator::uncheckedLocalArgumentsRegister):
(JSC::BytecodeGenerator::emitCall):
(JSC::BytecodeGenerator::emitConstruct):
(JSC::BytecodeGenerator::emitEnumeration):
(JSC::BytecodeGenerator::willResolveToArguments): Deleted.

  • bytecompiler/BytecodeGenerator.h:
  • bytecompiler/NodesCodegen.cpp:

(JSC::BracketAccessorNode::emitBytecode):
(JSC::DotAccessorNode::emitBytecode):
(JSC::getArgumentByVal):
(JSC::ApplyFunctionCallDotNode::emitBytecode):
(JSC::ArrayPatternNode::emitDirectBinding):

  • dfg/DFGOSRExitCompilerCommon.cpp:

(JSC::DFG::ArgumentsRecoveryGenerator::generateFor):

  • dfg/DFGOperations.cpp:

(JSC::operationCreateInlinedArgumentsDuringOSRExit): Deleted.

  • dfg/DFGOperations.h:

(JSC::operationCreateInlinedArgumentsDuringOSRExit): Deleted.

LayoutTests:

Updated js/arguments-iterator to test changing argument to array values.
Removed tests that changed arguments to a string and an object as they were
bogus and didn't test what the appeared to test.
for .. of works on iterable objects only.

Added new regression test, js/regress-140306.

  • js/arguments-iterator-expected.txt:
  • js/regress-140306-expected.txt: Added.
  • js/regress-140306.html: Added.
  • js/script-tests/arguments-iterator.js:

(testEmptyArrayArguments):
(testArrayArguments):
(testOverwrittenArguments): Deleted.
(testNullArguments): Deleted.
(testNonArrayLikeArguments): Deleted.

  • js/script-tests/regress-140306.js: Added.

(checkArgs):
(applyToArgs):

File:
1 edited

Legend:

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

    r178435 r178591  
    383383{
    384384    if (m_base->isResolveNode()
    385         && generator.willResolveToArguments(static_cast<ResolveNode*>(m_base)->identifier())
     385        && generator.willResolveToArgumentsRegister(static_cast<ResolveNode*>(m_base)->identifier())
    386386        && !generator.symbolTable().slowArguments()) {
    387387        RefPtr<RegisterID> property = generator.emitNode(m_subscript);
     
    419419            goto nonArgumentsPath;
    420420        ResolveNode* resolveNode = static_cast<ResolveNode*>(m_base);
    421         if (!generator.willResolveToArguments(resolveNode->identifier()))
     421        if (!generator.willResolveToArgumentsRegister(resolveNode->identifier()))
    422422            goto nonArgumentsPath;
    423423        generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
     
    600600{
    601601    if (base->isResolveNode()
    602         && generator.willResolveToArguments(static_cast<ResolveNode*>(base)->identifier())
     602        && generator.willResolveToArgumentsRegister(static_cast<ResolveNode*>(base)->identifier())
    603603        && !generator.symbolTable().slowArguments()) {
    604604        generator.emitExpressionInfo(divot, divotStart, divotEnd);
     
    758758        RefPtr<RegisterID> argsRegister;
    759759        ArgumentListNode* args = m_args->m_listNode->m_next;
    760         if (args->m_expr->isResolveNode() && generator.willResolveToArguments(static_cast<ResolveNode*>(args->m_expr)->identifier()) && !generator.symbolTable().slowArguments())
     760        if (args->m_expr->isResolveNode() && generator.willResolveToArgumentsRegister(static_cast<ResolveNode*>(args->m_expr)->identifier()) && !generator.symbolTable().slowArguments())
    761761            argsRegister = generator.uncheckedLocalArgumentsRegister();
    762762        else
     
    27772777{
    27782778    if (rhs->isResolveNode()
    2779         && generator.willResolveToArguments(static_cast<ResolveNode*>(rhs)->identifier())
     2779        && generator.willResolveToArgumentsRegister(static_cast<ResolveNode*>(rhs)->identifier())
    27802780        && generator.hasSafeLocalArgumentsRegister()&& !generator.symbolTable().slowArguments()) {
    27812781        for (size_t i = 0; i < m_targetPatterns.size(); i++) {
Note: See TracChangeset for help on using the changeset viewer.