diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-09-06 08:39:57 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-09-06 08:39:57 +0000 |
commit | f825d848986177d779e8018a1083f88b8799ae5f (patch) | |
tree | 809011760b8e3ffa50a32d6a6fe69f3275bc69be /insns.def | |
parent | bd8da69e9b5df785cc3fa0871332257e09335a78 (diff) | |
download | ruby-f825d848986177d779e8018a1083f88b8799ae5f.tar.gz |
* compile.c (iseq_specialized_instruction), insns.def (opt_size):
optimize #size methods (by specialized instruction).
* id.c, id.h, vm.c, vm_insnhelper.h: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@24769 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
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()。 */ |