aboutsummaryrefslogtreecommitdiffstats
path: root/insns.def
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-10-28 07:05:05 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-10-28 07:05:05 +0000
commit4f11dc21e887ee84c6a46206cc1704922c1d8d75 (patch)
tree5dc38e0c6cf539aad130bfe0d44f0fd630007ad9 /insns.def
parent6d4727c30c53699dfd7ce983c317de7001a5a8fc (diff)
downloadruby-4f11dc21e887ee84c6a46206cc1704922c1d8d75.tar.gz
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
Diffstat (limited to 'insns.def')
-rw-r--r--insns.def23
1 files changed, 9 insertions, 14 deletions
diff --git a/insns.def b/insns.def
index ac53f967c1..ecd60f02f3 100644
--- a/insns.def
+++ b/insns.def
@@ -1327,18 +1327,10 @@ opt_case_dispatch
(..., VALUE key)
() // inc += -1;
{
- switch(TYPE(key)) {
- case T_FLOAT: {
- double ival;
- 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:
+ switch (OBJ_BUILTIN_TYPE(key)) {
+ case -1:
+ case T_FLOAT:
case T_SYMBOL:
- case T_FIXNUM:
case T_BIGNUM:
case T_STRING:
if (BASIC_OP_UNREDEFINED_P(BOP_EQQ,
@@ -1350,16 +1342,19 @@ opt_case_dispatch
FALSE_REDEFINED_OP_FLAG |
STRING_REDEFINED_OP_FLAG)) {
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)) {
JUMP(FIX2INT((VALUE)val));
}
else {
JUMP(else_offset);
}
- break;
}
- default:
- break;
}
}