X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/9dae56ea45a0f5f8136a5c93d6f3a7f99399ca73..14957cd040308e3eeec43d26bae5d76da13fcd85:/bytecode/StructureStubInfo.cpp?ds=inline diff --git a/bytecode/StructureStubInfo.cpp b/bytecode/StructureStubInfo.cpp index bf3fdc4..9dd41a6 100644 --- a/bytecode/StructureStubInfo.cpp +++ b/bytecode/StructureStubInfo.cpp @@ -26,50 +26,82 @@ #include "config.h" #include "StructureStubInfo.h" +#include "JSObject.h" +#include "ScopeChain.h" + namespace JSC { #if ENABLE(JIT) void StructureStubInfo::deref() { - switch (opcodeID) { - case op_get_by_id_self: - u.getByIdSelf.baseObjectStructure->deref(); + switch (accessType) { + case access_get_by_id_self_list: { + PolymorphicAccessStructureList* polymorphicStructures = u.getByIdSelfList.structureList; + delete polymorphicStructures; + return; + } + case access_get_by_id_proto_list: { + PolymorphicAccessStructureList* polymorphicStructures = u.getByIdProtoList.structureList; + delete polymorphicStructures; + return; + } + case access_get_by_id_self: + case access_get_by_id_proto: + case access_get_by_id_chain: + case access_put_by_id_transition: + case access_put_by_id_replace: + case access_get_by_id: + case access_put_by_id: + case access_get_by_id_generic: + case access_put_by_id_generic: + case access_get_array_length: + case access_get_string_length: + // These instructions don't have to release any allocated memory + return; + default: + ASSERT_NOT_REACHED(); + } +} + +void StructureStubInfo::visitAggregate(SlotVisitor& visitor) +{ + switch (accessType) { + case access_get_by_id_self: + visitor.append(&u.getByIdSelf.baseObjectStructure); return; - case op_get_by_id_proto: - u.getByIdProto.baseObjectStructure->deref(); - u.getByIdProto.prototypeStructure->deref(); + case access_get_by_id_proto: + visitor.append(&u.getByIdProto.baseObjectStructure); + visitor.append(&u.getByIdProto.prototypeStructure); return; - case op_get_by_id_chain: - u.getByIdChain.baseObjectStructure->deref(); - u.getByIdChain.chain->deref(); + case access_get_by_id_chain: + visitor.append(&u.getByIdChain.baseObjectStructure); + visitor.append(&u.getByIdChain.chain); return; - case op_get_by_id_self_list: { + case access_get_by_id_self_list: { PolymorphicAccessStructureList* polymorphicStructures = u.getByIdSelfList.structureList; - polymorphicStructures->derefStructures(u.getByIdSelfList.listSize); - delete polymorphicStructures; + polymorphicStructures->visitAggregate(visitor, u.getByIdSelfList.listSize); return; } - case op_get_by_id_proto_list: { + case access_get_by_id_proto_list: { PolymorphicAccessStructureList* polymorphicStructures = u.getByIdProtoList.structureList; - polymorphicStructures->derefStructures(u.getByIdProtoList.listSize); - delete polymorphicStructures; + polymorphicStructures->visitAggregate(visitor, u.getByIdProtoList.listSize); return; } - case op_put_by_id_transition: - u.putByIdTransition.previousStructure->deref(); - u.putByIdTransition.structure->deref(); - u.putByIdTransition.chain->deref(); + case access_put_by_id_transition: + visitor.append(&u.putByIdTransition.previousStructure); + visitor.append(&u.putByIdTransition.structure); + visitor.append(&u.putByIdTransition.chain); return; - case op_put_by_id_replace: - u.putByIdReplace.baseObjectStructure->deref(); + case access_put_by_id_replace: + visitor.append(&u.putByIdReplace.baseObjectStructure); return; - case op_get_by_id: - case op_put_by_id: - case op_get_by_id_generic: - case op_put_by_id_generic: - case op_get_array_length: - case op_get_string_length: - // These instructions don't ref their Structures. + case access_get_by_id: + case access_put_by_id: + case access_get_by_id_generic: + case access_put_by_id_generic: + case access_get_array_length: + case access_get_string_length: + // These instructions don't need to mark anything return; default: ASSERT_NOT_REACHED();