From f284e3c069abcdfc1145e939b0c284910c274d17 Mon Sep 17 00:00:00 2001 From: Petri Lehtinen Date: Tue, 23 Mar 2010 08:08:57 +0200 Subject: [PATCH] Fix reference counting on true, false and null Initialize their reference counts to (unsigned int)-1 to disable reference counting on them. It already was meant to work like this, but the reference counts were just initialized to 1 instead of -1. Thanks to Andrew Thompson for reporting this issue. --- src/value.c | 6 +++--- test/suites/api/test_simple.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) 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; }