1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* 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
This commit is contained in:
ko1 2015-07-24 19:49:16 +00:00
parent 7d517ffc80
commit 8fbf5dd9e5
5 changed files with 47 additions and 34 deletions

View file

@ -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

View file

@ -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;
}
struct iseq_catch_table *table = xmalloc(iseq_catch_table_bytes(tlen));
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];
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);
}
/* 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);
/* 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--;
/* 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;
}

4
iseq.c
View file

@ -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));

4
vm.c
View file

@ -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;

View file

@ -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;