summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2021-06-08 13:00:37 +0200
committerJo-Philipp Wich <jo@mein.io>2021-06-08 13:54:50 +0200
commit4e410c3411f73da6d27b28ce057159cda7b50b66 (patch)
tree6fd8ee299fb46c678acce2ce36f7d76fb91a4dbc
parentce6081dbbd588fb111754f3c2c1c93d2421c6ee6 (diff)
treewide: let uc_cmp() use instruction instead of token numbers
This allows us to drop some token->instruction mapping case switches in the VM. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
-rw-r--r--lib.c6
-rw-r--r--value.c15
-rw-r--r--vm.c24
3 files changed, 12 insertions, 33 deletions
diff --git a/lib.c b/lib.c
index 8044fde..23e9ac2 100644
--- a/lib.c
+++ b/lib.c
@@ -339,7 +339,7 @@ uc_index(uc_vm *vm, size_t nargs, bool right)
switch (ucv_type(stack)) {
case UC_ARRAY:
for (arridx = 0, len = ucv_array_length(stack); arridx < len; arridx++) {
- if (uc_cmp(TK_EQ, ucv_array_get(stack, arridx), needle)) {
+ if (uc_cmp(I_EQ, ucv_array_get(stack, arridx), needle)) {
ret = (ssize_t)arridx;
if (!right)
@@ -2600,13 +2600,13 @@ uc_min_max(uc_vm *vm, size_t nargs, int cmp)
static uc_value_t *
uc_min(uc_vm *vm, size_t nargs)
{
- return uc_min_max(vm, nargs, TK_LT);
+ return uc_min_max(vm, nargs, I_LT);
}
static uc_value_t *
uc_max(uc_vm *vm, size_t nargs)
{
- return uc_min_max(vm, nargs, TK_GT);
+ return uc_min_max(vm, nargs, I_GT);
}
diff --git a/value.c b/value.c
index c012b78..125564b 100644
--- a/value.c
+++ b/value.c
@@ -23,7 +23,6 @@
#include "util.h"
#include "chunk.h"
#include "value.h"
-#include "lexer.h" /* TK_* */
#include "vm.h"
#define TAG_TYPE uint64_t
@@ -288,7 +287,7 @@ uc_cmp(int how, uc_value_t *v1, uc_value_t *v2)
/* all comparison results except `!=` involving NaN are false */
if (isnan(d1) || isnan(d2))
- return (how == TK_NE);
+ return (how == I_NE);
if (d1 == d2)
delta = 0;
@@ -304,22 +303,22 @@ uc_cmp(int how, uc_value_t *v1, uc_value_t *v2)
}
switch (how) {
- case TK_LT:
+ case I_LT:
return (delta < 0);
- case TK_LE:
+ case I_LE:
return (delta <= 0);
- case TK_GT:
+ case I_GT:
return (delta > 0);
- case TK_GE:
+ case I_GE:
return (delta >= 0);
- case TK_EQ:
+ case I_EQ:
return (delta == 0);
- case TK_NE:
+ case I_NE:
return (delta != 0);
default:
diff --git a/vm.c b/vm.c
index 1dfeba4..44fef6a 100644
--- a/vm.c
+++ b/vm.c
@@ -1634,28 +1634,8 @@ uc_vm_insn_rel(uc_vm *vm, enum insn_type insn)
{
uc_value_t *r2 = uc_vm_stack_pop(vm);
uc_value_t *r1 = uc_vm_stack_pop(vm);
- bool res = false;
- switch (insn) {
- case I_LT:
- res = uc_cmp(TK_LT, r1, r2);
- break;
-
- case I_GT:
- res = uc_cmp(TK_GT, r1, r2);
- break;
-
- case I_EQ:
- res = uc_cmp(TK_EQ, r1, r2);
- break;
-
- case I_NE:
- res = uc_cmp(TK_NE, r1, r2);
- break;
-
- default:
- break;
- }
+ bool res = uc_cmp(insn, r1, r2);
ucv_put(r1);
ucv_put(r2);
@@ -1679,7 +1659,7 @@ uc_vm_insn_in(uc_vm *vm, enum insn_type insn)
arridx < arrlen; arridx++) {
item = ucv_array_get(r2, arridx);
- if (uc_cmp(TK_EQ, r1, item)) {
+ if (uc_cmp(I_EQ, r1, item)) {
found = true;
break;
}