diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-07-24 19:49:16 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-07-24 19:49:16 +0000 |
commit | 8fbf5dd9e5bd38c2ade0384f8a7503f7cc1db8a4 (patch) | |
tree | e060a0371be52f708b4be054758654f80b5488ce | |
parent | 7d517ffc80a6cf6e5097ce9ea6ae5ac19ab7e77f (diff) | |
download | ruby-8fbf5dd9e5bd38c2ade0384f8a7503f7cc1db8a4.tar.gz |
* vm_core.h: constify rb_iseq_constant_body::catch_table.
* compile.c (iseq_set_exception_table): catch up this fix.
* iseq.c: ditto.
* vm.c (vm_exec): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51365 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | compile.c | 69 | ||||
-rw-r--r-- | iseq.c | 4 | ||||
-rw-r--r-- | vm.c | 4 | ||||
-rw-r--r-- | vm_core.h | 2 |
5 files changed, 51 insertions, 38 deletions
@@ -1,3 +1,13 @@ +Sat Jul 25 04:47:01 2015 Koichi Sasada <ko1@atdot.net> + + * vm_core.h: constify rb_iseq_constant_body::catch_table. + + * compile.c (iseq_set_exception_table): catch up this fix. + + * iseq.c: ditto. + + * vm.c (vm_exec): ditto. + Fri Jul 24 21:29:54 2015 Nobuyoshi Nakada <nobu@ruby-lang.org> * st.c (EQUAL, st_delete_safe): fix arguments order to compare @@ -1714,44 +1714,47 @@ iseq_set_exception_table(rb_iseq_t *iseq) tlen = (int)RARRAY_LEN(iseq->compile_data->catch_table_ary); tptr = RARRAY_CONST_PTR(iseq->compile_data->catch_table_ary); - iseq->body->catch_table = 0; if (tlen > 0) { - iseq->body->catch_table = xmalloc(iseq_catch_table_bytes(tlen)); - iseq->body->catch_table->size = tlen; - } - - if (iseq->body->catch_table) for (i = 0; i < iseq->body->catch_table->size; i++) { - ptr = RARRAY_CONST_PTR(tptr[i]); - entry = &iseq->body->catch_table->entries[i]; - entry->type = (enum catch_type)(ptr[0] & 0xffff); - entry->start = label_get_position((LABEL *)(ptr[1] & ~1)); - entry->end = label_get_position((LABEL *)(ptr[2] & ~1)); - entry->iseq = (rb_iseq_t *)ptr[3]; - - /* register iseq as mark object */ - if (entry->iseq != 0) { - iseq_add_mark_object(iseq, (VALUE)entry->iseq); - } - - /* stack depth */ - if (ptr[4]) { - LABEL *lobj = (LABEL *)(ptr[4] & ~1); - entry->cont = label_get_position(lobj); - entry->sp = label_get_sp(lobj); - - /* TODO: Dirty Hack! Fix me */ - if (entry->type == CATCH_TYPE_RESCUE || - entry->type == CATCH_TYPE_BREAK || - entry->type == CATCH_TYPE_NEXT) { - entry->sp--; + struct iseq_catch_table *table = xmalloc(iseq_catch_table_bytes(tlen)); + table->size = tlen; + + for (i = 0; i < table->size; i++) { + ptr = RARRAY_CONST_PTR(tptr[i]); + entry = &table->entries[i]; + entry->type = (enum catch_type)(ptr[0] & 0xffff); + entry->start = label_get_position((LABEL *)(ptr[1] & ~1)); + entry->end = label_get_position((LABEL *)(ptr[2] & ~1)); + entry->iseq = (rb_iseq_t *)ptr[3]; + + /* register iseq as mark object */ + if (entry->iseq != 0) { + iseq_add_mark_object(iseq, (VALUE)entry->iseq); + } + + /* stack depth */ + if (ptr[4]) { + LABEL *lobj = (LABEL *)(ptr[4] & ~1); + entry->cont = label_get_position(lobj); + entry->sp = label_get_sp(lobj); + + /* TODO: Dirty Hack! Fix me */ + if (entry->type == CATCH_TYPE_RESCUE || + entry->type == CATCH_TYPE_BREAK || + entry->type == CATCH_TYPE_NEXT) { + entry->sp--; + } + } + else { + entry->cont = 0; } } - else { - entry->cont = 0; - } + iseq->body->catch_table = table; + RB_OBJ_WRITE(iseq, &iseq->compile_data->catch_table_ary, 0); /* free */ + } + else { + iseq->body->catch_table = NULL; } - RB_OBJ_WRITE(iseq, &iseq->compile_data->catch_table_ary, 0); /* free */ return COMPILE_OK; } @@ -1387,7 +1387,7 @@ rb_iseq_disasm(const rb_iseq_t *iseq) rb_str_cat2(str, "== catch table\n"); } if (iseq->body->catch_table) for (i = 0; i < iseq->body->catch_table->size; i++) { - struct iseq_catch_table_entry *entry = &iseq->body->catch_table->entries[i]; + const struct iseq_catch_table_entry *entry = &iseq->body->catch_table->entries[i]; rb_str_catf(str, "| catch type: %-6s st: %04d ed: %04d sp: %04d cont: %04d\n", catch_type((int)entry->type), (int)entry->start, @@ -1894,7 +1894,7 @@ iseq_data_to_ary(const rb_iseq_t *iseq) /* exception */ if (iseq->body->catch_table) for (i=0; i<iseq->body->catch_table->size; i++) { VALUE ary = rb_ary_new(); - struct iseq_catch_table_entry *entry = &iseq->body->catch_table->entries[i]; + const struct iseq_catch_table_entry *entry = &iseq->body->catch_table->entries[i]; rb_ary_push(ary, exception_type2symbol(entry->type)); if (entry->iseq) { rb_ary_push(ary, iseq_data_to_ary(entry->iseq)); @@ -1478,8 +1478,8 @@ vm_exec(rb_thread_t *th) } else { int i; - struct iseq_catch_table_entry *entry; - struct iseq_catch_table *ct; + const struct iseq_catch_table_entry *entry; + const struct iseq_catch_table *ct; unsigned long epc, cont_pc, cont_sp; const rb_iseq_t *catch_iseq; rb_control_frame_t *cfp; @@ -335,7 +335,7 @@ struct rb_iseq_constant_body { const ID *local_table; /* must free */ /* catch table */ - struct iseq_catch_table *catch_table; + const struct iseq_catch_table *catch_table; /* for child iseq */ const struct rb_iseq_struct *parent_iseq; |