X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/9dae56ea45a0f5f8136a5c93d6f3a7f99399ca73..14957cd040308e3eeec43d26bae5d76da13fcd85:/bytecode/Instruction.h?ds=sidebyside diff --git a/bytecode/Instruction.h b/bytecode/Instruction.h index 1fab106..b3bb5b7 100644 --- a/bytecode/Instruction.h +++ b/bytecode/Instruction.h @@ -29,83 +29,104 @@ #ifndef Instruction_h #define Instruction_h +#include "MacroAssembler.h" #include "Opcode.h" +#include "PropertySlot.h" #include "Structure.h" +#include "StructureChain.h" #include -#define POLYMORPHIC_LIST_CACHE_SIZE 4 +#define POLYMORPHIC_LIST_CACHE_SIZE 8 namespace JSC { + // *Sigh*, If the JIT is enabled we need to track the stubRountine (of type CodeLocationLabel), + // If the JIT is not in use we don't actually need the variable (that said, if the JIT is not in use we don't + // curently actually use PolymorphicAccessStructureLists, which we should). Anyway, this seems like the best + // solution for now - will need to something smarter if/when we actually want mixed-mode operation. +#if ENABLE(JIT) + typedef CodeLocationLabel PolymorphicAccessStructureListStubRoutineType; +#else + typedef void* PolymorphicAccessStructureListStubRoutineType; +#endif + class JSCell; class Structure; class StructureChain; // Structure used by op_get_by_id_self_list and op_get_by_id_proto_list instruction to hold data off the main opcode stream. struct PolymorphicAccessStructureList { + WTF_MAKE_FAST_ALLOCATED; + public: struct PolymorphicStubInfo { bool isChain; - void* stubRoutine; - Structure* base; + PolymorphicAccessStructureListStubRoutineType stubRoutine; + WriteBarrier base; union { - Structure* proto; - StructureChain* chain; + WriteBarrierBase proto; + WriteBarrierBase chain; } u; - void set(void* _stubRoutine, Structure* _base) + PolymorphicStubInfo() + { + u.proto.clear(); + } + + void set(JSGlobalData& globalData, JSCell* owner, PolymorphicAccessStructureListStubRoutineType _stubRoutine, Structure* _base) { stubRoutine = _stubRoutine; - base = _base; - u.proto = 0; + base.set(globalData, owner, _base); + u.proto.clear(); isChain = false; } - void set(void* _stubRoutine, Structure* _base, Structure* _proto) + void set(JSGlobalData& globalData, JSCell* owner, PolymorphicAccessStructureListStubRoutineType _stubRoutine, Structure* _base, Structure* _proto) { stubRoutine = _stubRoutine; - base = _base; - u.proto = _proto; + base.set(globalData, owner, _base); + u.proto.set(globalData, owner, _proto); isChain = false; } - void set(void* _stubRoutine, Structure* _base, StructureChain* _chain) + void set(JSGlobalData& globalData, JSCell* owner, PolymorphicAccessStructureListStubRoutineType _stubRoutine, Structure* _base, StructureChain* _chain) { stubRoutine = _stubRoutine; - base = _base; - u.chain = _chain; + base.set(globalData, owner, _base); + u.chain.set(globalData, owner, _chain); isChain = true; } } list[POLYMORPHIC_LIST_CACHE_SIZE]; - PolymorphicAccessStructureList(void* stubRoutine, Structure* firstBase) + PolymorphicAccessStructureList(JSGlobalData& globalData, JSCell* owner, PolymorphicAccessStructureListStubRoutineType stubRoutine, Structure* firstBase) { - list[0].set(stubRoutine, firstBase); + list[0].set(globalData, owner, stubRoutine, firstBase); } - PolymorphicAccessStructureList(void* stubRoutine, Structure* firstBase, Structure* firstProto) + PolymorphicAccessStructureList(JSGlobalData& globalData, JSCell* owner, PolymorphicAccessStructureListStubRoutineType stubRoutine, Structure* firstBase, Structure* firstProto) { - list[0].set(stubRoutine, firstBase, firstProto); + list[0].set(globalData, owner, stubRoutine, firstBase, firstProto); } - PolymorphicAccessStructureList(void* stubRoutine, Structure* firstBase, StructureChain* firstChain) + PolymorphicAccessStructureList(JSGlobalData& globalData, JSCell* owner, PolymorphicAccessStructureListStubRoutineType stubRoutine, Structure* firstBase, StructureChain* firstChain) { - list[0].set(stubRoutine, firstBase, firstChain); + list[0].set(globalData, owner, stubRoutine, firstBase, firstChain); } - void derefStructures(int count) + void visitAggregate(SlotVisitor& visitor, int count) { for (int i = 0; i < count; ++i) { PolymorphicStubInfo& info = list[i]; - - ASSERT(info.base); - info.base->deref(); - - if (info.u.proto) { - if (info.isChain) - info.u.chain->deref(); - else - info.u.proto->deref(); + if (!info.base) { + // We're being marked during initialisation of an entry + ASSERT(!info.u.proto); + continue; } + + visitor.append(&info.base); + if (info.u.proto && !info.isChain) + visitor.append(&info.u.proto); + if (info.u.chain && info.isChain) + visitor.append(&info.u.chain); } } }; @@ -113,10 +134,10 @@ namespace JSC { struct Instruction { Instruction(Opcode opcode) { -#if !HAVE(COMPUTED_GOTO) +#if !ENABLE(COMPUTED_GOTO_INTERPRETER) // We have to initialize one of the pointer members to ensure that // the entire struct is initialized, when opcode is not a pointer. - u.jsCell = 0; + u.jsCell.clear(); #endif u.opcode = opcode; } @@ -125,23 +146,41 @@ namespace JSC { { // We have to initialize one of the pointer members to ensure that // the entire struct is initialized in 64-bit. - u.jsCell = 0; + u.jsCell.clear(); u.operand = operand; } - Instruction(Structure* structure) { u.structure = structure; } - Instruction(StructureChain* structureChain) { u.structureChain = structureChain; } - Instruction(JSCell* jsCell) { u.jsCell = jsCell; } + Instruction(JSGlobalData& globalData, JSCell* owner, Structure* structure) + { + u.structure.clear(); + u.structure.set(globalData, owner, structure); + } + Instruction(JSGlobalData& globalData, JSCell* owner, StructureChain* structureChain) + { + u.structureChain.clear(); + u.structureChain.set(globalData, owner, structureChain); + } + Instruction(JSGlobalData& globalData, JSCell* owner, JSCell* jsCell) + { + u.jsCell.clear(); + u.jsCell.set(globalData, owner, jsCell); + } Instruction(PolymorphicAccessStructureList* polymorphicStructures) { u.polymorphicStructures = polymorphicStructures; } + Instruction(PropertySlot::GetValueFunc getterFunc) { u.getterFunc = getterFunc; } union { Opcode opcode; int operand; - Structure* structure; - StructureChain* structureChain; - JSCell* jsCell; + WriteBarrierBase structure; + WriteBarrierBase structureChain; + WriteBarrierBase jsCell; PolymorphicAccessStructureList* polymorphicStructures; + PropertySlot::GetValueFunc getterFunc; } u; + + private: + Instruction(StructureChain*); + Instruction(Structure*); }; } // namespace JSC