diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-09-26 09:34:46 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-09-26 09:34:46 +0000 |
commit | 1bebb22ce16c6129a805adad83e0f1e29f3874a0 (patch) | |
tree | 5b6f7577de49c048fab45e5c293b01824f494e03 /insns.def | |
parent | 24793ac32db538306899aed7ba588b7231f93a95 (diff) | |
download | ruby-1bebb22ce16c6129a805adad83e0f1e29f3874a0.tar.gz |
* insns.def: add new instruction `opt_empty_p' for optimize `empty?'
method. Apply a patch proposed at [ruby-dev:46120]
[ruby-trunk - Feature #6972] by Glass_saga (Masaki Matsushita).
* compile.c (iseq_specialized_instruction), vm.c, vm_insnhelper.h:
ditto.
* id.c, template/id.h.tmpl: ditto.
* test/ruby/test_optimization.rb: test for this changes.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37036 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'insns.def')
-rw-r--r-- | insns.def | 38 |
1 files changed, 38 insertions, 0 deletions
@@ -1994,6 +1994,44 @@ opt_size /** @c optimize + @e optimized empty? + @j 最適化された recv.empty?()。 + */ +DEFINE_INSN +opt_empty_p +(IC ic) +(VALUE recv) +(VALUE val) +{ + if (!SPECIAL_CONST_P(recv)) { + if (HEAP_CLASS_OF(recv) == rb_cString && + BASIC_OP_UNREDEFINED_P(BOP_EMPTY_P, STRING_REDEFINED_OP_FLAG)) { + if (RSTRING_LEN(recv) == 0) val = Qtrue; + else val = Qfalse; + } + else if (HEAP_CLASS_OF(recv) == rb_cArray && + BASIC_OP_UNREDEFINED_P(BOP_EMPTY_P, ARRAY_REDEFINED_OP_FLAG)) { + if (RARRAY_LEN(recv) == 0) val = Qtrue; + else val = Qfalse; + } + else if (HEAP_CLASS_OF(recv) == rb_cHash && + BASIC_OP_UNREDEFINED_P(BOP_EMPTY_P, HASH_REDEFINED_OP_FLAG)) { + if (RHASH_EMPTY_P(recv)) val = Qtrue; + else val = Qfalse; + } + else { + goto INSN_LABEL(normal_dispatch); + } + } + else { + INSN_LABEL(normal_dispatch): + PUSH(recv); + CALL_SIMPLE_METHOD(0, idEmptyP, recv); + } +} + +/** + @c optimize @e optimized succ @j 最適化された recv.succ()。 */ |