]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - bytecode/StructureStubInfo.cpp
JavaScriptCore-903.tar.gz
[apple/javascriptcore.git] / bytecode / StructureStubInfo.cpp
index bf3fdc4659bcdbfc33930ced14bcab89b7185a68..9dd41a6e32f7bda7831d47f1170b01cc98225c23 100644 (file)
 #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();