Ignore:
Timestamp:
Sep 25, 2010, 2:42:00 PM (15 years ago)
Author:
[email protected]
Message:

2010-09-25 Oliver Hunt <[email protected]>

Reviewed by Cameron Zwarich.

Avoid constructing arguments object when accessing length and index properties
https://bugs.webkit.org/show_bug.cgi?id=46572

Add opcodes to read argument length and properties, and then implement them.
Much like other lazy opcodes these opcodes take a fast path when the arguments
object has not been instantiated, and fall back on generic access mechanisms
if they are acting on an instantiated object.

3% win on v8-earleyboyer, no change elsewhere.

  • bytecode/CodeBlock.cpp: (JSC::CodeBlock::dump):
  • bytecode/Opcode.h:
  • bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::emitGetArgumentsLength): (JSC::BytecodeGenerator::emitGetArgumentByVal):
  • bytecompiler/BytecodeGenerator.h:
  • bytecompiler/NodesCodegen.cpp: (JSC::BracketAccessorNode::emitBytecode): (JSC::DotAccessorNode::emitBytecode):
  • interpreter/Interpreter.cpp: (JSC::Interpreter::privateExecute):
  • jit/JIT.cpp: (JSC::JIT::privateCompileMainPass): (JSC::JIT::privateCompileSlowCases):
  • jit/JIT.h:
  • jit/JITOpcodes.cpp: (JSC::JIT::emit_op_get_arguments_length): (JSC::JIT::emitSlow_op_get_arguments_length): (JSC::JIT::emit_op_get_argument_by_val): (JSC::JIT::emitSlow_op_get_argument_by_val):
  • jit/JITOpcodes32_64.cpp: (JSC::JIT::emit_op_get_arguments_length): (JSC::JIT::emitSlow_op_get_arguments_length): (JSC::JIT::emit_op_get_argument_by_val): (JSC::JIT::emitSlow_op_get_argument_by_val):
File:
1 edited

Legend:

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

    r65593 r68338  
    291291RegisterID* BracketAccessorNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    292292{
     293    if (m_base->isResolveNode() && generator.willResolveToArguments(static_cast<ResolveNode*>(m_base)->identifier())) {
     294        RegisterID* property = generator.emitNode(m_subscript);
     295        generator.emitExpressionInfo(divot(), startOffset(), endOffset());   
     296        return generator.emitGetArgumentByVal(generator.finalDestination(dst), generator.uncheckedRegisterForArguments(), property);
     297    }
     298
    293299    RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base, m_subscriptHasAssignments, m_subscript->isPure(generator));
    294300    RegisterID* property = generator.emitNode(m_subscript);
     
    301307RegisterID* DotAccessorNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
    302308{
     309    if (m_ident == generator.propertyNames().length) {
     310        if (!m_base->isResolveNode())
     311            goto nonArgumentsPath;
     312        ResolveNode* resolveNode = static_cast<ResolveNode*>(m_base);
     313        if (!generator.willResolveToArguments(resolveNode->identifier()))
     314            goto nonArgumentsPath;
     315        generator.emitExpressionInfo(divot(), startOffset(), endOffset());   
     316        return generator.emitGetArgumentsLength(generator.finalDestination(dst), generator.uncheckedRegisterForArguments());
     317    }
     318
     319nonArgumentsPath:
    303320    RegisterID* base = generator.emitNode(m_base);
    304321    generator.emitExpressionInfo(divot(), startOffset(), endOffset());
Note: See TracChangeset for help on using the changeset viewer.