summaryrefslogtreecommitdiff
path: root/insns.def
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-09-06 08:39:57 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-09-06 08:39:57 +0000
commitf825d848986177d779e8018a1083f88b8799ae5f (patch)
tree809011760b8e3ffa50a32d6a6fe69f3275bc69be /insns.def
parentbd8da69e9b5df785cc3fa0871332257e09335a78 (diff)
* 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.def37
1 files changed, 35 insertions, 2 deletions
diff --git a/insns.def b/insns.def
index 98febf89b8..7de873d4bf 100644
--- a/insns.def
+++ b/insns.def
@@ -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()。
*/