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;
|
struct iseq_catch_table_entry *entry;
|
||||||
|
|
||||||
ISEQ_BODY(iseq)->catch_table = NULL;
|
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);
|
VALUE catch_table_ary = ISEQ_COMPILE_DATA(iseq)->catch_table_ary;
|
||||||
tptr = RARRAY_CONST_PTR(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) {
|
if (tlen > 0) {
|
||||||
struct iseq_catch_table *table = xmalloc(iseq_catch_table_bytes(tlen));
|
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_OBJ_WRITE(iseq, &ISEQ_COMPILE_DATA(iseq)->catch_table_ary, 0); /* free */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RB_GC_GUARD(catch_table_ary);
|
||||||
|
|
||||||
return COMPILE_OK;
|
return COMPILE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user