]> granicus.if.org Git - jq/commitdiff
Sensible error messages when a silly addition is performed.
authorStephen Dolan <mu@netsoc.tcd.ie>
Mon, 10 Sep 2012 15:07:03 +0000 (16:07 +0100)
committerStephen Dolan <mu@netsoc.tcd.ie>
Mon, 10 Sep 2012 15:15:05 +0000 (16:15 +0100)
Fix a test to no longer perform an invalid addition.

c/builtin.c
c/execute.c
c/jv.c
c/jv.h
c/testdata

index 26698680a0bc64ab27fda62a567d8d14eb3eaf16..45056fc009bd490330d8c667815c9e18aebd667e 100644 (file)
@@ -27,7 +27,9 @@ static void f_plus(jv input[], jv output[]) {
   } else if (jv_get_kind(a) == JV_KIND_OBJECT && jv_get_kind(b) == JV_KIND_OBJECT) {
     output[0] = jv_object_merge(a, b);
   } else {
-    output[0] = jv_string("wtf gaize");
+    output[0] = jv_invalid_with_msg(jv_string_fmt("Attempted to add %s and %s",
+                                                  jv_kind_name(jv_get_kind(a)),
+                                                  jv_kind_name(jv_get_kind(b))));
     jv_free(a);
     jv_free(b);
   }
index c8505bf6cbe34011e46f9e9313d53d3a52dc5697..f59e156e08eff6df58c205e438b53ffde844aefd 100644 (file)
@@ -376,7 +376,16 @@ jv jq_next() {
       struct cfunction* func = &frame_current_bytecode(&frame_stk)->globals->cfunctions[*pc++];
       func->fptr(cfunc_input, cfunc_output);
       top.value = cfunc_output[0];
-      stack_push(top);
+      if (jv_is_valid(top.value)) {
+        stack_push(top);
+      } else {
+        jv msg = jv_invalid_get_msg(top.value);
+        if (jv_get_kind(msg) == JV_KIND_STRING) {
+          fprintf(stderr, "jq: error: %s\n", jv_string_value(msg));
+        }
+        jv_free(msg);
+        goto do_backtrack;
+      }
       break;
     }
 
@@ -393,7 +402,16 @@ jv jq_next() {
       struct cfunction* func = &frame_current_bytecode(&frame_stk)->globals->cfunctions[*pc++];
       func->fptr(cfunc_input, cfunc_output);
       top.value = cfunc_output[0];
-      stack_push(top);
+      if (jv_is_valid(top.value)) {
+        stack_push(top);
+      } else {
+        jv msg = jv_invalid_get_msg(top.value);
+        if (jv_get_kind(msg) == JV_KIND_STRING) {
+          fprintf(stderr, "jq: error: %s\n", jv_string_value(msg));
+        }
+        jv_free(msg);
+        goto do_backtrack;
+      }
       break;
     }
 
diff --git a/c/jv.c b/c/jv.c
index 73805a0a3c8ea43c39af54ae8581c2f548a5fbf2..8c0c0348104fc5ea11c8166744355fe6fb83ce43 100644 (file)
--- a/c/jv.c
+++ b/c/jv.c
@@ -38,6 +38,21 @@ jv_kind jv_get_kind(jv x) {
   return x.kind;
 }
 
+const char* jv_kind_name(jv_kind k) {
+  switch (k) {
+  case JV_KIND_INVALID: return "<invalid>";
+  case JV_KIND_NULL:    return "null";
+  case JV_KIND_FALSE:   return "boolean";
+  case JV_KIND_TRUE:    return "boolean";
+  case JV_KIND_NUMBER:  return "number";
+  case JV_KIND_STRING:  return "string";
+  case JV_KIND_ARRAY:   return "array";
+  case JV_KIND_OBJECT:  return "object";
+  }
+  assert(0);
+  return "<unknown>";
+}
+
 static const jv JV_NULL = {JV_KIND_NULL, {0}};
 static const jv JV_FALSE = {JV_KIND_FALSE, {0}};
 static const jv JV_TRUE = {JV_KIND_TRUE, {0}};
diff --git a/c/jv.h b/c/jv.h
index c415ee28f14694f1bfb606fff9045e16ac083b71..9aadd4180289907690fe44a5ca5c9ccc77771b36 100644 (file)
--- a/c/jv.h
+++ b/c/jv.h
@@ -41,6 +41,7 @@ typedef struct {
  */
 
 jv_kind jv_get_kind(jv);
+const char* jv_kind_name(jv_kind);
 static int jv_is_valid(jv x) { return jv_get_kind(x) != JV_KIND_INVALID; }
 
 jv jv_copy(jv);
index f80249e465def275dc54d2ccd94a06f370c390b4..11684dde0fb1b2a34f250501c657c17b5d99dc5a 100644 (file)
@@ -207,7 +207,7 @@ def id(x):x; 2000 as $x | def f(x):1 as $x | id([$x, x, x]); def g(x): 100 as $x
 # test backtracking through function calls and returns
 # this test is *evil*
 [[20,10][1,0] as $x | def f: (100,200) as $y | def g: [$x + $y, .]; . + $x | g; f[0] | [f][0][1] | f]
-"woo, testing!"
+999999999
 [[110.0, 130.0], [210.0, 130.0], [110.0, 230.0], [210.0, 230.0], [120.0, 160.0], [220.0, 160.0], [120.0, 260.0], [220.0, 260.0]]
 
 #