Changeset 55002 in webkit for trunk/JavaScriptCore/bytecode


Ignore:
Timestamp:
Feb 18, 2010, 10:23:25 PM (15 years ago)
Author:
[email protected]
Message:

2010-02-18 Oliver Hunt <[email protected]>

Reviewed by Gavin Barraclough.

Improve interpreter getter performance
https://bugs.webkit.org/show_bug.cgi?id=35138

Improve the performance of getter dispatch by making it possible
for the interpreter to cache the GetterSetter object lookup.

To do this we simply need to make PropertySlot aware of getters
as a potentially cacheable property, and record the base and this
objects for a getter access. This allows us to use more-or-less
identical code to that used by the normal get_by_id caching, with
the dispatch being the only actual difference.

I'm holding off of implementing this in the JIT until I do some
cleanup to try and making coding in the JIT not be as horrible
as it is currently.

  • bytecode/CodeBlock.cpp: (JSC::CodeBlock::dump): (JSC::CodeBlock::derefStructures): (JSC::CodeBlock::refStructures):
  • bytecode/Opcode.h:
  • interpreter/Interpreter.cpp: (JSC::Interpreter::resolveGlobal): (JSC::Interpreter::tryCacheGetByID): (JSC::Interpreter::privateExecute):
  • jit/JIT.cpp: (JSC::JIT::privateCompileMainPass):
  • jit/JITStubs.cpp: (JSC::JITThunks::tryCacheGetByID): (JSC::DEFINE_STUB_FUNCTION):
  • runtime/JSObject.cpp: (JSC::JSObject::fillGetterPropertySlot):
  • runtime/PropertySlot.cpp: (JSC::PropertySlot::functionGetter):
  • runtime/PropertySlot.h: (JSC::PropertySlot::isGetter): (JSC::PropertySlot::isCacheable): (JSC::PropertySlot::isCacheableValue): (JSC::PropertySlot::setValueSlot): (JSC::PropertySlot::setGetterSlot): (JSC::PropertySlot::setCacheableGetterSlot): (JSC::PropertySlot::clearOffset): (JSC::PropertySlot::thisValue):
Location:
trunk/JavaScriptCore/bytecode
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/bytecode/CodeBlock.cpp

    r54789 r55002  
    766766            break;
    767767        }
     768        case op_get_by_id_getter_self: {
     769            printGetByIdOp(exec, location, it, "get_by_id_getter_self");
     770            break;
     771        }
     772        case op_get_by_id_getter_self_list: {
     773            printGetByIdOp(exec, location, it, "get_by_id_getter_self_list");
     774            break;
     775        }
     776        case op_get_by_id_getter_proto: {
     777            printGetByIdOp(exec, location, it, "get_by_id_getter_proto");
     778            break;
     779        }
     780        case op_get_by_id_getter_proto_list: {
     781            printGetByIdOp(exec, location, it, "get_by_id_getter_proto_list");
     782            break;
     783        }
     784        case op_get_by_id_getter_chain: {
     785            printGetByIdOp(exec, location, it, "get_by_id_getter_chain");
     786            break;
     787        }
    768788        case op_get_by_id_generic: {
    769789            printGetByIdOp(exec, location, it, "get_by_id_generic");
     
    13561376    Interpreter* interpreter = m_globalData->interpreter;
    13571377
    1358     if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_self)) {
     1378    if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_self) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_getter_self)) {
    13591379        vPC[4].u.structure->deref();
    13601380        return;
    13611381    }
    1362     if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_proto)) {
     1382    if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_proto) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_getter_proto)) {
    13631383        vPC[4].u.structure->deref();
    13641384        vPC[5].u.structure->deref();
    13651385        return;
    13661386    }
    1367     if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_chain)) {
     1387    if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_chain) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_getter_chain)) {
    13681388        vPC[4].u.structure->deref();
    13691389        vPC[5].u.structureChain->deref();
     
    13861406    }
    13871407    if ((vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_proto_list))
    1388         || (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_self_list))) {
     1408        || (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_self_list))
     1409        || (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_getter_proto_list))
     1410        || (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_getter_self_list))) {
    13891411        PolymorphicAccessStructureList* polymorphicStructures = vPC[4].u.polymorphicStructures;
    13901412        polymorphicStructures->derefStructures(vPC[5].u.operand);
     
    14011423    Interpreter* interpreter = m_globalData->interpreter;
    14021424
    1403     if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_self)) {
     1425    if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_self) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_getter_self)) {
    14041426        vPC[4].u.structure->ref();
    14051427        return;
    14061428    }
    1407     if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_proto)) {
     1429    if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_proto) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_getter_proto)) {
    14081430        vPC[4].u.structure->ref();
    14091431        vPC[5].u.structure->ref();
    14101432        return;
    14111433    }
    1412     if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_chain)) {
     1434    if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_chain) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_getter_chain)) {
    14131435        vPC[4].u.structure->ref();
    14141436        vPC[5].u.structureChain->ref();
  • trunk/JavaScriptCore/bytecode/Opcode.h

    r53891 r55002  
    105105        macro(op_get_by_id_proto_list, 8) \
    106106        macro(op_get_by_id_chain, 8) \
     107        macro(op_get_by_id_getter_self, 8) \
     108        macro(op_get_by_id_getter_self_list, 8) \
     109        macro(op_get_by_id_getter_proto, 8) \
     110        macro(op_get_by_id_getter_proto_list, 8) \
     111        macro(op_get_by_id_getter_chain, 8) \
    107112        macro(op_get_by_id_generic, 8) \
    108113        macro(op_get_array_length, 8) \
Note: See TracChangeset for help on using the changeset viewer.