Ignore:
Timestamp:
Oct 10, 2014, 12:03:20 PM (11 years ago)
Author:
[email protected]
Message:

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

Reviewed by Michael Saboff.

Rework the way we track |arguments| references so that we don't try
to use the |arguments| reference on the stack if it's not safe.

To do this without nuking performance it was necessary to update
the parser to track modification of the |arguments| reference
itself.

  • bytecode/CodeBlock.cpp:
  • bytecompiler/BytecodeGenerator.cpp:

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

  • bytecompiler/BytecodeGenerator.h:

(JSC::BytecodeGenerator::hasSafeLocalArgumentsRegister):

  • bytecompiler/NodesCodegen.cpp:

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

  • interpreter/StackVisitor.cpp:

(JSC::StackVisitor::Frame::existingArguments):

  • parser/Nodes.h:

(JSC::ScopeNode::modifiesArguments):

  • parser/Parser.cpp:

(JSC::Parser<LexerType>::parseInner):

  • parser/Parser.h:

(JSC::Scope::getCapturedVariables):

  • parser/ParserModes.h:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/parser/Parser.cpp

    r173026 r174606  
    272272    IdentifierSet capturedVariables;
    273273    bool modifiedParameter = false;
    274     scope->getCapturedVariables(capturedVariables, modifiedParameter);
     274    bool modifiedArguments = false;
     275    scope->getCapturedVariables(capturedVariables, modifiedParameter, modifiedArguments);
    275276   
    276277    CodeFeatures features = context.features();
     
    281282    if (modifiedParameter)
    282283        features |= ModifiedParameterFeature;
    283    
     284    if (modifiedArguments)
     285        features |= ModifiedArgumentsFeature;
    284286    Vector<RefPtr<StringImpl>> closedVariables;
    285287    if (m_parsingBuiltin) {
     
    293295            if (scope->hasDeclaredParameter(Identifier(m_vm, variable.get())))
    294296                continue;
     297
     298            if (variable == m_vm->propertyNames->arguments.impl())
     299                continue;
     300
    295301            closedVariables.append(variable);
    296302        }
Note: See TracChangeset for help on using the changeset viewer.