diff --git a/ChangeLog b/ChangeLog index bf89b26762..f804cd01d6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +Fri Jun 28 02:20:13 2013 Aman Gupta + + * 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. + Thu Jun 27 20:10:56 2013 CHIKANAGA Tomoyuki * ext/openssl/lib/openssl/ssl.rb (verify_certificate_identity): fix diff --git a/compile.c b/compile.c index 50b3d4c29a..b86a1e38f3 100644 --- a/compile.c +++ b/compile.c @@ -416,7 +416,7 @@ static int iseq_add_mark_object(rb_iseq_t *iseq, VALUE v) { if (!SPECIAL_CONST_P(v)) { - rb_ary_push(iseq->mark_ary, v); + rb_iseq_add_mark_object(iseq, v); } return COMPILE_OK; } diff --git a/insns.def b/insns.def index 479d0daefe..ea138cc69d 100644 --- a/insns.def +++ b/insns.def @@ -1237,7 +1237,7 @@ setinlinecache (VALUE val) { 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_vmstat = GET_VM_STATE_VERSION() - ruby_vm_const_missing_count; diff --git a/iseq.c b/iseq.c index 15c1fe13ae..567f9ea429 100644 --- a/iseq.c +++ b/iseq.c @@ -237,6 +237,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, @@ -259,9 +270,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; /* @@ -2047,8 +2056,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); diff --git a/iseq.h b/iseq.h index 0790529638..4de08169d8 100644 --- a/iseq.h +++ b/iseq.h @@ -23,6 +23,7 @@ VALUE rb_iseq_build_from_ary(rb_iseq_t *iseq, VALUE locals, VALUE args, VALUE exception, VALUE body); /* 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_parameters(const rb_iseq_t *iseq, int is_proc); struct st_table *ruby_insn_make_insn_table(void); diff --git a/version.h b/version.h index 7d78f65d38..75cf5a4f56 100644 --- a/version.h +++ b/version.h @@ -1,10 +1,10 @@ #define RUBY_VERSION "2.0.0" -#define RUBY_RELEASE_DATE "2013-06-27" -#define RUBY_PATCHLEVEL 247 +#define RUBY_RELEASE_DATE "2013-06-28" +#define RUBY_PATCHLEVEL 248 #define RUBY_RELEASE_YEAR 2013 #define RUBY_RELEASE_MONTH 6 -#define RUBY_RELEASE_DAY 27 +#define RUBY_RELEASE_DAY 28 #include "ruby/version.h"