diff --git a/src/jv_aux.c b/src/jv_aux.c index 3153d6e61b..6a5efa9432 100644 --- a/src/jv_aux.c +++ b/src/jv_aux.c @@ -215,6 +215,7 @@ jv jv_has(jv t, jv k) { } else if (jv_get_kind(t) == JV_KIND_ARRAY && jv_get_kind(k) == JV_KIND_NUMBER) { if (jvp_number_is_nan(k)) { + jv_free(t); ret = jv_false(); } else { jv elem = jv_array_get(t, (int)jv_number_value(k)); diff --git a/src/jv_parse.c b/src/jv_parse.c index e91f65d02b..2caf330b29 100644 --- a/src/jv_parse.c +++ b/src/jv_parse.c @@ -490,7 +490,11 @@ static pfunc check_literal(struct jv_parser* p) { switch (p->tokenbuf[0]) { case 't': pattern = "true"; plen = 4; v = jv_true(); break; case 'f': pattern = "false"; plen = 5; v = jv_false(); break; - case 'n': pattern = "null"; plen = 4; v = jv_null(); break; + case 'n': + // if it starts with 'n', it could be a literal "nan" + if (p->tokenpos != 3) { + pattern = "null"; plen = 4; v = jv_null(); + } } if (pattern) { if (p->tokenpos != plen) return "Invalid literal"; diff --git a/tests/jq.test b/tests/jq.test index 3182c1f362..4a8bfeee0c 100644 --- a/tests/jq.test +++ b/tests/jq.test @@ -1799,6 +1799,18 @@ reduce .[] as $then (4 as $else | $else; . as $elif | . + $then * $elif) # { $__loc__ } works + { a, $__loc__, c } {"a":[1,2,3],"b":"foo","c":{"hi":"hey"}} {"a":[1,2,3],"__loc__":{"file":"<top-level>","line":1},"c":{"hi":"hey"}} + + +# nan is parsed as a valid NaN value from JSON + +fromjson | isnan +"nan" +true + +tojson | fromjson +{"a":nan} +{"a":null}