/*
- * 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
#include "config.h"
#include "StructureStubInfo.h"
+#include "JSObject.h"
+#include "PolymorphicGetByIdList.h"
+#include "PolymorphicPutByIdList.h"
+
namespace JSC {
#if ENABLE(JIT)
void StructureStubInfo::deref()
{
- switch (opcodeID) {
- case op_get_by_id_self:
- u.getByIdSelf.baseObjectStructure->deref();
- return;
- case op_get_by_id_proto:
- u.getByIdProto.baseObjectStructure->deref();
- u.getByIdProto.prototypeStructure->deref();
+ switch (accessType) {
+ case access_get_by_id_list: {
+ delete u.getByIdList.list;
return;
- case op_get_by_id_chain:
- u.getByIdChain.baseObjectStructure->deref();
- u.getByIdChain.chain->deref();
+ }
+ case access_put_by_id_list:
+ delete u.putByIdList.list;
return;
- case op_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 op_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_get_by_id_chain:
+ 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();
+ }
+}
+
+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_chain:
+ if (!Heap::isMarked(u.getByIdChain.baseObjectStructure.get())
+ || !Heap::isMarked(u.getByIdChain.chain.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:
+ 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;
}
- case op_put_by_id_transition:
- u.putByIdTransition.previousStructure->deref();
- u.putByIdTransition.structure->deref();
- u.putByIdTransition.chain->deref();
- return;
- case op_put_by_id_replace:
- u.putByIdReplace.baseObjectStructure->deref();
- 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.
- return;
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