diff --git a/src/core/vm.c b/src/core/vm.c index 22d817c7..0c832122 100644 --- a/src/core/vm.c +++ b/src/core/vm.c @@ -202,6 +202,20 @@ JANET_THREAD_LOCAL jmp_buf *janet_vm_jmp_buf = NULL; vm_checkgc_pcnext();\ }\ } +#define vm_compop_imm(op) \ + {\ + Janet op1 = stack[B];\ + if (janet_checktype(op1, JANET_NUMBER)) {\ + double x1 = janet_unwrap_number(op1);\ + double x2 = (double) CS; \ + stack[A] = janet_wrap_boolean(x1 op x2);\ + vm_pcnext();\ + } else {\ + vm_commit();\ + stack[A] = janet_wrap_boolean(janet_compare(op1, janet_wrap_integer(CS)) op 0);\ + vm_checkgc_pcnext();\ + }\ + } /* Trace a function call */ static void vm_do_trace(JanetFunction *func, int32_t argc, const Janet *argv) { @@ -780,8 +794,7 @@ static JanetSignal run_vm(JanetFiber *fiber, Janet in) { vm_compop( <=); VM_OP(JOP_LESS_THAN_IMMEDIATE) - stack[A] = janet_wrap_boolean(janet_unwrap_number(stack[B]) < (double) CS); - vm_pcnext(); + vm_compop_imm( <); VM_OP(JOP_GREATER_THAN) vm_compop( >); @@ -790,8 +803,7 @@ static JanetSignal run_vm(JanetFiber *fiber, Janet in) { vm_compop( >=); VM_OP(JOP_GREATER_THAN_IMMEDIATE) - stack[A] = janet_wrap_boolean(janet_unwrap_number(stack[B]) > (double) CS); - vm_pcnext(); + vm_compop_imm( >); VM_OP(JOP_EQUALS) stack[A] = janet_wrap_boolean(janet_equals(stack[B], stack[C])); diff --git a/test/suite0010.janet b/test/suite0010.janet index 92290721..e541f35e 100644 --- a/test/suite0010.janet +++ b/test/suite0010.janet @@ -137,4 +137,10 @@ (assert (deep= (string/split "qq" "1qqqqz") @["1" "" "z"]) "string/split 1") (assert (deep= (string/split "aa" "aaa") @["" "a"]) "string/split 2") +# Comparisons +(assert (> 1e23 100) "less than immediate 1") +(assert (> 1e23 1000) "less than immediate 2") +(assert (< 100 1e23) "greater than immediate 1") +(assert (< 1000 1e23) "greater than immediate 2") + (end-suite)