From b2ac404a2e0927296e7b5a571f443a83960be80e Mon Sep 17 00:00:00 2001 From: Klaus Treichel Date: Sun, 12 Mar 2006 20:04:39 +0000 Subject: [PATCH] 2006-03-12 Klaus Treichel * jit/jit-insn.c: Pop the setjump context on return from functions with a catcher. 2006-03-11 Kirill Kononenko * 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 | 11 +++++++++++ jit/jit-insn.c | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 52099e7..9a290d5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2006-03-12 Klaus Treichel + + * jit/jit-insn.c: Pop the setjump context on return from functions with + a catcher. + +2006-03-11 Kirill Kononenko + + * 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 * jit/jit-insn.c (jit_insn_convert): fix int->uint and uint->int diff --git a/jit/jit-insn.c b/jit/jit-insn.c index ffa4b06..19071b2 100644 --- a/jit/jit-insn.c +++ b/jit/jit-insn.c @@ -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;