From 0025ff968d71ab7a8acab369441ee4b17b753966 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 30 Jun 2011 08:21:36 -0600 Subject: [PATCH] fix JIT bug that caused incorrect compilation of a non-tail call as a self non-tail call (but why hasn't this deep and old bug caused more trouble over the years?) --- src/racket/src/jit.c | 11 ++++++++--- src/racket/src/jitstate.c | 3 +++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/racket/src/jit.c b/src/racket/src/jit.c index 2c2d82e00a..12a394e2b3 100644 --- a/src/racket/src/jit.c +++ b/src/racket/src/jit.c @@ -1513,7 +1513,7 @@ static int generate_branch(Scheme_Object *obj, mz_jit_state *jitter, int is_tail GC_CAN_IGNORE jit_insn *ref2; int pushed_marks; int nsrs, nsrs1, g1, g2, amt, need_sync, flostack, flostack_pos; - int else_is_empty = 0, i, can_chain_branch, chain_true, chain_false; + int else_is_empty = 0, i, can_chain_branch, chain_true, chain_false, old_self_pos; #ifdef NEED_LONG_JUMPS int then_short_ok, else_short_ok; #else @@ -1533,6 +1533,8 @@ static int generate_branch(Scheme_Object *obj, mz_jit_state *jitter, int is_tail else_short_ok = (is_short(branch->fbranch, 32) > 0); #endif + old_self_pos = jitter->self_pos; + for_this_branch.addrs = addrs; for_this_branch.addrs_size = NUM_QUICK_INFO_ADDRS; for_this_branch.addrs_count = 0; @@ -1648,6 +1650,9 @@ static int generate_branch(Scheme_Object *obj, mz_jit_state *jitter, int is_tail jitter->pushed_marks = pushed_marks; if (need_sync) mz_rs_sync_0(); + if (old_self_pos != jitter->self_pos) + scheme_signal_error("internal error: self position moved across branch"); + /* False branch */ mz_CLEAR_R0_STATUS(); scheme_mz_runstack_saved(jitter); @@ -3190,7 +3195,7 @@ static int do_generate_closure(mz_jit_state *jitter, void *_data) ? NATIVE_IS_SINGLE_RESULT : 0))); if (SAME_OBJ(lr->procs[pos], (Scheme_Object *)data)) { - self_pos = i; + self_pos = i; } } else { #ifdef USE_FLONUM_UNBOXING @@ -3252,7 +3257,7 @@ static int do_generate_closure(mz_jit_state *jitter, void *_data) jitter->closure_to_args_delta = to_args; jitter->example_argc = argc; jitter->example_argv = argv; - + /* Generate code for the body: */ jitter->need_set_rs = 1; r = scheme_generate(data->code, jitter, 1, 1, 1, JIT_R0, NULL); /* no need for sync */ diff --git a/src/racket/src/jitstate.c b/src/racket/src/jitstate.c index 6c61c1a6bb..047492f3e2 100644 --- a/src/racket/src/jitstate.c +++ b/src/racket/src/jitstate.c @@ -476,6 +476,9 @@ int scheme_mz_compute_runstack_restored(mz_jit_state *jitter, int adj, int skip) c >>= 2; if (c > 0) amt += c; + else { + if (adj) jitter->self_pos += c; + } } } else if (c & 0x2) { /* single procedure */