mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
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
This commit is contained in:
parent
ce6db8f286
commit
cbd8b09920
5 changed files with 31 additions and 7 deletions
15
ChangeLog
15
ChangeLog
|
@ -1,3 +1,18 @@
|
||||||
|
Wed Apr 17 04:09:19 2013 Aman Gupta <ruby@tmm1.net>
|
||||||
|
|
||||||
|
* 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.
|
||||||
|
|
||||||
Wed Apr 17 20:00:18 2013 Tanaka Akira <akr@fsij.org>
|
Wed Apr 17 20:00:18 2013 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
* ext/socket/rubysocket.h (SOCKLEN_MAX): Defined.
|
* ext/socket/rubysocket.h (SOCKLEN_MAX): Defined.
|
||||||
|
|
|
@ -416,7 +416,7 @@ static int
|
||||||
iseq_add_mark_object(rb_iseq_t *iseq, VALUE v)
|
iseq_add_mark_object(rb_iseq_t *iseq, VALUE v)
|
||||||
{
|
{
|
||||||
if (!SPECIAL_CONST_P(v)) {
|
if (!SPECIAL_CONST_P(v)) {
|
||||||
rb_ary_push(iseq->mark_ary, v);
|
rb_iseq_add_mark_object(iseq, v);
|
||||||
}
|
}
|
||||||
return COMPILE_OK;
|
return COMPILE_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1237,7 +1237,7 @@ setinlinecache
|
||||||
(VALUE val)
|
(VALUE val)
|
||||||
{
|
{
|
||||||
if (ic->ic_value.value == Qundef) {
|
if (ic->ic_value.value == Qundef) {
|
||||||
rb_ary_push(GET_ISEQ()->mark_ary, val);
|
rb_iseq_add_mark_object(GET_ISEQ(), val);
|
||||||
}
|
}
|
||||||
ic->ic_value.value = val;
|
ic->ic_value.value = val;
|
||||||
ic->ic_vmstat = GET_VM_STATE_VERSION() - ruby_vm_const_missing_count;
|
ic->ic_vmstat = GET_VM_STATE_VERSION() - ruby_vm_const_missing_count;
|
||||||
|
|
18
iseq.c
18
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
|
static VALUE
|
||||||
prepare_iseq_build(rb_iseq_t *iseq,
|
prepare_iseq_build(rb_iseq_t *iseq,
|
||||||
VALUE name, VALUE path, VALUE absolute_path, VALUE first_lineno,
|
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->defined_method_id = 0;
|
||||||
iseq->mark_ary = rb_ary_tmp_new(3);
|
iseq->mark_ary = 0;
|
||||||
OBJ_UNTRUST(iseq->mark_ary);
|
|
||||||
RBASIC(iseq->mark_ary)->klass = 0;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2064,8 +2073,7 @@ rb_iseq_build_for_ruby2cext(
|
||||||
iseq->location.label = rb_str_new2(name);
|
iseq->location.label = rb_str_new2(name);
|
||||||
iseq->location.path = rb_str_new2(path);
|
iseq->location.path = rb_str_new2(path);
|
||||||
iseq->location.first_lineno = first_lineno;
|
iseq->location.first_lineno = first_lineno;
|
||||||
iseq->mark_ary = rb_ary_tmp_new(3);
|
iseq->mark_ary = 0;
|
||||||
OBJ_UNTRUST(iseq->mark_ary);
|
|
||||||
iseq->self = iseqval;
|
iseq->self = iseqval;
|
||||||
|
|
||||||
iseq->iseq = ALLOC_N(VALUE, iseq->iseq_size);
|
iseq->iseq = ALLOC_N(VALUE, iseq->iseq_size);
|
||||||
|
|
1
iseq.h
1
iseq.h
|
@ -21,6 +21,7 @@ VALUE rb_iseq_build_from_ary(rb_iseq_t *iseq, VALUE locals, VALUE args,
|
||||||
VALUE exception, VALUE body);
|
VALUE exception, VALUE body);
|
||||||
|
|
||||||
/* iseq.c */
|
/* iseq.c */
|
||||||
|
void rb_iseq_add_mark_object(rb_iseq_t *iseq, VALUE obj);
|
||||||
VALUE rb_iseq_load(VALUE data, VALUE parent, VALUE opt);
|
VALUE rb_iseq_load(VALUE data, VALUE parent, VALUE opt);
|
||||||
VALUE rb_iseq_parameters(const rb_iseq_t *iseq, int is_proc);
|
VALUE rb_iseq_parameters(const rb_iseq_t *iseq, int is_proc);
|
||||||
struct st_table *ruby_insn_make_insn_table(void);
|
struct st_table *ruby_insn_make_insn_table(void);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue