summaryrefslogtreecommitdiffstats
path: root/src/parser.y
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.y')
-rw-r--r--src/parser.y24
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) {