X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/f9bf01c6616d5ddcf65b13b33cedf9e387ff7a63..ed1e77d3adeb83d26fd1dfb16dd84cabdcefd250:/bytecode/StructureStubInfo.cpp?ds=inline diff --git a/bytecode/StructureStubInfo.cpp b/bytecode/StructureStubInfo.cpp index 018d832..5ea530c 100644 --- a/bytecode/StructureStubInfo.cpp +++ b/bytecode/StructureStubInfo.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 Apple Inc. All rights reserved. + * Copyright (C) 2008, 2014 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,54 +26,79 @@ #include "config.h" #include "StructureStubInfo.h" +#include "JSObject.h" +#include "PolymorphicGetByIdList.h" +#include "PolymorphicPutByIdList.h" + namespace JSC { #if ENABLE(JIT) void StructureStubInfo::deref() { switch (accessType) { - case access_get_by_id_self: - u.getByIdSelf.baseObjectStructure->deref(); - return; - case access_get_by_id_proto: - u.getByIdProto.baseObjectStructure->deref(); - u.getByIdProto.prototypeStructure->deref(); + case access_get_by_id_list: { + delete u.getByIdList.list; return; - case access_get_by_id_chain: - u.getByIdChain.baseObjectStructure->deref(); - u.getByIdChain.chain->deref(); + } + case access_put_by_id_list: + delete u.putByIdList.list; return; - case access_get_by_id_self_list: { - PolymorphicAccessStructureList* polymorphicStructures = u.getByIdSelfList.structureList; - polymorphicStructures->derefStructures(u.getByIdSelfList.listSize); + case access_in_list: { + PolymorphicAccessStructureList* polymorphicStructures = u.inList.structureList; delete polymorphicStructures; return; } - case access_get_by_id_proto_list: { - PolymorphicAccessStructureList* polymorphicStructures = u.getByIdProtoList.structureList; - polymorphicStructures->derefStructures(u.getByIdProtoList.listSize); - delete polymorphicStructures; + case access_get_by_id_self: + case access_put_by_id_transition_normal: + case access_put_by_id_transition_direct: + case access_put_by_id_replace: + case access_unset: + // These instructions don't have to release any allocated memory return; + default: + RELEASE_ASSERT_NOT_REACHED(); } - case access_put_by_id_transition: - u.putByIdTransition.previousStructure->deref(); - u.putByIdTransition.structure->deref(); - u.putByIdTransition.chain->deref(); - return; +} + +bool StructureStubInfo::visitWeakReferences(RepatchBuffer& repatchBuffer) +{ + switch (accessType) { + case access_get_by_id_self: + if (!Heap::isMarked(u.getByIdSelf.baseObjectStructure.get())) + return false; + break; + case access_get_by_id_list: { + if (!u.getByIdList.list->visitWeak(repatchBuffer)) + return false; + break; + } + case access_put_by_id_transition_normal: + case access_put_by_id_transition_direct: + if (!Heap::isMarked(u.putByIdTransition.previousStructure.get()) + || !Heap::isMarked(u.putByIdTransition.structure.get()) + || !Heap::isMarked(u.putByIdTransition.chain.get())) + return false; + break; case access_put_by_id_replace: - u.putByIdReplace.baseObjectStructure->deref(); - return; - 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 ref their Structures. - return; + if (!Heap::isMarked(u.putByIdReplace.baseObjectStructure.get())) + return false; + break; + case access_put_by_id_list: + if (!u.putByIdList.list->visitWeak(repatchBuffer)) + return false; + break; + case access_in_list: { + PolymorphicAccessStructureList* polymorphicStructures = u.inList.structureList; + if (!polymorphicStructures->visitWeak(u.inList.listSize)) + return false; + break; + } default: - ASSERT_NOT_REACHED(); + // The rest of the instructions don't require references, so there is no need to + // do anything. + break; } + return true; } #endif