diff options
author | Lourens Naudé <lourens@bearmetal.eu> | 2019-04-10 13:05:15 +0100 |
---|---|---|
committer | Koichi Sasada <ko1@atdot.net> | 2019-04-25 12:37:29 +0900 |
commit | 99084f540171df301478ec66fb89e2c38287e504 (patch) | |
tree | 454234eba0b88bc9b89f829ecb8ddef396341425 | |
parent | 9bfc185a0d93f05f7522a3dea89d69920dcf079c (diff) |
Lazy allocate the compile data catch table array
Closes: https://github.com/ruby/ruby/pull/2119
-rw-r--r-- | compile.c | 7 | ||||
-rw-r--r-- | iseq.c | 2 |
2 files changed, 7 insertions, 2 deletions
@@ -329,6 +329,8 @@ static void iseq_add_setlocal(rb_iseq_t *iseq, LINK_ANCHOR *const seq, int line, LABEL_UNREMOVABLE(ls); \ LABEL_REF(le); \ LABEL_REF(lc); \ + if (NIL_P(ISEQ_COMPILE_DATA(iseq)->catch_table_ary)) \ + RB_OBJ_WRITE(iseq, &ISEQ_COMPILE_DATA(iseq)->catch_table_ary, rb_ary_tmp_new(3)); \ rb_ary_push(ISEQ_COMPILE_DATA(iseq)->catch_table_ary, freeze_hide_obj(_e)); \ } while (0) @@ -1275,6 +1277,7 @@ static void iseq_insert_nop_between_end_and_cont(rb_iseq_t *iseq) { VALUE catch_table_ary = ISEQ_COMPILE_DATA(iseq)->catch_table_ary; + if (NIL_P(catch_table_ary)) return; unsigned int i, tlen = (unsigned int)RARRAY_LEN(catch_table_ary); const VALUE *tptr = RARRAY_CONST_PTR_TRANSIENT(catch_table_ary); for (i = 0; i < tlen; i++) { @@ -2309,6 +2312,7 @@ iseq_set_exception_table(rb_iseq_t *iseq) unsigned int tlen, i; struct iseq_catch_table_entry *entry; + if (NIL_P(ISEQ_COMPILE_DATA(iseq)->catch_table_ary)) goto no_catch_table; tlen = (int)RARRAY_LEN(ISEQ_COMPILE_DATA(iseq)->catch_table_ary); tptr = RARRAY_CONST_PTR_TRANSIENT(ISEQ_COMPILE_DATA(iseq)->catch_table_ary); @@ -2346,7 +2350,8 @@ iseq_set_exception_table(rb_iseq_t *iseq) RB_OBJ_WRITE(iseq, &ISEQ_COMPILE_DATA(iseq)->catch_table_ary, 0); /* free */ } else { - iseq->body->catch_table = NULL; + no_catch_table: + iseq->body->catch_table = NULL; } return COMPILE_OK; @@ -540,7 +540,7 @@ prepare_iseq_build(rb_iseq_t *iseq, ALLOC_N(char, INITIAL_ISEQ_COMPILE_DATA_STORAGE_BUFF_SIZE + offsetof(struct iseq_compile_data_storage, buff)); - RB_OBJ_WRITE(iseq, &ISEQ_COMPILE_DATA(iseq)->catch_table_ary, rb_ary_tmp_new(3)); + RB_OBJ_WRITE(iseq, &ISEQ_COMPILE_DATA(iseq)->catch_table_ary, Qnil); ISEQ_COMPILE_DATA(iseq)->storage_head->pos = 0; ISEQ_COMPILE_DATA(iseq)->storage_head->next = 0; ISEQ_COMPILE_DATA(iseq)->storage_head->size = |