]> granicus.if.org Git - json-c/commitdiff
Drop the _delete field from struct json_object and call the type-specific delete...
authorEric Haszlakiewicz <erh+git@nimenees.com>
Sat, 13 Jun 2020 18:34:35 +0000 (18:34 +0000)
committerEric Haszlakiewicz <erh+git@nimenees.com>
Sat, 13 Jun 2020 18:34:35 +0000 (18:34 +0000)
json_object.c
json_object_private.h

index 8615ff51cf5c33beb9f84e87ee5ded12d56f178b..42d4efdbc4f7362ab5716718339a1b7877817c4f 100644 (file)
@@ -121,15 +121,17 @@ static inline const struct json_object_string *JC_STRING_C(const struct json_obj
 #define JC_CONCAT(a,b) a##b
 #define JC_CONCAT3(a,b,c) a##b##c
 
-#define JSON_OBJECT_NEW(jtype, delete_fn) \
+#define JSON_OBJECT_NEW(jtype) \
     (struct JC_CONCAT(json_object_,jtype) *)json_object_new(JC_CONCAT(json_type_,jtype), \
                sizeof(struct JC_CONCAT(json_object_,jtype)), \
-               &JC_CONCAT3(json_object_,jtype,_to_json_string), \
-               delete_fn)
+               &JC_CONCAT3(json_object_,jtype,_to_json_string))
 static inline struct json_object *json_object_new(enum json_type o_type,
        size_t alloc_size,
-       json_object_to_json_string_fn *to_json_string,
-       json_object_private_delete_fn *delete_fn);
+       json_object_to_json_string_fn *to_json_string);
+
+static void json_object_object_delete(struct json_object *jso_base);
+static void json_object_string_delete(struct json_object *jso);
+static void json_object_array_delete(struct json_object *jso);
 
 static json_object_to_json_string_fn json_object_object_to_json_string;
 static json_object_to_json_string_fn json_object_boolean_to_json_string;
@@ -322,7 +324,21 @@ int json_object_put(struct json_object *jso)
 
        if (jso->_user_delete)
                jso->_user_delete(jso, jso->_userdata);
-       jso->_delete(jso);
+       switch(jso->o_type)
+       {
+       case json_type_object:
+               json_object_object_delete(jso);
+               break;
+       case json_type_array:
+               json_object_array_delete(jso);
+               break;
+       case json_type_string:
+               json_object_string_delete(jso);
+               break;
+       default:
+               json_object_generic_delete(jso);
+               break;
+       }
        return 1;
 }
 
@@ -341,8 +357,7 @@ static void json_object_generic_delete(struct json_object *jso)
 
 static inline struct json_object *json_object_new(enum json_type o_type,
        size_t alloc_size,
-       json_object_to_json_string_fn *to_json_string,
-       json_object_private_delete_fn *delete_fn)
+       json_object_to_json_string_fn *to_json_string)
 {
        struct json_object *jso;
 
@@ -352,7 +367,6 @@ static inline struct json_object *json_object_new(enum json_type o_type,
 
        jso->o_type = o_type;
        jso->_ref_count = 1;
-       jso->_delete = delete_fn;
        jso->_to_json_string = to_json_string;
        jso->_pb = NULL;
        jso->_user_delete = NULL;
@@ -552,7 +566,7 @@ static void json_object_object_delete(struct json_object *jso_base)
 
 struct json_object *json_object_new_object(void)
 {
-       struct json_object_object *jso = JSON_OBJECT_NEW(object, &json_object_object_delete);
+       struct json_object_object *jso = JSON_OBJECT_NEW(object);
        if (!jso)
                return NULL;
        jso->c_object =
@@ -676,7 +690,7 @@ static int json_object_boolean_to_json_string(struct json_object *jso, struct pr
 
 struct json_object *json_object_new_boolean(json_bool b)
 {
-       struct json_object_boolean *jso = JSON_OBJECT_NEW(boolean, &json_object_generic_delete);
+       struct json_object_boolean *jso = JSON_OBJECT_NEW(boolean);
        if (!jso)
                return NULL;
        jso->c_boolean = b;
@@ -794,7 +808,7 @@ int json_object_set_int(struct json_object *jso, int new_value)
 
 struct json_object *json_object_new_int64(int64_t i)
 {
-       struct json_object_int *jso = JSON_OBJECT_NEW(int, &json_object_generic_delete);
+       struct json_object_int *jso = JSON_OBJECT_NEW(int);
        if (!jso)
                return NULL;
        jso->cint.c_int64 = i;
@@ -804,7 +818,7 @@ struct json_object *json_object_new_int64(int64_t i)
 
 struct json_object *json_object_new_uint64(uint64_t i)
 {
-       struct json_object_int *jso = JSON_OBJECT_NEW(int, &json_object_generic_delete);
+       struct json_object_int *jso = JSON_OBJECT_NEW(int);
        if (!jso)
                return NULL;
        jso->cint.c_uint64 = i;
@@ -1108,7 +1122,7 @@ int json_object_double_to_json_string(struct json_object *jso, struct printbuf *
 
 struct json_object *json_object_new_double(double d)
 {
-       struct json_object_double *jso = JSON_OBJECT_NEW(double, &json_object_generic_delete);
+       struct json_object_double *jso = JSON_OBJECT_NEW(double);
        if (!jso)
                return NULL;
        jso->base._to_json_string = &json_object_double_to_json_string_default;
@@ -1273,7 +1287,7 @@ static struct json_object *_json_object_new_string(const char *s, const size_t l
                objsize += sizeof(void *) - len;
 
     jso = (struct json_object_string *)json_object_new(json_type_string, objsize,
-               &json_object_string_to_json_string, &json_object_string_delete);
+               &json_object_string_to_json_string);
 
        if (!jso)
                return NULL;
@@ -1427,7 +1441,7 @@ static void json_object_array_delete(struct json_object *jso)
 
 struct json_object *json_object_new_array(void)
 {
-       struct json_object_array *jso = JSON_OBJECT_NEW(array, &json_object_array_delete);
+       struct json_object_array *jso = JSON_OBJECT_NEW(array);
        if (!jso)
                return NULL;
        jso->c_array = array_list_new(&json_object_array_entry_free);
index 7cd90c2189d129ef62ef5b263ede9e24add06975..44139557e1111ad561a1a5b3b796d4fb4f5151c8 100644 (file)
@@ -29,8 +29,6 @@ struct json_object;
 typedef SSIZE_T ssize_t;
 #endif
 
-typedef void (json_object_private_delete_fn)(struct json_object *o);
-
 /* json object int type, support extension*/
 typedef enum json_object_int_type
 {
@@ -42,7 +40,6 @@ struct json_object
 {
        enum json_type o_type;
        uint32_t _ref_count;
-       json_object_private_delete_fn *_delete;
        json_object_to_json_string_fn *_to_json_string;
        struct printbuf *_pb;
        json_object_delete_fn *_user_delete;