summaryrefslogtreecommitdiff
path: root/insns.def
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-09-26 09:34:46 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-09-26 09:34:46 +0000
commit1bebb22ce16c6129a805adad83e0f1e29f3874a0 (patch)
tree5b6f7577de49c048fab45e5c293b01824f494e03 /insns.def
parent24793ac32db538306899aed7ba588b7231f93a95 (diff)
* 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.def38
1 files changed, 38 insertions, 0 deletions
diff --git a/insns.def b/insns.def
index a1b8756d17..1dc4328d72 100644
--- a/insns.def
+++ b/insns.def
@@ -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()。
*/