diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2019-04-11 10:36:36 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2019-04-11 10:36:36 +0000 |
commit | 47c82df27ff73c5181f7bd4505b4c98a96f15a0c (patch) | |
tree | 5f7b5ede27e5def92ac7772cef35995d4ffd9cea | |
parent | cf781b0871cb8d6b7135fa74d9549ca1cdb2a846 (diff) |
Share the exception local ID table
[Fix GH-2115]
From: Lourens Naudé <lourens@bearmetal.eu>
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67511 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | compile.c | 10 | ||||
-rw-r--r-- | iseq.c | 3 | ||||
-rw-r--r-- | iseq.h | 2 |
3 files changed, 7 insertions, 8 deletions
@@ -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; } @@ -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) { @@ -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) { |