From: Nicolas Williams Date: Sat, 29 Nov 2014 00:56:06 +0000 (-0600) Subject: Print stack value refcounts when tracing (#636) X-Git-Tag: jq-1.5rc1~56 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b349e7d9a80435e177d383c8ff9d552d15a96723;p=jq Print stack value refcounts when tracing (#636) --- diff --git a/jq_test.c b/jq_test.c index 1506913..c924cc1 100644 --- a/jq_test.c +++ b/jq_test.c @@ -73,7 +73,7 @@ static void run_jq_tests(FILE *testdata) { printf("\n"); pass = 0; } - jv as_string = jv_dump_string(jv_copy(expected), rand() & ~JV_PRINT_COLOUR); + jv as_string = jv_dump_string(jv_copy(expected), rand() & ~(JV_PRINT_COLOUR|JV_PRINT_REFCOUNT)); jv reparsed = jv_parse_sized(jv_string_value(as_string), jv_string_length_bytes(jv_copy(as_string))); assert(jv_equal(jv_copy(expected), jv_copy(reparsed))); jv_free(as_string); diff --git a/jv.h b/jv.h index 08b89ae..5dca65c 100644 --- a/jv.h +++ b/jv.h @@ -150,7 +150,14 @@ jv jv_object_iter_value(jv, int); int jv_get_refcnt(jv); -enum { JV_PRINT_PRETTY = 1, JV_PRINT_ASCII = 2, JV_PRINT_COLOUR = 4, JV_PRINT_SORTED = 8, JV_PRINT_INVALID = 16 }; +enum { + JV_PRINT_PRETTY = 1, + JV_PRINT_ASCII = 2, + JV_PRINT_COLOUR = 4, + JV_PRINT_SORTED = 8, + JV_PRINT_INVALID = 16, + JV_PRINT_REFCOUNT = 32, +}; void jv_dumpf(jv, FILE *f, int flags); void jv_dump(jv, int flags); void jv_show(jv, int flags); diff --git a/jv_print.c b/jv_print.c index 4467266..fb21c63 100644 --- a/jv_print.c +++ b/jv_print.c @@ -112,9 +112,18 @@ static void jvp_dump_string(jv str, int ascii_only, FILE* F, jv* S) { enum { INDENT = 2 }; +static void put_refcnt(struct dtoa_context* C, int refcnt, FILE *F, jv* S){ + char buf[JVP_DTOA_FMT_MAX_LEN]; + put_char(' ', F, S); + put_char('(', F, S); + put_str(jvp_dtoa_fmt(C, buf, refcnt), F, S); + put_char(')', F, S); +} + static void jv_dump_term(struct dtoa_context* C, jv x, int flags, int indent, FILE* F, jv* S) { char buf[JVP_DTOA_FMT_MAX_LEN]; const char* colour = 0; + double refcnt = (flags & JV_PRINT_REFCOUNT) ? jv_get_refcnt(x) - 1 : -1; if (flags & JV_PRINT_COLOUR) { for (unsigned i=0; i