]> git.unchartedbackwaters.co.uk Git - francis/libjit.git/commitdiff
2006-03-12 Klaus Treichel <ktreichel@web.de>
authorKlaus Treichel <ktreichel@web.de>
Sun, 12 Mar 2006 20:04:39 +0000 (20:04 +0000)
committerKlaus Treichel <ktreichel@web.de>
Sun, 12 Mar 2006 20:04:39 +0000 (20:04 +0000)
* jit/jit-insn.c: Pop the setjump context on return from functions with
a catcher.

2006-03-11  Kirill Kononenko  <Kirill.Kononenko@gmail.com>

* jit/jit-insn.c (create_call_setup_insn): fix tail calls, work
if the called function is not the callee function
(thanks klausT for finding the bug).

ChangeLog
jit/jit-insn.c

index 52099e7411c627faed447cfe731f989182b165de..9a290d588b77c2568deaf57e6b13e15b97a1e1d6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2006-03-12  Klaus Treichel  <ktreichel@web.de>
+
+       * jit/jit-insn.c: Pop the setjump context on return from functions with
+       a catcher.
+
+2006-03-11  Kirill Kononenko  <Kirill.Kononenko@gmail.com>
+
+       * jit/jit-insn.c (create_call_setup_insn): fix tail calls, work
+       if the called function is not the callee function
+       (thanks klausT for finding the bug).
+
 2006-02-27  Aleksey Demakov  <ademakov@gmail.com>
 
        * jit/jit-insn.c (jit_insn_convert): fix int->uint and uint->int
index ffa4b062c7f8507c3afca8d0335c3d2b1bf4f447..19071b2bc15fd9f71b1575ac2cee95f03aceabb6 100644 (file)
@@ -5202,8 +5202,8 @@ static int create_call_setup_insns
                args = new_args;
        }
 
-       /* If we are calling ourselves, then store back to our own parameters */
-       if((flags & JIT_CALL_TAIL) != 0 && func == callee)
+       /* If we are performing a tail call, then store back to our own parameters */
+       if((flags & JIT_CALL_TAIL) != 0)
        {
                for(arg_num = 0; arg_num < num_args; ++arg_num)
                {
@@ -6608,6 +6608,21 @@ int jit_insn_return(jit_function_t func, jit_value_t value)
                return 0;
        }
 
+       /* We need to pop the "setjmp" context */
+       if(func->has_try)
+       {
+               type = jit_type_create_signature
+                       (jit_abi_cdecl, jit_type_void, 0, 0, 1);
+               if(!type)
+               {
+                       return 0;
+               }
+               jit_insn_call_native
+                       (func, "_jit_unwind_pop_setjmp",
+                        (void *)_jit_unwind_pop_setjmp, type, 0, 0, JIT_CALL_NOTHROW);
+               jit_type_free(type);
+       }
+
        /* This function has an ordinary return path */
        func->builder->ordinary_return = 1;
 
@@ -6761,6 +6776,21 @@ int jit_insn_return_ptr
                return 0;
        }
 
+       /* We need to pop the "setjmp" context */
+       if(func->has_try)
+       {
+               type = jit_type_create_signature
+                       (jit_abi_cdecl, jit_type_void, 0, 0, 1);
+               if(!type)
+               {
+                       return 0;
+               }
+               jit_insn_call_native
+                       (func, "_jit_unwind_pop_setjmp",
+                        (void *)_jit_unwind_pop_setjmp, type, 0, 0, JIT_CALL_NOTHROW);
+               jit_type_free(type);
+       }
+
        /* This function has an ordinary return path */
        func->builder->ordinary_return = 1;