diff --git a/src/value.c b/src/value.c index 345ff8e..3fa7ee3 100644 --- a/src/value.c +++ b/src/value.c @@ -784,7 +784,7 @@ json_t *json_true(void) { static json_t the_true = { .type = JSON_TRUE, - .refcount = (unsigned int)1 + .refcount = (unsigned int)-1 }; return &the_true; } @@ -794,7 +794,7 @@ json_t *json_false(void) { static json_t the_false = { .type = JSON_FALSE, - .refcount = (unsigned int)1 + .refcount = (unsigned int)-1 }; return &the_false; } @@ -804,7 +804,7 @@ json_t *json_null(void) { static json_t the_null = { .type = JSON_NULL, - .refcount = (unsigned int)1 + .refcount = (unsigned int)-1 }; return &the_null; } diff --git a/test/suites/api/test_simple.c b/test/suites/api/test_simple.c index 45f22c7..1769c65 100644 --- a/test/suites/api/test_simple.c +++ b/test/suites/api/test_simple.c @@ -150,5 +150,36 @@ int main() fail("json_null failed"); json_decref(value); + /* Test reference counting on singletons (true, false, null) */ + value = json_true(); + if(value->refcount != (unsigned int)-1) + fail("refcounting true works incorrectly"); + json_decref(value); + if(value->refcount != (unsigned int)-1) + fail("refcounting true works incorrectly"); + json_incref(value); + if(value->refcount != (unsigned int)-1) + fail("refcounting true works incorrectly"); + + value = json_false(); + if(value->refcount != (unsigned int)-1) + fail("refcounting false works incorrectly"); + json_decref(value); + if(value->refcount != (unsigned int)-1) + fail("refcounting false works incorrectly"); + json_incref(value); + if(value->refcount != (unsigned int)-1) + fail("refcounting false works incorrectly"); + + value = json_null(); + if(value->refcount != (unsigned int)-1) + fail("refcounting null works incorrectly"); + json_decref(value); + if(value->refcount != (unsigned int)-1) + fail("refcounting null works incorrectly"); + json_incref(value); + if(value->refcount != (unsigned int)-1) + fail("refcounting null works incorrectly"); + return 0; }