Ignore:
Timestamp:
Nov 12, 2014, 1:13:13 PM (11 years ago)
Author:
[email protected]
Message:

Generate get_by_id for bracket access with constant string subscript.
<https://webkit.org/b/138663>

Reviewed by Michael Saboff.

Transform of into o.f when generating bytecode. This allows our JIT
to inline-cache those accesses instead of always dropping out to C++.

This is surprisingly common in real-web content, less so in benchmarks.
Interestingly, Speedometer does hit the optimization quite a bit.

  • bytecompiler/NodesCodegen.cpp:

(JSC::BracketAccessorNode::emitBytecode):

File:
1 edited

Legend:

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

    r175426 r176035  
    390390    }
    391391
    392     RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base, m_subscriptHasAssignments, m_subscript->isPure(generator));
    393     RegisterID* property = generator.emitNode(m_subscript);
     392    RegisterID* ret;
     393    RegisterID* finalDest = generator.finalDestination(dst);
     394
     395    if (m_subscript->isString()) {
     396        RefPtr<RegisterID> base = generator.emitNode(m_base);
     397        ret = generator.emitGetById(finalDest, base.get(), static_cast<StringNode*>(m_subscript)->value());
     398    } else {
     399        RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(m_base, m_subscriptHasAssignments, m_subscript->isPure(generator));
     400        RegisterID* property = generator.emitNode(m_subscript);
     401        ret = generator.emitGetByVal(finalDest, base.get(), property);
     402    }
     403
    394404    generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
    395     RegisterID* finalDest = generator.finalDestination(dst);
    396     RegisterID* ret = generator.emitGetByVal(finalDest, base.get(), property);
     405
    397406    if (generator.vm()->typeProfiler()) {
    398407        generator.emitProfileType(finalDest, ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
Note: See TracChangeset for help on using the changeset viewer.