diff --git a/src/vm.c b/src/vm.c index 5b9a7bf65..320282742 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1888,8 +1888,28 @@ RETRY_TRY_BLOCK: NEXT; } -#define OP_CMP_BODY(op,v1,v2) do {\ - if (regs[a].v1 op regs[a+1].v2) {\ +#define OP_CMP_BODY(op,v1,v2) (regs[a].v1 op regs[a+1].v2) + +#define OP_CMP(op) do {\ + 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):\ + result = OP_CMP_BODY(op,attr_i,attr_i);\ + break;\ + case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):\ + result = OP_CMP_BODY(op,attr_i,attr_f);\ + break;\ + case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):\ + result = OP_CMP_BODY(op,attr_f,attr_i);\ + break;\ + case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):\ + result = OP_CMP_BODY(op,attr_f,attr_f);\ + break;\ + default:\ + goto L_SEND;\ + }\ + if (result) {\ SET_TRUE_VALUE(regs[a]);\ }\ else {\ @@ -1897,27 +1917,6 @@ RETRY_TRY_BLOCK: }\ } while(0) -#define OP_CMP(op) do {\ - int a = GETARG_A(i);\ - /* 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);\ - break;\ - case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):\ - 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);\ - break;\ - case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):\ - OP_CMP_BODY(op,attr_f,attr_f);\ - break;\ - default:\ - goto L_SEND;\ - }\ -} while(0) - CASE(OP_EQ) { /* A B C R(A) := R(A)); 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; }