Bug #13412 » cfp_before_setjmp.patch
eval_intern.h | ||
---|---|---|
rb_threadptr_tag_state(rb_thread_t *th)
|
||
{
|
||
int state = th->state;
|
||
th->cfp_before_setjmp = NULL;
|
||
th->state = 0;
|
||
return state;
|
||
}
|
thread.c | ||
---|---|---|
ruby_thread_stack_overflow(rb_thread_t *th)
|
||
{
|
||
th->raised_flag = 0;
|
||
if (th->cfp_before_setjmp) {
|
||
th->cfp = th->cfp_before_setjmp;
|
||
th->cfp_before_setjmp = NULL;
|
||
}
|
||
#ifdef USE_SIGALTSTACK
|
||
if (!rb_threadptr_during_gc(th)) {
|
||
rb_exc_raise(sysstack_error);
|
vm.c | ||
---|---|---|
th->stack = thread_recycle_stack(th->stack_size);
|
||
th->cfp = (void *)(th->stack + th->stack_size);
|
||
th->cfp_before_setjmp = NULL;
|
||
vm_push_frame(th, 0 /* 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 */,
|
vm_core.h | ||
---|---|---|
#endif
|
||
unsigned long running_time_us;
|
||
VALUE name;
|
||
rb_control_frame_t *cfp_before_setjmp;
|
||
} rb_thread_t;
|
||
typedef enum {
|
vm_insnhelper.c | ||
---|---|---|
/* check stack overflow */
|
||
CHECK_VM_STACK_OVERFLOW0(cfp, sp, local_size + stack_max);
|
||
th->cfp_before_setjmp = th->cfp;
|
||
th->cfp = cfp;
|
||
/* setup new frame */
|
||
... | ... | |
if (VMDEBUG == 2) SDR();
|
||
th->cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp);
|
||
th->cfp_before_setjmp = NULL;
|
||
return flags & VM_FRAME_FLAG_FINISH;
|
||
}
|