From 0d775f2a3c402310b71a581e368f347c52af78e5 Mon Sep 17 00:00:00 2001 From: ko1 Date: Wed, 22 Jul 2015 10:55:02 +0000 Subject: * vm_core.h: separate rb_iseq_body into rb_iseq_constant_body and rb_iseq_variable_body (rb_iseq_t::variable_body). rb_iseq_variable_body can be modified after compilation. * compile.c: use rb_iseq_t::variable_body. * iseq.c: ditto. * thread.c: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51339 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 13 +++++++++++++ compile.c | 18 +++++++++--------- iseq.c | 18 +++++++++++------- thread.c | 2 +- vm_core.h | 18 ++++++------------ 5 files changed, 40 insertions(+), 29 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0ccecf2a6c..95afc77b06 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +Wed Jul 22 19:52:45 2015 Koichi Sasada + + * vm_core.h: separate rb_iseq_body into rb_iseq_constant_body and + rb_iseq_variable_body (rb_iseq_t::variable_body). + + rb_iseq_variable_body can be modified after compilation. + + * compile.c: use rb_iseq_t::variable_body. + + * iseq.c: ditto. + + * thread.c: ditto. + Wed Jul 22 17:50:35 2015 SHIBATA Hiroshi * lib/matrix/eigenvalue_decomposition.rb: refine code style. diff --git a/compile.c b/compile.c index 1011e54486..f570a6de88 100644 --- a/compile.c +++ b/compile.c @@ -225,9 +225,9 @@ r_value(VALUE value) #define ADD_TRACE(seq, line, event) \ do { \ - if ((event) == RUBY_EVENT_LINE && iseq->body->coverage && \ + if ((event) == RUBY_EVENT_LINE && iseq->variable_body->coverage && \ (line) != iseq->compile_data->last_coverable_line) { \ - RARRAY_ASET(iseq->body->coverage, (line) - 1, INT2FIX(0)); \ + RARRAY_ASET(iseq->variable_body->coverage, (line) - 1, INT2FIX(0)); \ iseq->compile_data->last_coverable_line = (line); \ ADD_INSN1((seq), (line), trace, INT2FIX(RUBY_EVENT_COVERAGE)); \ } \ @@ -608,26 +608,26 @@ rb_vm_insn_addr2insn(const void *addr) /* cold path */ VALUE * rb_iseq_original_iseq(const rb_iseq_t *iseq) /* cold path */ { - if (iseq->body->iseq) return iseq->body->iseq; + if (iseq->variable_body->iseq) return iseq->variable_body->iseq; - iseq->body->iseq = ALLOC_N(VALUE, iseq->body->iseq_size); + iseq->variable_body->iseq = ALLOC_N(VALUE, iseq->body->iseq_size); - MEMCPY(iseq->body->iseq, iseq->body->iseq_encoded, VALUE, iseq->body->iseq_size); + MEMCPY(iseq->variable_body->iseq, iseq->body->iseq_encoded, VALUE, iseq->body->iseq_size); #if OPT_DIRECT_THREADED_CODE || OPT_CALL_THREADED_CODE { unsigned int i; for (i = 0; i < iseq->body->iseq_size; /* */ ) { - const void *addr = (const void *)iseq->body->iseq[i]; + const void *addr = (const void *)iseq->variable_body->iseq[i]; const int insn = rb_vm_insn_addr2insn(addr); - iseq->body->iseq[i] = insn; + iseq->variable_body->iseq[i] = insn; i += insn_len(insn); } } #endif - return iseq->body->iseq; + return iseq->variable_body->iseq; } /*********************************************/ @@ -5299,7 +5299,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) rb_num_t cnt; VALUE key; - cnt = local_iseq->body->flip_cnt++ + VM_SVAR_FLIPFLOP_START; + cnt = local_iseq->variable_body->flip_cnt++ + VM_SVAR_FLIPFLOP_START; key = INT2FIX(cnt); ADD_INSN2(ret, line, getspecial, key, INT2FIX(0)); diff --git a/iseq.c b/iseq.c index e4790e290a..489be5f2eb 100644 --- a/iseq.c +++ b/iseq.c @@ -92,7 +92,7 @@ rb_iseq_free(const rb_iseq_t *iseq) ruby_xfree(iseq->body->param.keyword); } compile_data_free(iseq->compile_data); - ruby_xfree(iseq->body->iseq); + ruby_xfree(iseq->variable_body->iseq); ruby_xfree(iseq->body); } RUBY_FREE_LEAVE("iseq"); @@ -106,14 +106,17 @@ rb_iseq_mark(const rb_iseq_t *iseq) RUBY_GC_INFO("%s @ %s\n", RSTRING_PTR(iseq->body->location.label), RSTRING_PTR(iseq->body->location.path)); if (iseq->body) { - const struct rb_iseq_body *body = iseq->body; + const struct rb_iseq_constant_body *body = iseq->body; RUBY_MARK_UNLESS_NULL(body->mark_ary); RUBY_MARK_UNLESS_NULL(body->location.label); RUBY_MARK_UNLESS_NULL(body->location.base_label); RUBY_MARK_UNLESS_NULL(body->location.path); RUBY_MARK_UNLESS_NULL(body->location.absolute_path); - RUBY_MARK_UNLESS_NULL(body->coverage); + } + + if (iseq->variable_body) { + RUBY_MARK_UNLESS_NULL(iseq->variable_body->coverage); } if (iseq->compile_data != 0) { @@ -173,7 +176,8 @@ static rb_iseq_t * iseq_alloc(void) { rb_iseq_t *iseq = (rb_iseq_t *)rb_imemo_new(imemo_iseq, 0, 0, 0, 0); - iseq->body = ZALLOC(struct rb_iseq_body); + iseq->body = ZALLOC(struct rb_iseq_constant_body); + iseq->variable_body = ZALLOC(struct rb_iseq_variable_body); return iseq; } @@ -264,13 +268,13 @@ prepare_iseq_build(rb_iseq_t *iseq, iseq->compile_data->option = option; iseq->compile_data->last_coverable_line = -1; - RB_OBJ_WRITE(iseq, &iseq->body->coverage, Qfalse); + RB_OBJ_WRITE(iseq, &iseq->variable_body->coverage, Qfalse); if (!GET_THREAD()->parse_in_eval) { VALUE coverages = rb_get_coverages(); if (RTEST(coverages)) { - RB_OBJ_WRITE(iseq, &iseq->body->coverage, rb_hash_lookup(coverages, path)); - if (NIL_P(iseq->body->coverage)) RB_OBJ_WRITE(iseq, &iseq->body->coverage, Qfalse); + RB_OBJ_WRITE(iseq, &iseq->variable_body->coverage, rb_hash_lookup(coverages, path)); + if (NIL_P(iseq->variable_body->coverage)) RB_OBJ_WRITE(iseq, &iseq->variable_body->coverage, Qfalse); } } diff --git a/thread.c b/thread.c index 48115d8ddc..8ca3f01908 100644 --- a/thread.c +++ b/thread.c @@ -5227,7 +5227,7 @@ rb_check_deadlock(rb_vm_t *vm) static void update_coverage(rb_event_flag_t event, VALUE proc, VALUE self, ID id, VALUE klass) { - VALUE coverage = GET_THREAD()->cfp->iseq->body->coverage; + VALUE coverage = GET_THREAD()->cfp->iseq->variable_body->coverage; if (coverage && RBASIC(coverage)->klass == 0) { long line = rb_sourceline() - 1; long count; diff --git a/vm_core.h b/vm_core.h index f4c81fce3a..6e3d9cce58 100644 --- a/vm_core.h +++ b/vm_core.h @@ -241,11 +241,7 @@ typedef struct rb_iseq_location_struct { VALUE first_lineno; /* TODO: may be unsigned short */ } rb_iseq_location_t; -struct rb_iseq_body { - /***************/ - /* static data */ - /***************/ - +struct rb_iseq_constant_body { enum iseq_type { ISEQ_TYPE_TOP, ISEQ_TYPE_METHOD, @@ -267,7 +263,6 @@ struct rb_iseq_body { unsigned int line_info_size; const VALUE mark_ary; /* Array: includes operands which should be GC marked */ - const VALUE coverage; /* coverage array */ /* insn info, must be freed */ struct iseq_line_info_entry *line_info_table; @@ -360,12 +355,11 @@ struct rb_iseq_body { /* for child iseq */ const struct rb_iseq_struct *parent_iseq; struct rb_iseq_struct *local_iseq; /* local_iseq->flip_cnt can be modified */ +}; - /****************/ - /* dynamic data */ - /****************/ +struct rb_iseq_variable_body { + const VALUE coverage; /* coverage array */ - /* misc */ rb_num_t flip_cnt; /* original iseq, before encoding @@ -378,8 +372,8 @@ struct rb_iseq_body { struct rb_iseq_struct { VALUE flags; struct iseq_compile_data *compile_data; /* used at compile time */ - struct rb_iseq_body *body; - VALUE dummy1; + struct rb_iseq_constant_body *body; + struct rb_iseq_variable_body *variable_body; VALUE dummy2; }; -- cgit v1.2.3