X-Git-Url: https://git.cworth.org/git?p=notmuch;a=blobdiff_plain;f=bindings%2Fruby%2Fdefs.h;h=7ddb5df5ae0df3ef02f1cc52a67cf432374dc643;hp=995bcafd2b0e78e003a9e73419c1805c19e9cd8c;hb=02b162116079a0b2e35823e5590a82056d22c8af;hpb=02cf4a50bb531aab7afdb1b48ecc656211b791e8 diff --git a/bindings/ruby/defs.h b/bindings/ruby/defs.h index 995bcafd..7ddb5df5 100644 --- a/bindings/ruby/defs.h +++ b/bindings/ruby/defs.h @@ -66,7 +66,7 @@ extern const rb_data_type_t notmuch_rb_messages_type; extern const rb_data_type_t notmuch_rb_message_type; extern const rb_data_type_t notmuch_rb_tags_type; -#define Data_Get_Notmuch_Object(obj, type, ptr) \ +#define Data_Get_Notmuch_Rb_Object(obj, type, ptr) \ do { \ (ptr) = rb_check_typeddata ((obj), (type)); \ if (RB_UNLIKELY (!(ptr))) { \ @@ -75,8 +75,15 @@ extern const rb_data_type_t notmuch_rb_tags_type; } \ } while (0) +#define Data_Get_Notmuch_Object(obj, type, ptr) \ + do { \ + notmuch_rb_object_t *rb_wrapper; \ + Data_Get_Notmuch_Rb_Object ((obj), (type), rb_wrapper); \ + (ptr) = rb_wrapper->nm_object; \ + } while (0) + #define Data_Wrap_Notmuch_Object(klass, type, ptr) \ - TypedData_Wrap_Struct ((klass), (type), (ptr)) + TypedData_Wrap_Struct ((klass), (type), notmuch_rb_object_create ((ptr))) #define Data_Get_Notmuch_Database(obj, ptr) \ Data_Get_Notmuch_Object ((obj), ¬much_rb_database_type, (ptr)) @@ -105,16 +112,38 @@ extern const rb_data_type_t notmuch_rb_tags_type; #define Data_Get_Notmuch_Tags(obj, ptr) \ Data_Get_Notmuch_Object ((obj), ¬much_rb_tags_type, (ptr)) +typedef struct { + void *nm_object; +} notmuch_rb_object_t; + +static inline void * +notmuch_rb_object_create (void *nm_object) +{ + notmuch_rb_object_t *rb_wrapper = malloc (sizeof (*rb_wrapper)); + if (RB_UNLIKELY (!rb_wrapper)) + return NULL; + + rb_wrapper->nm_object = nm_object; + return rb_wrapper; +} + +static inline void +notmuch_rb_object_free (void *rb_wrapper) +{ + free (rb_wrapper); +} + static inline notmuch_status_t notmuch_rb_object_destroy (VALUE rb_object, const rb_data_type_t *type) { - void *nm_object; + notmuch_rb_object_t *rb_wrapper; notmuch_status_t ret; - Data_Get_Notmuch_Object (rb_object, type, nm_object); + Data_Get_Notmuch_Rb_Object (rb_object, type, rb_wrapper); /* Call the corresponding notmuch_*_destroy function */ - ret = ((notmuch_status_t (*)(void *)) type->data) (nm_object); + ret = ((notmuch_status_t (*)(void *)) type->data) (rb_wrapper->nm_object); + notmuch_rb_object_free (rb_wrapper); DATA_PTR (rb_object) = NULL; return ret;