diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-10-28 07:05:05 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-10-28 07:05:05 +0000 |
commit | 4f11dc21e887ee84c6a46206cc1704922c1d8d75 (patch) | |
tree | 5dc38e0c6cf539aad130bfe0d44f0fd630007ad9 /insns.def | |
parent | 6d4727c30c53699dfd7ce983c317de7001a5a8fc (diff) | |
download | ruby-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.def | 23 |
1 files changed, 9 insertions, 14 deletions
@@ -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; } } |