From: _ wanabe Date: 2010-09-05T09:11:48+09:00 Subject: [ruby-dev:42179] [Ruby 1.9-Bug#3696] Fwd: [ruby-list:47272] case when 整数と実数の比較 (ruby 1.9) チケット #3696 が更新されました。 (by _ wanabe) ruby -v ruby 1.9.3dev (2010-09-01 trunk 29077) [i386-mingw32]にセット ワナベと申します。 パッチありがとうございます。拝見しました。 大筋ではバッチリだと思うのですが、long long を使っているところや 速度的に不利な rb_obj_is_kind_of() を使っているところなど ごく細かい部分が気になったので少し変えてみました。 VM の変更ではありますが、影響は限定的と思われるので コミットしてしまおうと思いますがよろしいでしょうか。 diff --git a/compile.c b/compile.c index 2fd804c..189ee43 100644 --- a/compile.c +++ b/compile.c @@ -2303,6 +2303,10 @@ case_when_optimizable_literal(NODE * node) switch (nd_type(node)) { case NODE_LIT: { VALUE v = node->nd_lit; + if (TYPE(v) == T_FLOAT && + RFLOAT_VALUE(v) == (LONG_LONG)RFLOAT_VALUE(v)) { + return LL2NUM(RFLOAT_VALUE(v)); + } if (SYMBOL_P(v) || rb_obj_is_kind_of(v, rb_cNumeric)) { return v; } diff --git a/insns.def b/insns.def index fcd97ae..d6f8153 100644 --- a/insns.def +++ b/insns.def @@ -1260,16 +1260,26 @@ opt_case_dispatch (..., VALUE key) () // inc += -1; { - if (BASIC_OP_UNREDEFINED_P(BOP_EQQ)) { - VALUE val; - if (st_lookup(RHASH_TBL(hash), key, &val)) { - JUMP(FIX2INT(val)); - } - else { - JUMP(else_offset); + switch(TYPE(key)) { + case T_FLOAT: + if (RFLOAT_VALUE(key) == (LONG_LONG)RFLOAT_VALUE(key)) { + key = LL2NUM(RFLOAT_VALUE(key)); + } + case T_SYMBOL: /* fall through */ + case T_FIXNUM: + case T_BIGNUM: + case T_STRING: + if (BASIC_OP_UNREDEFINED_P(BOP_EQQ)) { + VALUE val; + if (st_lookup(RHASH_TBL(hash), key, &val)) { + JUMP(FIX2INT(val)); + } + else { + JUMP(else_offset); + } + break; } - } - else { + default: { /* fall through (else) */ struct opt_case_dispatch_i_arg arg; arg.obj = key; @@ -1282,6 +1292,7 @@ opt_case_dispatch else { JUMP(else_offset); } + } } } ---------------------------------------- http://redmine.ruby-lang.org/issues/show/3696 ---------------------------------------- http://redmine.ruby-lang.org