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
This commit is contained in:
parent
cf781b0871
commit
47c82df27f
10
compile.c
10
compile.c
@ -106,6 +106,8 @@ struct iseq_compile_data_ensure_node_stack {
|
|||||||
struct ensure_range *erange;
|
struct ensure_range *erange;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const ID rb_iseq_shared_exc_local_tbl[] = {idERROR_INFO};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* debug function(macro) interface depend on CPDEBUG
|
* debug function(macro) interface depend on CPDEBUG
|
||||||
* if it is less than 0, runtime option is in effect.
|
* 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
|
static int
|
||||||
iseq_set_exception_local_table(rb_iseq_t *iseq)
|
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;
|
iseq->body->local_table_size = 1;
|
||||||
ids[0] = idERROR_INFO;
|
iseq->body->local_table = rb_iseq_shared_exc_local_tbl;
|
||||||
iseq->body->local_table = ids;
|
|
||||||
return COMPILE_OK;
|
return COMPILE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
3
iseq.c
3
iseq.c
@ -91,7 +91,8 @@ rb_iseq_free(const rb_iseq_t *iseq)
|
|||||||
#if VM_INSN_INFO_TABLE_IMPL == 2
|
#if VM_INSN_INFO_TABLE_IMPL == 2
|
||||||
if (body->insns_info.succ_index_table) ruby_xfree(body->insns_info.succ_index_table);
|
if (body->insns_info.succ_index_table) ruby_xfree(body->insns_info.succ_index_table);
|
||||||
#endif
|
#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);
|
ruby_xfree((void *)body->is_entries);
|
||||||
|
|
||||||
if (body->ci_entries) {
|
if (body->ci_entries) {
|
||||||
|
2
iseq.h
2
iseq.h
@ -21,6 +21,8 @@ typedef struct rb_iseq_struct rb_iseq_t;
|
|||||||
#define rb_iseq_t rb_iseq_t
|
#define rb_iseq_t rb_iseq_t
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern const ID rb_iseq_shared_exc_local_tbl[];
|
||||||
|
|
||||||
static inline size_t
|
static inline size_t
|
||||||
rb_call_info_kw_arg_bytes(int keyword_len)
|
rb_call_info_kw_arg_bytes(int keyword_len)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user