Make all of the references of iseq movable
This commit is contained in:
parent
76e3d853ab
commit
056e7a0154
Notes:
git
2023-01-20 13:51:59 +00:00
10
compile.c
10
compile.c
@ -10736,7 +10736,7 @@ iseq_build_kw(rb_iseq_t *iseq, VALUE params, VALUE keywords)
|
||||
}
|
||||
|
||||
void
|
||||
rb_iseq_mark_insn_storage(struct iseq_compile_data_storage *storage)
|
||||
rb_iseq_mark_and_update_insn_storage(struct iseq_compile_data_storage *storage)
|
||||
{
|
||||
INSN *iobj = 0;
|
||||
size_t size = sizeof(INSN);
|
||||
@ -10772,13 +10772,7 @@ rb_iseq_mark_insn_storage(struct iseq_compile_data_storage *storage)
|
||||
case TS_VALUE:
|
||||
case TS_IC: // constant path array
|
||||
case TS_CALLDATA: // ci is stored.
|
||||
{
|
||||
VALUE op = OPERAND_AT(iobj, j);
|
||||
|
||||
if (!SPECIAL_CONST_P(op)) {
|
||||
rb_gc_mark(op);
|
||||
}
|
||||
}
|
||||
rb_gc_mark_and_move(&OPERAND_AT(iobj, j));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
35
iseq.c
35
iseq.c
@ -373,28 +373,23 @@ rb_iseq_mark_and_update(rb_iseq_t *iseq, bool reference_updating)
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: make these not pinned
|
||||
if (!reference_updating) {
|
||||
if (FL_TEST_RAW((VALUE)iseq, ISEQ_NOT_LOADED_YET)) {
|
||||
rb_gc_mark(iseq->aux.loader.obj);
|
||||
}
|
||||
else if (FL_TEST_RAW((VALUE)iseq, ISEQ_USE_COMPILE_DATA)) {
|
||||
const struct iseq_compile_data *const compile_data = ISEQ_COMPILE_DATA(iseq);
|
||||
if (FL_TEST_RAW((VALUE)iseq, ISEQ_NOT_LOADED_YET)) {
|
||||
rb_gc_mark_and_move(&iseq->aux.loader.obj);
|
||||
}
|
||||
else if (FL_TEST_RAW((VALUE)iseq, ISEQ_USE_COMPILE_DATA)) {
|
||||
const struct iseq_compile_data *const compile_data = ISEQ_COMPILE_DATA(iseq);
|
||||
|
||||
rb_iseq_mark_insn_storage(compile_data->insn.storage_head);
|
||||
rb_iseq_mark_and_update_insn_storage(compile_data->insn.storage_head);
|
||||
|
||||
RUBY_MARK_UNLESS_NULL(compile_data->err_info);
|
||||
if (RTEST(compile_data->catch_table_ary)) {
|
||||
rb_gc_mark(compile_data->catch_table_ary);
|
||||
}
|
||||
VM_ASSERT(compile_data != NULL);
|
||||
}
|
||||
else {
|
||||
/* executable */
|
||||
VM_ASSERT(ISEQ_EXECUTABLE_P(iseq));
|
||||
if (iseq->aux.exec.local_hooks) {
|
||||
rb_hook_list_mark(iseq->aux.exec.local_hooks);
|
||||
}
|
||||
rb_gc_mark_and_move((VALUE *)&compile_data->err_info);
|
||||
rb_gc_mark_and_move((VALUE *)&compile_data->catch_table_ary);
|
||||
}
|
||||
else {
|
||||
/* executable */
|
||||
VM_ASSERT(ISEQ_EXECUTABLE_P(iseq));
|
||||
|
||||
if (iseq->aux.exec.local_hooks) {
|
||||
rb_hook_list_mark_and_update(iseq->aux.exec.local_hooks);
|
||||
}
|
||||
}
|
||||
|
||||
|
2
iseq.h
2
iseq.h
@ -186,7 +186,7 @@ VALUE *rb_iseq_original_iseq(const rb_iseq_t *iseq);
|
||||
void rb_iseq_build_from_ary(rb_iseq_t *iseq, VALUE misc,
|
||||
VALUE locals, VALUE args,
|
||||
VALUE exception, VALUE body);
|
||||
void rb_iseq_mark_insn_storage(struct iseq_compile_data_storage *arena);
|
||||
void rb_iseq_mark_and_update_insn_storage(struct iseq_compile_data_storage *arena);
|
||||
|
||||
VALUE rb_iseq_load(VALUE data, VALUE parent, VALUE opt);
|
||||
VALUE rb_iseq_parameters(const rb_iseq_t *iseq, int is_proc);
|
||||
|
@ -2015,6 +2015,7 @@ struct rb_trace_arg_struct {
|
||||
};
|
||||
|
||||
void rb_hook_list_mark(rb_hook_list_t *hooks);
|
||||
void rb_hook_list_mark_and_update(rb_hook_list_t *hooks);
|
||||
void rb_hook_list_free(rb_hook_list_t *hooks);
|
||||
void rb_hook_list_connect_tracepoint(VALUE target, rb_hook_list_t *list, VALUE tpval, unsigned int target_line);
|
||||
void rb_hook_list_remove_tracepoint(rb_hook_list_t *list, VALUE tpval);
|
||||
|
11
vm_trace.c
11
vm_trace.c
@ -66,6 +66,17 @@ rb_hook_list_mark(rb_hook_list_t *hooks)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
rb_hook_list_mark_and_update(rb_hook_list_t *hooks)
|
||||
{
|
||||
rb_event_hook_t *hook = hooks->hooks;
|
||||
|
||||
while (hook) {
|
||||
rb_gc_mark_and_move(&hook->data);
|
||||
hook = hook->next;
|
||||
}
|
||||
}
|
||||
|
||||
static void clean_hooks(const rb_execution_context_t *ec, rb_hook_list_t *list);
|
||||
|
||||
void
|
||||
|
Loading…
x
Reference in New Issue
Block a user