summaryrefslogtreecommitdiffstats
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
commit02695684d617d8973b495b1317670cdd84fd9e76 (patch)
tree809011760b8e3ffa50a32d6a6fe69f3275bc69be /insns.def
parent228994868ff2f9584ea499f06cffa53cb3c2723a (diff)
downloadruby-02695684d617d8973b495b1317670cdd84fd9e76.tar.gz
ruby-02695684d617d8973b495b1317670cdd84fd9e76.tar.xz
ruby-02695684d617d8973b495b1317670cdd84fd9e76.zip
* 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: http://svn.ruby-lang.org/repos/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 98febf89b..7de873d4b 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()。
*/