diff options
Diffstat (limited to 'src/parser.y')
-rw-r--r-- | src/parser.y | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/src/parser.y b/src/parser.y index 67581025..e223adab 100644 --- a/src/parser.y +++ b/src/parser.y @@ -172,7 +172,7 @@ static jv check_object_key(block k) { char errbuf[15]; return jv_string_fmt("Cannot use %s (%s) as object key", jv_kind_name(block_const_kind(k)), - jv_dump_string_trunc(jv_copy(block_const(k)), errbuf, sizeof(errbuf))); + jv_dump_string_trunc(block_const(k), errbuf, sizeof(errbuf))); } return jv_invalid(); } @@ -216,19 +216,25 @@ static block constant_fold(block a, block b, int op) { jv res = jv_invalid(); if (block_const_kind(a) == JV_KIND_NUMBER) { - double na = jv_number_value(block_const(a)); - double nb = jv_number_value(block_const(b)); + jv jv_a = block_const(a); + jv jv_b = block_const(b); + + double na = jv_number_value(jv_a); + double nb = jv_number_value(jv_b); + + int cmp = jv_cmp(jv_a, jv_b); + switch (op) { case '+': res = jv_number(na + nb); break; case '-': res = jv_number(na - nb); break; case '*': res = jv_number(na * nb); break; case '/': res = jv_number(na / nb); break; - case EQ: res = (na == nb ? jv_true() : jv_false()); break; - case NEQ: res = (na != nb ? jv_true() : jv_false()); break; - case '<': res = (na < nb ? jv_true() : jv_false()); break; - case '>': res = (na > nb ? jv_true() : jv_false()); break; - case LESSEQ: res = (na <= nb ? jv_true() : jv_false()); break; - case GREATEREQ: res = (na >= nb ? jv_true() : jv_false()); break; + case EQ: res = (cmp == 0 ? jv_true() : jv_false()); break; + case NEQ: res = (cmp != 0 ? jv_true() : jv_false()); break; + case '<': res = (cmp < 0 ? jv_true() : jv_false()); break; + case '>': res = (cmp > 0 ? jv_true() : jv_false()); break; + case LESSEQ: res = (cmp <= 0 ? jv_true() : jv_false()); break; + case GREATEREQ: res = (cmp >= 0 ? jv_true() : jv_false()); break; default: break; } } else if (op == '+' && block_const_kind(a) == JV_KIND_STRING) { |