+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
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)
{
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;
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;