]> granicus.if.org Git - jq/commitdiff
Fix a tripped assertion when generating reduces
authorWilliam Langford <wlangfor@gmail.com>
Fri, 17 Feb 2017 05:40:26 +0000 (00:40 -0500)
committerNicolas Williams <nico@cryptonector.com>
Sun, 26 Mar 2017 10:36:22 +0000 (05:36 -0500)
A noop body, while useless, should still compile successfully

src/compile.c
tests/jq.test

index 6322943877a1f34d8148a26093ee27a9ee893e3e..7960cfe6a64d1e23ec4c8c08fbee57f2d862d276 100644 (file)
@@ -824,7 +824,12 @@ static block bind_alternation_matchers(block matchers, block body) {
 block gen_reduce(block source, block matcher, block init, block body) {
   block res_var = gen_op_var_fresh(STOREV, "reduce");
   block update_var = gen_op_bound(STOREV, res_var);
-  block jmp = gen_op_target(JUMP, body);
+  block jmp = gen_op_targetlater(JUMP);
+  if (body.last == NULL) {
+    inst_set_target(jmp, jmp);
+  } else {
+    inst_set_target(jmp, body);
+  }
   block loop = BLOCK(gen_op_simple(DUPN),
                      source,
                      bind_alternation_matchers(matcher,
index ac784ef887d77d71639cd45d8a1848a84da4bc4d..2882d9c4681941bb63fa1d287347ffa97b2ec6d6 100644 (file)
@@ -710,6 +710,11 @@ reduce range(5) as $n ([]; select($n%2 == 1) | . + [$n])
 null
 [1,3]
 
+# This, while useless, should still compile.
+reduce . as $n (.; .)
+null
+null
+
 . as $dot|any($dot[];not)
 [1,2,3,4,true,false,1,2,3,4,5]
 true