From: Aleksey Demakov Date: Wed, 10 Dec 2008 20:44:24 +0000 (+0000) Subject: extend small int values returned from native calls X-Git-Tag: before.move.to.git~46 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=863e98fbe4fbfcb8ed870aab2157e0385cebbf63;p=francis%2Flibjit.git extend small int values returned from native calls --- diff --git a/ChangeLog b/ChangeLog index 3698984..ca51844 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-12-11 Juan Jesus Garcia de Soria + + * jit/jit-insn.c (jit_insn_call_native): extend small int return + values to full ints as native calls sometimes return garbage in MSB + of the return rigister. + 2008-12-11 Aleksey Demakov * configure.ac: bump version to 0.1.3 diff --git a/jit/jit-insn.c b/jit/jit-insn.c index 4bdc434..40c7df0 100644 --- a/jit/jit-insn.c +++ b/jit/jit-insn.c @@ -5898,6 +5898,7 @@ jit_value_t jit_insn_call_native jit_value_t *new_args; jit_value_t return_value; jit_insn_t insn; + jit_type_t return_type; /* Bail out if there is something wrong with the parameters */ if(!_jit_function_ensure_builder(func) || !native_func || !signature) @@ -6014,6 +6015,32 @@ jit_value_t jit_insn_call_native } } + /* Make sure that returned byte / short values get zero / sign extended */ + return_type = jit_type_normalize(return_value->type); + switch(return_type->kind) + { + case JIT_TYPE_SBYTE: + /* Force sbyte sign extension to int */ + return_value = apply_unary_conversion(func, JIT_OP_TRUNC_SBYTE, + return_value, return_type); + break; + case JIT_TYPE_UBYTE: + /* Force ubyte zero extension to uint */ + return_value = apply_unary_conversion(func, JIT_OP_TRUNC_UBYTE, + return_value, return_type); + break; + case JIT_TYPE_SHORT: + /* Force short sign extension to int */ + return_value = apply_unary_conversion(func, JIT_OP_TRUNC_SHORT, + return_value, return_type); + break; + case JIT_TYPE_USHORT: + /* Force ushort zero extension to uint */ + return_value = apply_unary_conversion(func, JIT_OP_TRUNC_USHORT, + return_value, return_type); + break; + } + /* Restore exception frame information after the call */ if(!restore_eh_frame_after_call(func, flags)) {