From: Aleksey Demakov Date: Tue, 28 Nov 2006 20:26:42 +0000 (+0000) Subject: fix bug freeing stack register that is not on the stack top X-Git-Tag: before.move.to.git~173 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=82f7a1ec22c71ff755ce8cf4d08b02b688d13f81;p=francis%2Flibjit.git fix bug freeing stack register that is not on the stack top --- diff --git a/ChangeLog b/ChangeLog index 2007c81..c6b1335 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2006-11-29 Aleksey Demakov + + * jit/jit-reg-alloc.c (save_value): fix bug freeing stack register + that is not on the stack top. + 2006-11-27 Kirill Kononenko * jit/jit-rules-x86.c (throw_builtin): diff --git a/jit/jit-reg-alloc.c b/jit/jit-reg-alloc.c index 829c0f2..355d1e0 100644 --- a/jit/jit-reg-alloc.c +++ b/jit/jit-reg-alloc.c @@ -1875,7 +1875,7 @@ save_value(jit_gencode_t gen, jit_value_t value, int reg, int other_reg, int fre { if(free) { - free_value(gen, value, reg, other_reg, (free == 2)); + free_value(gen, value, reg, other_reg, 0); } return; } @@ -1895,10 +1895,18 @@ save_value(jit_gencode_t gen, jit_value_t value, int reg, int other_reg, int fre exch_stack_top(gen, reg, 0); } - if(free && gen->contents[top].num_values == 1) + if(free) { - _jit_gen_spill_top(gen, top, value, 1); - --(gen->reg_stack_top); + if(gen->contents[top].num_values == 1) + { + _jit_gen_spill_top(gen, top, value, 1); + --(gen->reg_stack_top); + } + else + { + _jit_gen_spill_top(gen, top, value, 0); + } + unbind_value(gen, value, top, 0); } else { @@ -1909,12 +1917,12 @@ save_value(jit_gencode_t gen, jit_value_t value, int reg, int other_reg, int fre #endif { _jit_gen_spill_reg(gen, reg, other_reg, value); + if(free) + { + unbind_value(gen, value, reg, other_reg); + } } - if(free) - { - unbind_value(gen, value, reg, other_reg); - } value->in_frame = 1; }