Don't reference update frames with VM_FRAME_MAGIC_DUMMY
Frames with VM_FRAME_MAGIC_DUMMY pushed by rb_vm_push_frame_fname have allocated iseq, so we should not reference update it.
This commit is contained in:
parent
429b867d1b
commit
707c6420b1
Notes:
git
2024-12-17 16:03:56 +00:00
26
vm.c
26
vm.c
@ -3367,20 +3367,22 @@ rb_execution_context_update(rb_execution_context_t *ec)
|
||||
}
|
||||
|
||||
while (cfp != limit_cfp) {
|
||||
const VALUE *ep = cfp->ep;
|
||||
cfp->self = rb_gc_location(cfp->self);
|
||||
cfp->iseq = (rb_iseq_t *)rb_gc_location((VALUE)cfp->iseq);
|
||||
cfp->block_code = (void *)rb_gc_location((VALUE)cfp->block_code);
|
||||
if (VM_FRAME_TYPE(cfp) != VM_FRAME_MAGIC_DUMMY) {
|
||||
const VALUE *ep = cfp->ep;
|
||||
cfp->self = rb_gc_location(cfp->self);
|
||||
cfp->iseq = (rb_iseq_t *)rb_gc_location((VALUE)cfp->iseq);
|
||||
cfp->block_code = (void *)rb_gc_location((VALUE)cfp->block_code);
|
||||
|
||||
if (!VM_ENV_LOCAL_P(ep)) {
|
||||
const VALUE *prev_ep = VM_ENV_PREV_EP(ep);
|
||||
if (VM_ENV_FLAGS(prev_ep, VM_ENV_FLAG_ESCAPED)) {
|
||||
VM_FORCE_WRITE(&prev_ep[VM_ENV_DATA_INDEX_ENV], rb_gc_location(prev_ep[VM_ENV_DATA_INDEX_ENV]));
|
||||
}
|
||||
if (!VM_ENV_LOCAL_P(ep)) {
|
||||
const VALUE *prev_ep = VM_ENV_PREV_EP(ep);
|
||||
if (VM_ENV_FLAGS(prev_ep, VM_ENV_FLAG_ESCAPED)) {
|
||||
VM_FORCE_WRITE(&prev_ep[VM_ENV_DATA_INDEX_ENV], rb_gc_location(prev_ep[VM_ENV_DATA_INDEX_ENV]));
|
||||
}
|
||||
|
||||
if (VM_ENV_FLAGS(ep, VM_ENV_FLAG_ESCAPED)) {
|
||||
VM_FORCE_WRITE(&ep[VM_ENV_DATA_INDEX_ENV], rb_gc_location(ep[VM_ENV_DATA_INDEX_ENV]));
|
||||
VM_FORCE_WRITE(&ep[VM_ENV_DATA_INDEX_ME_CREF], rb_gc_location(ep[VM_ENV_DATA_INDEX_ME_CREF]));
|
||||
if (VM_ENV_FLAGS(ep, VM_ENV_FLAG_ESCAPED)) {
|
||||
VM_FORCE_WRITE(&ep[VM_ENV_DATA_INDEX_ENV], rb_gc_location(ep[VM_ENV_DATA_INDEX_ENV]));
|
||||
VM_FORCE_WRITE(&ep[VM_ENV_DATA_INDEX_ME_CREF], rb_gc_location(ep[VM_ENV_DATA_INDEX_ME_CREF]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user