insns.def: opt_case_dispatch trivial optimization

* insns.def (opt_case_dispatch): extract float value only if the
  Float method is not redefnined.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56511 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2016-10-28 07:05:05 +00:00
parent 9e75488ac8
commit f28caf31d1
2 changed files with 14 additions and 14 deletions

View File

@ -1,3 +1,8 @@
Fri Oct 28 16:05:03 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
* insns.def (opt_case_dispatch): extract float value only if the
Float method is not redefnined.
Fri Oct 28 15:58:16 2016 Nobuyoshi Nakada <nobu@ruby-lang.org> Fri Oct 28 15:58:16 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
* internal.h (RB_OBJ_BUILTIN_TYPE): special-const safe * internal.h (RB_OBJ_BUILTIN_TYPE): special-const safe

View File

@ -1327,18 +1327,10 @@ opt_case_dispatch
(..., VALUE key) (..., VALUE key)
() // inc += -1; () // inc += -1;
{ {
switch(TYPE(key)) { switch (OBJ_BUILTIN_TYPE(key)) {
case T_FLOAT: { case -1:
double ival; case T_FLOAT:
if (modf(RFLOAT_VALUE(key), &ival) == 0.0 && !isinf(ival)) {
key = FIXABLE(ival) ? LONG2FIX((long)ival) : rb_dbl2big(ival);
}
}
case T_TRUE: /* fall through */
case T_FALSE:
case T_NIL:
case T_SYMBOL: case T_SYMBOL:
case T_FIXNUM:
case T_BIGNUM: case T_BIGNUM:
case T_STRING: case T_STRING:
if (BASIC_OP_UNREDEFINED_P(BOP_EQQ, if (BASIC_OP_UNREDEFINED_P(BOP_EQQ,
@ -1350,16 +1342,19 @@ opt_case_dispatch
FALSE_REDEFINED_OP_FLAG | FALSE_REDEFINED_OP_FLAG |
STRING_REDEFINED_OP_FLAG)) { STRING_REDEFINED_OP_FLAG)) {
st_data_t val; st_data_t val;
if (RB_FLOAT_TYPE_P(key)) {
double kval = RFLOAT_VALUE(key);
if (!isinf(kval) && modf(kval, &kval) == 0.0) {
key = FIXABLE(kval) ? LONG2FIX((long)kval) : rb_dbl2big(kval);
}
}
if (st_lookup(RHASH_TBL_RAW(hash), key, &val)) { if (st_lookup(RHASH_TBL_RAW(hash), key, &val)) {
JUMP(FIX2INT((VALUE)val)); JUMP(FIX2INT((VALUE)val));
} }
else { else {
JUMP(else_offset); JUMP(else_offset);
} }
break;
} }
default:
break;
} }
} }