summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compile.c10
-rw-r--r--iseq.c3
-rw-r--r--iseq.h2
3 files changed, 7 insertions, 8 deletions
diff --git a/compile.c b/compile.c
index 4db18eb309..ba9acfcd00 100644
--- a/compile.c
+++ b/compile.c
@@ -106,6 +106,8 @@ struct iseq_compile_data_ensure_node_stack {
struct ensure_range *erange;
};
+const ID rb_iseq_shared_exc_local_tbl[] = {idERROR_INFO};
+
/**
* debug function(macro) interface depend on CPDEBUG
* if it is less than 0, runtime option is in effect.
@@ -1361,14 +1363,8 @@ iseq_setup(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
static int
iseq_set_exception_local_table(rb_iseq_t *iseq)
{
- /* TODO: every id table is same -> share it.
- * Current problem is iseq_free().
- */
- ID *ids = (ID *)ALLOC_N(ID, 1);
-
iseq->body->local_table_size = 1;
- ids[0] = idERROR_INFO;
- iseq->body->local_table = ids;
+ iseq->body->local_table = rb_iseq_shared_exc_local_tbl;
return COMPILE_OK;
}
diff --git a/iseq.c b/iseq.c
index 99e626f8df..67fc862a33 100644
--- a/iseq.c
+++ b/iseq.c
@@ -91,7 +91,8 @@ rb_iseq_free(const rb_iseq_t *iseq)
#if VM_INSN_INFO_TABLE_IMPL == 2
if (body->insns_info.succ_index_table) ruby_xfree(body->insns_info.succ_index_table);
#endif
- ruby_xfree((void *)body->local_table);
+ if (LIKELY(body->local_table != rb_iseq_shared_exc_local_tbl))
+ ruby_xfree((void *)body->local_table);
ruby_xfree((void *)body->is_entries);
if (body->ci_entries) {
diff --git a/iseq.h b/iseq.h
index feb73a82ae..ac037d0a3b 100644
--- a/iseq.h
+++ b/iseq.h
@@ -21,6 +21,8 @@ typedef struct rb_iseq_struct rb_iseq_t;
#define rb_iseq_t rb_iseq_t
#endif
+extern const ID rb_iseq_shared_exc_local_tbl[];
+
static inline size_t
rb_call_info_kw_arg_bytes(int keyword_len)
{