]> git.unchartedbackwaters.co.uk Git - francis/libjit.git/commitdiff
fix bug freeing stack register that is not on the stack top
authorAleksey Demakov <ademakov@gmail.com>
Tue, 28 Nov 2006 20:26:42 +0000 (20:26 +0000)
committerAleksey Demakov <ademakov@gmail.com>
Tue, 28 Nov 2006 20:26:42 +0000 (20:26 +0000)
ChangeLog
jit/jit-reg-alloc.c

index 2007c81ce2a065ae8562977b9d3874f67efee3be..c6b13351bc25d3f7fb5773f03a13e8d662037e95 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-11-29  Aleksey Demakov  <ademakov@gmail.com>
+
+       * jit/jit-reg-alloc.c (save_value): fix bug freeing stack register
+       that is not on the stack top.
+
 2006-11-27  Kirill Kononenko  <Kirill.Kononenko@gmail.com>
 
        * jit/jit-rules-x86.c (throw_builtin):
index 829c0f23607a1ca94173b843ccb30d3700b4a44f..355d1e084710d8345512a883e714e7252bd57300 100644 (file)
@@ -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;
 }