summaryrefslogtreecommitdiff
path: root/iseq.c
diff options
context:
space:
mode:
authortmm1 <tmm1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-04-17 11:20:23 +0000
committertmm1 <tmm1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-04-17 11:20:23 +0000
commitcbd8b099200d9cd19df770dbabeb698b08135800 (patch)
treeb17fd242610ade8f1d76f8efb9a91b41cb998ace /iseq.c
parentce6db8f286160fbf71c409416bd43c229b874601 (diff)
iseq: reduce array allocations for simple sequences
* compile.c (iseq_add_mark_object): Use new rb_iseq_add_mark_object(). * insns.def (setinlinecache): Ditto. * iseq.c (rb_iseq_add_mark_object): New function to allocate iseq->mark_ary on demand. [Bug #8142] * iseq.h (rb_iseq_add_mark_object): Ditto. * iseq.c (prepare_iseq_build): Avoid allocating mark_ary until needed. * iseq.c (rb_iseq_build_for_ruby2cext): Ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40336 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'iseq.c')
-rw-r--r--iseq.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/iseq.c b/iseq.c
index 63be78e37c..93a2410d39 100644
--- a/iseq.c
+++ b/iseq.c
@@ -240,6 +240,17 @@ set_relation(rb_iseq_t *iseq, const VALUE parent)
}
}
+void
+rb_iseq_add_mark_object(rb_iseq_t *iseq, VALUE obj)
+{
+ if (!RTEST(iseq->mark_ary)) {
+ iseq->mark_ary = rb_ary_tmp_new(3);
+ OBJ_UNTRUST(iseq->mark_ary);
+ RBASIC(iseq->mark_ary)->klass = 0;
+ }
+ rb_ary_push(iseq->mark_ary, obj);
+}
+
static VALUE
prepare_iseq_build(rb_iseq_t *iseq,
VALUE name, VALUE path, VALUE absolute_path, VALUE first_lineno,
@@ -262,9 +273,7 @@ prepare_iseq_build(rb_iseq_t *iseq,
}
iseq->defined_method_id = 0;
- iseq->mark_ary = rb_ary_tmp_new(3);
- OBJ_UNTRUST(iseq->mark_ary);
- RBASIC(iseq->mark_ary)->klass = 0;
+ iseq->mark_ary = 0;
/*
@@ -2064,8 +2073,7 @@ rb_iseq_build_for_ruby2cext(
iseq->location.label = rb_str_new2(name);
iseq->location.path = rb_str_new2(path);
iseq->location.first_lineno = first_lineno;
- iseq->mark_ary = rb_ary_tmp_new(3);
- OBJ_UNTRUST(iseq->mark_ary);
+ iseq->mark_ary = 0;
iseq->self = iseqval;
iseq->iseq = ALLOC_N(VALUE, iseq->iseq_size);