summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--compile.c69
-rw-r--r--iseq.c4
-rw-r--r--vm.c4
-rw-r--r--vm_core.h2
5 files changed, 51 insertions, 38 deletions
diff --git a/ChangeLog b/ChangeLog
index 474e191fa9..cce531ec05 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/compile.c b/compile.c
index ec0867e561..ffc4965572 100644
--- a/compile.c
+++ b/compile.c
@@ -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;
}
diff --git a/iseq.c b/iseq.c
index d5253509d1..2be4f89e66 100644
--- a/iseq.c
+++ b/iseq.c
@@ -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));
diff --git a/vm.c b/vm.c
index e1f5212deb..594f0ea49e 100644
--- a/vm.c
+++ b/vm.c
@@ -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;
diff --git a/vm_core.h b/vm_core.h
index f4b3c3e295..a315f51b3d 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -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;