diff options
Diffstat (limited to 'insns.def')
-rw-r--r-- | insns.def | 37 |
1 files changed, 35 insertions, 2 deletions
@@ -1921,8 +1921,8 @@ opt_length (VALUE recv) (VALUE val) { - if (!SPECIAL_CONST_P(recv) && - BASIC_OP_UNREDEFINED_P(BOP_LENGTH)) { + if (LIKELY(!SPECIAL_CONST_P(recv) && + BASIC_OP_UNREDEFINED_P(BOP_LENGTH))) { if (HEAP_CLASS_OF(recv) == rb_cString) { val = rb_str_length(recv); } @@ -1945,6 +1945,39 @@ opt_length /** @c optimize + @e optimized size + @j 最適化された recv.size()。 + */ +DEFINE_INSN +opt_size +() +(VALUE recv) +(VALUE val) +{ + if (LIKELY(BASIC_OP_UNREDEFINED_P(BOP_SIZE) && + !SPECIAL_CONST_P(recv))) { + if (HEAP_CLASS_OF(recv) == rb_cString) { + val = rb_str_length(recv); + } + else if (HEAP_CLASS_OF(recv) == rb_cArray) { + val = LONG2NUM(RARRAY_LEN(recv)); + } + else if (HEAP_CLASS_OF(recv) == rb_cHash) { + val = INT2FIX(RHASH_SIZE(recv)); + } + else { + goto INSN_LABEL(normal_dispatch); + } + } + else { + INSN_LABEL(normal_dispatch): + PUSH(recv); + CALL_SIMPLE_METHOD(0, idSize, recv); + } +} + +/** + @c optimize @e optimized succ @j 最適化された recv.succ()。 */ |