summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Dolan <mu@netsoc.tcd.ie>2013-05-13 15:42:57 +0100
committerStephen Dolan <mu@netsoc.tcd.ie>2013-05-13 15:42:57 +0100
commite13f24ab45c2bc6fead9d698bdeaa84746761692 (patch)
treef84eb2aad64c833c0d9edfbd2873afb069c7465a
parent34a63246abe5116cc293490e8d1fcaba9a00e5d9 (diff)
Better error handling for INSERT opcode
jq 'null | {(.a): 1}' no longer crashes.
-rw-r--r--execute.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/execute.c b/execute.c
index 9062f116..48262df8 100644
--- a/execute.c
+++ b/execute.c
@@ -250,10 +250,19 @@ jv jq_next(jq_state *jq) {
jv v = stack_pop(jq);
jv k = stack_pop(jq);
jv objv = stack_pop(jq);
- assert(jv_get_kind(k) == JV_KIND_STRING);
assert(jv_get_kind(objv) == JV_KIND_OBJECT);
- stack_push(jq, jv_object_set(objv, k, v));
- stack_push(jq, stktop);
+ if (jv_get_kind(k) == JV_KIND_STRING) {
+ stack_push(jq, jv_object_set(objv, k, v));
+ stack_push(jq, stktop);
+ } else {
+ print_error(jv_invalid_with_msg(jv_string_fmt("Cannot use %s as object key",
+ jv_kind_name(jv_get_kind(k)))));
+ jv_free(stktop);
+ jv_free(v);
+ jv_free(k);
+ jv_free(objv);
+ goto do_backtrack;
+ }
break;
}