From b796c503fa58797f094c688b038dc426a67ad568 Mon Sep 17 00:00:00 2001 From: mirichi Date: Tue, 15 Apr 2014 19:30:42 +0900 Subject: [PATCH] =?UTF-8?q?OP=5FEQ=E7=B3=BB=E3=81=8C=E9=80=9F=E3=81=8F?= =?UTF-8?q?=E3=81=AA=E3=81=A3=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/vm.c | 49 ++++++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 23 deletions(-) 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; }