diff options
author | William Langford <wlangfor@gmail.com> | 2017-02-17 00:40:26 -0500 |
---|---|---|
committer | Nicolas Williams <nico@cryptonector.com> | 2017-03-26 05:36:22 -0500 |
commit | c8a2a0acc23e87cb28db794ee95f7d8b87d3ccbb (patch) | |
tree | b0ba05735a9c1e1492bd27a402e731d1f9b72fe8 | |
parent | 3a8c8f4747313d324f4309af66e2211319eccffd (diff) |
Fix a tripped assertion when generating reduces
A noop body, while useless, should still compile successfully
-rw-r--r-- | src/compile.c | 7 | ||||
-rw-r--r-- | tests/jq.test | 5 |
2 files changed, 11 insertions, 1 deletions
diff --git a/src/compile.c b/src/compile.c index 63229438..7960cfe6 100644 --- a/src/compile.c +++ b/src/compile.c @@ -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, diff --git a/tests/jq.test b/tests/jq.test index ac784ef8..2882d9c4 100644 --- a/tests/jq.test +++ b/tests/jq.test @@ -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 |