]> git.saurik.com Git - cycript.git/blobdiff - Pooling.hpp
If possible, use the new debug synchronous GC API.
[cycript.git] / Pooling.hpp
index bd37c5c2d77f8d8be13ebcaf750bd0f65eaa4ee1..e3116d949623df36169bd35e9b3bac96ab52f79f 100644 (file)
@@ -62,6 +62,11 @@ class CYPool {
         return (size + 7) & ~0x3;
     }
 
+    template <typename Type_>
+    static void delete_(void *data) {
+        reinterpret_cast<Type_ *>(data)->~Type_();
+    }
+
     CYPool(const CYPool &);
 
   public:
@@ -99,6 +104,8 @@ class CYPool {
     }
 
     char *strdup(const char *data) {
+        if (data == NULL)
+            return NULL;
         return reinterpret_cast<char *>(memdup(data, strlen(data) + 1));
     }
 
@@ -180,6 +187,13 @@ class CYPool {
     }
 
     void atexit(void (*code)(void *), void *data = NULL);
+
+    template <typename Type_>
+    Type_ &object() {
+        Type_ *value(new(*this) Type_());
+        atexit(&delete_<Type_>, value);
+        return *value;
+    }
 };
 
 _finline void *operator new(size_t size, CYPool &pool) {