diff options
author | Petri Lehtinen <petri@digip.org> | 2016-08-31 17:57:23 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-08-31 17:57:23 +0300 |
commit | 7d1af52ab46bd22c5f7b7e28a8d4dce2f0ef0420 (patch) | |
tree | 3810724356c6ce2199b883bdff6fc829de228234 | |
parent | 0ffecdbadee9f4541d74f31884300aeb5596de4c (diff) | |
parent | 63b9fd055248bcd427fd455ce9623431885b235e (diff) | |
download | jansson-7d1af52ab46bd22c5f7b7e28a8d4dce2f0ef0420.zip jansson-7d1af52ab46bd22c5f7b7e28a8d4dce2f0ef0420.tar.gz jansson-7d1af52ab46bd22c5f7b7e28a8d4dce2f0ef0420.tar.bz2 |
Merge pull request #301 from npmccallum/master
Add support for the cleanup attribute in GCC/Clang
-rw-r--r-- | doc/apiref.rst | 18 | ||||
-rw-r--r-- | src/jansson.h | 13 | ||||
-rw-r--r-- | test/suites/api/test_simple.c | 13 |
3 files changed, 44 insertions, 0 deletions
diff --git a/doc/apiref.rst b/doc/apiref.rst index a01e352..77578a9 100644 --- a/doc/apiref.rst +++ b/doc/apiref.rst @@ -253,6 +253,24 @@ other. Moreover, trying to encode the values with any of the encoding functions will fail. The encoder detects circular references and returns an error status. +Scope Dereferencing +------------------- + +It is possible to use the ``json_auto_t`` type to automatically +dereference a value at the end of a scope. For example:: + + void function(void) { + json_auto_t *value = NULL; + value = json_string("foo"); + /* json_decref(value) is automatically called. */ + } + +This feature is only available on GCC and Clang. So if your project +has a portability requirement for other compilers, you should avoid +this feature. + +Additionally, as always, care should be taken when passing values to +functions that steal references. True, False and Null ==================== diff --git a/src/jansson.h b/src/jansson.h index 17a6e7a..b1a040a 100644 --- a/src/jansson.h +++ b/src/jansson.h @@ -112,6 +112,19 @@ void json_decref(json_t *json) json_delete(json); } +#if defined(__GNUC__) || defined(__clang__) +static JSON_INLINE +void json_decrefp(json_t **json) +{ + if(json) { + json_decref(*json); + *json = NULL; + } +} + +#define json_auto_t json_t __attribute__((cleanup(json_decrefp))) +#endif + /* error reporting */ diff --git a/test/suites/api/test_simple.c b/test/suites/api/test_simple.c index 8b56954..e461561 100644 --- a/test/suites/api/test_simple.c +++ b/test/suites/api/test_simple.c @@ -224,4 +224,17 @@ static void run_tests() json_incref(value); if(value->refcount != (size_t)-1) fail("refcounting null works incorrectly"); + +#ifdef json_auto_t + value = json_string("foo"); + { + json_auto_t *test = json_incref(value); + /* Use test so GCC doesn't complain it is unused. */ + if(!json_is_string(test)) + fail("value type check failed"); + } + if(value->refcount != 1) + fail("automatic decrement failed"); + json_decref(value); +#endif } |