]> granicus.if.org Git - jq/commitdiff
Print stack value refcounts when tracing (#636)
authorNicolas Williams <nico@cryptonector.com>
Sat, 29 Nov 2014 00:56:06 +0000 (18:56 -0600)
committerNicolas Williams <nico@cryptonector.com>
Sat, 29 Nov 2014 01:26:41 +0000 (19:26 -0600)
jq_test.c
jv.h
jv_print.c

index 150691365da899efcb558b99fb8745bce4a16e95..c924cc16ae8e2cd2750bd4116c0aab86d359fade 100644 (file)
--- 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 08b89aec4477c27c9a8f4905d04c30d07ab9f1b7..5dca65cde888fac5543afd0073861a3c8cc1dac0 100644 (file)
--- 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);
index 4467266ba144ab59d3529a0897da4ec9b02073eb..fb21c6318918201bf74c08c51541362a17aa59da 100644 (file)
@@ -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<sizeof(colour_kinds)/sizeof(colour_kinds[0]); i++) {
       if (jv_get_kind(x) == colour_kinds[i]) {
@@ -164,6 +173,8 @@ static void jv_dump_term(struct dtoa_context* C, jv x, int flags, int indent, FI
   }
   case JV_KIND_STRING:
     jvp_dump_string(x, flags & JV_PRINT_ASCII, F, S);
+    if (flags & JV_PRINT_REFCOUNT)
+      put_refcnt(C, refcnt, F, S);
     break;
   case JV_KIND_ARRAY: {
     if (jv_array_length(jv_copy(x)) == 0) {
@@ -193,6 +204,8 @@ static void jv_dump_term(struct dtoa_context* C, jv x, int flags, int indent, FI
     }
     if (colour) put_str(colour, F, S);
     put_char(']', F, S);
+    if (flags & JV_PRINT_REFCOUNT)
+      put_refcnt(C, refcnt, F, S);
     break;
   }
   case JV_KIND_OBJECT: {
@@ -263,6 +276,8 @@ static void jv_dump_term(struct dtoa_context* C, jv x, int flags, int indent, FI
     }
     if (colour) put_str(colour, F, S);
     put_char('}', F, S);
+    if (flags & JV_PRINT_REFCOUNT)
+      put_refcnt(C, refcnt, F, S);
   }
   }
   jv_free(x);