summaryrefslogtreecommitdiffhomepage
path: root/src/vm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm.c')
-rw-r--r--src/vm.c29
1 files changed, 16 insertions, 13 deletions
diff --git a/src/vm.c b/src/vm.c
index 5b9a7bf65..320282742 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -1888,34 +1888,33 @@ RETRY_TRY_BLOCK:
NEXT;
}
-#define OP_CMP_BODY(op,v1,v2) do {\
- if (regs[a].v1 op regs[a+1].v2) {\
- SET_TRUE_VALUE(regs[a]);\
- }\
- else {\
- SET_FALSE_VALUE(regs[a]);\
- }\
-} while(0)
+#define OP_CMP_BODY(op,v1,v2) (regs[a].v1 op regs[a+1].v2)
#define OP_CMP(op) do {\
- int a = GETARG_A(i);\
+ int result;\
/* need to check if - is overridden */\
switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {\
case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM):\
- OP_CMP_BODY(op,attr_i,attr_i);\
+ result = OP_CMP_BODY(op,attr_i,attr_i);\
break;\
case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):\
- OP_CMP_BODY(op,attr_i,attr_f);\
+ result = OP_CMP_BODY(op,attr_i,attr_f);\
break;\
case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):\
- OP_CMP_BODY(op,attr_f,attr_i);\
+ result = OP_CMP_BODY(op,attr_f,attr_i);\
break;\
case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):\
- OP_CMP_BODY(op,attr_f,attr_f);\
+ result = OP_CMP_BODY(op,attr_f,attr_f);\
break;\
default:\
goto L_SEND;\
}\
+ if (result) {\
+ SET_TRUE_VALUE(regs[a]);\
+ }\
+ else {\
+ SET_FALSE_VALUE(regs[a]);\
+ }\
} while(0)
CASE(OP_EQ) {
@@ -1932,24 +1931,28 @@ RETRY_TRY_BLOCK:
CASE(OP_LT) {
/* A B C R(A) := R(A)<R(A+1) (Syms[B]=:<,C=1)*/
+ int a = GETARG_A(i);
OP_CMP(<);
NEXT;
}
CASE(OP_LE) {
/* A B C R(A) := R(A)<=R(A+1) (Syms[B]=:<=,C=1)*/
+ int a = GETARG_A(i);
OP_CMP(<=);
NEXT;
}
CASE(OP_GT) {
/* A B C R(A) := R(A)<R(A+1) (Syms[B]=:<,C=1)*/
+ int a = GETARG_A(i);
OP_CMP(>);
NEXT;
}
CASE(OP_GE) {
/* A B C R(A) := R(A)<=R(A+1) (Syms[B]=:<=,C=1)*/
+ int a = GETARG_A(i);
OP_CMP(>=);
NEXT;
}