GC guard catch_table_ary in iseq_set_exception_table
The function iseq_set_exception_table allocates memory which can cause a GC compaction to run. Since catch_table_ary is not on the stack, it can be moved, which would make tptr incorrect.
This commit is contained in:
parent
14761edbf6
commit
6ebcf25de2
10
compile.c
10
compile.c
@ -2796,9 +2796,11 @@ iseq_set_exception_table(rb_iseq_t *iseq)
|
||||
struct iseq_catch_table_entry *entry;
|
||||
|
||||
ISEQ_BODY(iseq)->catch_table = NULL;
|
||||
if (NIL_P(ISEQ_COMPILE_DATA(iseq)->catch_table_ary)) return COMPILE_OK;
|
||||
tlen = (int)RARRAY_LEN(ISEQ_COMPILE_DATA(iseq)->catch_table_ary);
|
||||
tptr = RARRAY_CONST_PTR(ISEQ_COMPILE_DATA(iseq)->catch_table_ary);
|
||||
|
||||
VALUE catch_table_ary = ISEQ_COMPILE_DATA(iseq)->catch_table_ary;
|
||||
if (NIL_P(catch_table_ary)) return COMPILE_OK;
|
||||
tlen = (int)RARRAY_LEN(catch_table_ary);
|
||||
tptr = RARRAY_CONST_PTR(catch_table_ary);
|
||||
|
||||
if (tlen > 0) {
|
||||
struct iseq_catch_table *table = xmalloc(iseq_catch_table_bytes(tlen));
|
||||
@ -2834,6 +2836,8 @@ iseq_set_exception_table(rb_iseq_t *iseq)
|
||||
RB_OBJ_WRITE(iseq, &ISEQ_COMPILE_DATA(iseq)->catch_table_ary, 0); /* free */
|
||||
}
|
||||
|
||||
RB_GC_GUARD(catch_table_ary);
|
||||
|
||||
return COMPILE_OK;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user