diff options
author | Samuel Williams <samuel.williams@oriontransfer.co.nz> | 2019-06-20 13:41:18 +1200 |
---|---|---|
committer | Samuel Williams <samuel.williams@oriontransfer.co.nz> | 2019-06-20 13:41:18 +1200 |
commit | dbc2b89bc042d73e60aeb7d56686aa28d82e2622 (patch) | |
tree | 24df8e3faf9d37b9020c23ce21c2c769beb13920 /vm.c | |
parent | 6bf1285b2069ff736e283a1f8328852e3175fccc (diff) |
Ensure `vm_stack` is cleared after fork.
Diffstat (limited to 'vm.c')
-rw-r--r-- | vm.c | 36 |
1 files changed, 26 insertions, 10 deletions
@@ -2514,7 +2514,7 @@ rb_execution_context_mark(const rb_execution_context_t *ec) #endif /* mark VM stack */ - if (ec->vm_stack && ec->cfp) { + if (ec->vm_stack) { VALUE *p = ec->vm_stack; VALUE *sp = ec->cfp->sp; rb_control_frame_t *cfp = ec->cfp; @@ -2685,20 +2685,36 @@ thread_alloc(VALUE klass) return obj; } +inline void +rb_ec_set_vm_stack(rb_execution_context_t *ec, VALUE *stack, size_t size) +{ + ec->vm_stack = stack; + ec->vm_stack_size = size; +} + void rb_ec_initialize_vm_stack(rb_execution_context_t *ec, VALUE *stack, size_t size) { - rb_ec_set_vm_stack(ec, stack, size); + rb_ec_set_vm_stack(ec, stack, size); + + ec->cfp = (void *)(ec->vm_stack + ec->vm_stack_size); - ec->cfp = (void *)(ec->vm_stack + ec->vm_stack_size); + rb_vm_push_frame(ec, + NULL /* dummy iseq */, + VM_FRAME_MAGIC_DUMMY | VM_ENV_FLAG_LOCAL | VM_FRAME_FLAG_FINISH | VM_FRAME_FLAG_CFRAME /* dummy frame */, + Qnil /* dummy self */, VM_BLOCK_HANDLER_NONE /* dummy block ptr */, + 0 /* dummy cref/me */, + 0 /* dummy pc */, ec->vm_stack, 0, 0 + ); +} + +void +rb_ec_clear_vm_stack(rb_execution_context_t *ec) +{ + rb_ec_set_vm_stack(ec, NULL, 0); - rb_vm_push_frame(ec, - NULL /* dummy iseq */, - VM_FRAME_MAGIC_DUMMY | VM_ENV_FLAG_LOCAL | VM_FRAME_FLAG_FINISH | VM_FRAME_FLAG_CFRAME /* dummy frame */, - Qnil /* dummy self */, VM_BLOCK_HANDLER_NONE /* dummy block ptr */, - 0 /* dummy cref/me */, - 0 /* dummy pc */, ec->vm_stack, 0, 0 - ); + // Avoid dangling pointers: + ec->cfp = NULL; } static void |