From 99084f540171df301478ec66fb89e2c38287e504 Mon Sep 17 00:00:00 2001 From: Lourens Naudé Date: Wed, 10 Apr 2019 13:05:15 +0100 Subject: Lazy allocate the compile data catch table array Closes: https://github.com/ruby/ruby/pull/2119 --- compile.c | 7 ++++++- iseq.c | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/compile.c b/compile.c index f4bc4817d0..ca117c2853 100644 --- a/compile.c +++ b/compile.c @@ -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; diff --git a/iseq.c b/iseq.c index 9a7c1f60bc..adf4b07dd9 100644 --- a/iseq.c +++ b/iseq.c @@ -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 = -- cgit v1.2.3