Bug #17949 ยป ruby-clang-setjmp-var_from_memory.patch
| eval_intern.h | ||
|---|---|---|
|
_tag.lock_rec = rb_ec_vm_lock_rec(_ec); \
|
||
|
#define EC_POP_TAG() \
|
||
|
_ec->tag = _tag.prev; \
|
||
|
_ec->tag = VAR_FROM_MEMORY(_tag).prev; \
|
||
|
} while (0)
|
||
|
#define EC_TMPPOP_TAG() \
|
||
|
_ec->tag = _tag.prev
|
||
|
_ec->tag = VAR_FROM_MEMORY(_tag).prev
|
||
|
#define EC_REPUSH_TAG() (void)(_ec->tag = &_tag)
|
||
|
-- a/eval.c
|
||
|
++ b/eval.c
|
||
| ... | ... | |
|
SAVE_ROOT_JMPBUF(GET_THREAD(), iseq = ruby_process_options(argc, argv));
|
||
|
}
|
||
|
else {
|
||
|
VAR_FROM_MEMORY(ec);
|
||
|
rb_ec_clear_current_thread_trace_func(ec);
|
||
|
state = error_handle(ec, state);
|
||
|
iseq = (void *)INT2FIX(state);
|
||
| ... | ... | |
|
rb_fiber_scheduler_set(Qnil);
|
||
|
}
|
||
|
else {
|
||
|
VAR_FROM_MEMORY(ec);
|
||
|
state = error_handle(ec, state);
|
||
|
}
|
||
|
EC_POP_TAG();
|
||
| ... | ... | |
|
SAVE_ROOT_JMPBUF(th, rb_ractor_terminate_all());
|
||
|
}
|
||
|
else {
|
||
|
VAR_FROM_MEMORY(ec);
|
||
|
switch (step) {
|
||
|
case 0: goto step_0;
|
||
|
case 1: goto step_1;
|
||
| ... | ... | |
|
}
|
||
|
if (!NIL_P(mesg)) {
|
||
|
VAR_FROM_MEMORY(ec);
|
||
|
ec->errinfo = mesg;
|
||
|
}
|
||
| ... | ... | |
|
}
|
||
|
warn_print_str(e);
|
||
|
}
|
||
|
else {
|
||
|
VAR_FROM_MEMORY(ec);
|
||
|
}
|
||
|
EC_POP_TAG();
|
||
|
if (state == TAG_FATAL && ec->errinfo == exception_error) {
|
||
|
ec->errinfo = mesg;
|
||
| ... | ... | |
|
goto fatal;
|
||
|
}
|
||
|
VAR_FROM_MEMORY(tag);
|
||
|
if (tag != TAG_FATAL) {
|
||
|
RUBY_DTRACE_HOOK(RAISE, rb_obj_classname(ec->errinfo));
|
||
|
EXEC_EVENT_HOOK(ec, RUBY_EVENT_RAISE, ec->cfp->self, 0, 0, 0, mesg);
|
||
| ... | ... | |
|
/* escape from r_proc */
|
||
|
if (state == TAG_RETRY) {
|
||
|
state = TAG_NONE;
|
||
|
VAR_FROM_MEMORY(b_proc);
|
||
|
VAR_FROM_MEMORY(data1);
|
||
|
ec->errinfo = Qnil;
|
||
|
result = Qfalse;
|
||
|
goto retry_entry;
|
||
| ... | ... | |
|
result = Qnil;
|
||
|
/* reuses args when raised again after retrying in r_proc */
|
||
|
VAR_FROM_MEMORY(args);
|
||
|
va_copy(ap, args);
|
||
|
while ((eclass = va_arg(ap, VALUE)) != 0) {
|
||
|
if (rb_obj_is_kind_of(ec->errinfo, eclass)) {
|
||
| ... | ... | |
|
if (handle) {
|
||
|
state = TAG_NONE;
|
||
|
VAR_FROM_MEMORY(r_proc);
|
||
|
VAR_FROM_MEMORY(data2);
|
||
|
if (r_proc) {
|
||
|
result = (*r_proc) (data2, ec->errinfo);
|
||
|
}
|
||
| ... | ... | |
|
SAVE_ROOT_JMPBUF(rb_ec_thread_ptr(ec), result = (*proc) (data));
|
||
|
}
|
||
|
else {
|
||
|
VAR_FROM_MEMORY(pstate);
|
||
|
VAR_FROM_MEMORY(protect_tag);
|
||
|
VAR_FROM_MEMORY(org_jmpbuf);
|
||
|
rb_vm_rewind_cfp(ec, cfp);
|
||
|
}
|
||
|
MEMCPY(&rb_ec_thread_ptr(ec)->root_jmpbuf, &org_jmpbuf, rb_jmpbuf_t, 1);
|
||
| ... | ... | |
|
if ((state = EC_EXEC_TAG()) == TAG_NONE) {
|
||
|
result = (*b_proc) (data1);
|
||
|
}
|
||
|
else {
|
||
|
VAR_FROM_MEMORY(ensure_list);
|
||
|
}
|
||
|
EC_POP_TAG();
|
||
|
errinfo = ec->errinfo;
|
||
|
if (!NIL_P(errinfo) && !RB_TYPE_P(errinfo, T_OBJECT)) {
|
||
|
-- a/eval_jump.c
|
||
|
++ b/eval_jump.c
|
||
| ... | ... | |
|
exec_end_procs_chain(&end_procs, &ec->errinfo);
|
||
|
}
|
||
|
else {
|
||
|
VAR_FROM_MEMORY(ec);
|
||
|
EC_TMPPOP_TAG();
|
||
|
error_handle(ec, state);
|
||
|
if (!NIL_P(ec->errinfo)) errinfo = ec->errinfo;
|
||
|
-- a/gc.c
|
||
|
++ b/gc.c
|
||
| ... | ... | |
|
EC_PUSH_TAG(ec);
|
||
|
state = EC_EXEC_TAG();
|
||
|
if (state != TAG_NONE) {
|
||
|
VAR_FROM_MEMORY(table);
|
||
|
++saved.finished; /* skip failed finalizer */
|
||
|
}
|
||
|
for (i = saved.finished;
|
||
|
-- a/load.c
|
||
|
++ b/load.c
|
||
| ... | ... | |
|
if (state == TAG_NONE) {
|
||
|
load_iseq_eval(ec, fname);
|
||
|
}
|
||
|
else {
|
||
|
VAR_FROM_MEMORY(th);
|
||
|
}
|
||
|
EC_POP_TAG();
|
||
|
#if !defined __GNUC__
|
||
| ... | ... | |
|
if ((state = EC_EXEC_TAG()) == TAG_NONE) {
|
||
|
rb_load(fname, wrap);
|
||
|
}
|
||
|
else {
|
||
|
VAR_FROM_MEMORY(pstate);
|
||
|
}
|
||
|
EC_POP_TAG();
|
||
|
if (state != TAG_NONE) *pstate = state;
|
||
| ... | ... | |
|
}
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
VAR_FROM_MEMORY(ec);
|
||
|
VAR_FROM_MEMORY(fname);
|
||
|
VAR_FROM_MEMORY(exception);
|
||
|
VAR_FROM_MEMORY(path);
|
||
|
}
|
||
|
EC_POP_TAG();
|
||
|
rb_thread_t *th2 = rb_ec_thread_ptr(ec);
|
||
|
-- a/thread.c
|
||
|
++ b/thread.c
|
||
| ... | ... | |
|
SAVE_ROOT_JMPBUF(th, thread_do_start(th));
|
||
|
}
|
||
|
else {
|
||
|
VAR_FROM_MEMORY(th);
|
||
|
VAR_FROM_MEMORY(ractor_main_th);
|
||
|
errinfo = th->ec->errinfo;
|
||
|
if (state == TAG_FATAL) {
|
||
| ... | ... | |
|
saved_errno = errno;
|
||
|
}, ubf_select, wfd->th, FALSE);
|
||
|
}
|
||
|
else {
|
||
|
VAR_FROM_MEMORY(wfd);
|
||
|
}
|
||
|
EC_POP_TAG();
|
||
|
/*
|
||
| ... | ... | |
|
RUBY_VM_CHECK_INTS_BLOCKING(wfd.th->ec);
|
||
|
} while (wait_retryable(&result, lerrno, to, end));
|
||
|
}
|
||
|
else {
|
||
|
VAR_FROM_MEMORY(wfd);
|
||
|
}
|
||
|
EC_POP_TAG();
|
||
|
RB_VM_LOCK_ENTER();
|
||
| ... | ... | |
|
if ((state = EC_EXEC_TAG()) == TAG_NONE) {
|
||
|
ret = (*func)(obj, arg, FALSE);
|
||
|
}
|
||
|
else {
|
||
|
VAR_FROM_MEMORY(sym);
|
||
|
VAR_FROM_MEMORY(p);
|
||
|
}
|
||
|
EC_POP_TAG();
|
||
|
if (!recursive_pop(p.list, p.obj, p.pairid)) {
|
||
|
goto invalid;
|
||
|
-- a/vm.c
|
||
|
++ b/vm.c
|
||
| ... | ... | |
|
goto vm_loop_start; /* fallback to the VM */
|
||
|
}
|
||
|
else {
|
||
|
VAR_FROM_MEMORY(ec);
|
||
|
result = ec->errinfo;
|
||
|
rb_ec_raised_reset(ec, RAISED_STACKOVERFLOW);
|
||
|
while ((result = vm_exec_handle_exception(ec, state, result, &initial)) == Qundef) {
|
||
|
-- a/vm_backtrace.c
|
||
|
++ b/vm_backtrace.c
|
||
| ... | ... | |
|
if ((state = EC_EXEC_TAG()) == TAG_NONE) {
|
||
|
result = (*func)(&dbg_context, data);
|
||
|
}
|
||
|
else {
|
||
|
VAR_FROM_MEMORY(ec);
|
||
|
}
|
||
|
EC_POP_TAG();
|
||
|
/* invalidate bindings? */
|
||
|
-- a/vm_eval.c
|
||
|
++ b/vm_eval.c
|
||
| ... | ... | |
|
retval = (*it_proc) (data1);
|
||
|
}
|
||
|
else if (state == TAG_BREAK || state == TAG_RETRY) {
|
||
|
VAR_FROM_MEMORY(it_proc);
|
||
|
VAR_FROM_MEMORY(data1);
|
||
|
VAR_FROM_MEMORY(ifunc);
|
||
|
VAR_FROM_MEMORY(ec);
|
||
|
VAR_FROM_MEMORY(cfp);
|
||
|
const struct vm_throw_data *const err = (struct vm_throw_data *)ec->errinfo;
|
||
|
const rb_control_frame_t *const escape_cfp = THROW_DATA_CATCH_FRAME(err);
|
||
| ... | ... | |
|
SDR(); fprintf(stderr, "%p, %p\n", (void *)cfp, (void *)escape_cfp);
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
VAR_FROM_MEMORY(ec);
|
||
|
}
|
||
|
EC_POP_TAG();
|
||
|
if (state) {
|
||
| ... | ... | |
|
state = 0;
|
||
|
}
|
||
|
EC_POP_TAG();
|
||
|
VAR_FROM_MEMORY(stateptr);
|
||
|
if (stateptr)
|
||
|
*stateptr = state;
|
||
|
-- a/vm_trace.c
|
||
|
++ b/vm_trace.c
|
||
| ... | ... | |
|
if ((state = EC_EXEC_TAG()) == TAG_NONE) {
|
||
|
exec_hooks_body(ec, list, trace_arg);
|
||
|
}
|
||
|
else {
|
||
|
VAR_FROM_MEMORY(ec);
|
||
|
VAR_FROM_MEMORY(list);
|
||
|
}
|
||
|
EC_POP_TAG();
|
||
|
exec_hooks_postcheck(ec, list);
|
||
| ... | ... | |
|
result = (*func)(arg);
|
||
|
}
|
||
|
else {
|
||
|
VAR_FROM_MEMORY(ec);
|
||
|
VAR_FROM_MEMORY(dummy_trace_arg);
|
||
|
(void)*&vm; /* suppress "clobbered" warning */
|
||
|
}
|
||
|
EC_POP_TAG();
|
||
| ... | ... | |
|
(pjob.func)(pjob.data);
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
VAR_FROM_MEMORY(vm);
|
||
|
VAR_FROM_MEMORY(ec);
|
||
|
VAR_FROM_MEMORY(block_mask);
|
||
|
VAR_FROM_MEMORY(tmp);
|
||
|
}
|
||
|
EC_POP_TAG();
|
||
|
}
|
||
|
/* restore POSTPONED_JOB mask */
|
||