diff --git a/ChangeLog b/ChangeLog index 3688352..e4704d5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2007-11-17 Aleksey Demakov + + * jit/jit-insn.c (jit_insn_mark_offset): do not start new block + on the bytecode mark. If a mark goes just after another mark then + replace the old mark rather than add the new. + + * jit/jit-cache.c (_jit_cache_get_bytecode) + (_jit_cache_get_native): fix offset for the last bytecode mark. + 2007-11-13 Aleksey Demakov * tools/Makefile.am (noinst_HEADERS): add gen-apply-macosx.h diff --git a/jit/jit-cache.c b/jit/jit-cache.c index 5060b0a..6e37a25 100644 --- a/jit/jit-cache.c +++ b/jit/jit-cache.c @@ -1323,7 +1323,8 @@ unsigned long _jit_cache_get_native(jit_cache_t cache, void *start, } prevNativeOfs = nativeOfs; } - return JIT_CACHE_NO_OFFSET; + + return exact ? JIT_CACHE_NO_OFFSET : prevNativeOfs; } unsigned long _jit_cache_get_bytecode(jit_cache_t cache, void *start, @@ -1350,7 +1351,8 @@ unsigned long _jit_cache_get_bytecode(jit_cache_t cache, void *start, } prevOfs = ofs; } - return JIT_CACHE_NO_OFFSET; + + return exact ? JIT_CACHE_NO_OFFSET : prevOfs; } unsigned long _jit_cache_get_size(jit_cache_t cache) diff --git a/jit/jit-insn.c b/jit/jit-insn.c index d0fa3d0..d51dcc4 100644 --- a/jit/jit-insn.c +++ b/jit/jit-insn.c @@ -8013,15 +8013,35 @@ int jit_insn_move_blocks_to_start @*/ int jit_insn_mark_offset(jit_function_t func, jit_int offset) { -#if 1 - if(!jit_insn_new_block(func)) + jit_block_t block; + jit_insn_t last; + jit_value_t value; + + /* Ensure that we have a builder for this function */ + if(!_jit_function_ensure_builder(func)) { return 0; } -#endif - return create_unary_note(func, JIT_OP_MARK_OFFSET, - jit_value_create_nint_constant - (func, jit_type_int, offset)); + + value = jit_value_create_nint_constant(func, jit_type_int, offset); + if (!value) + { + return 0; + } + + /* If the previous instruction is mark offset too + then just replace the offset value in place -- + we are not interested in bytecodes that produce + no real code. */ + block = func->builder->current_block; + last = _jit_block_get_last(block); + if (last && last->opcode == JIT_OP_MARK_OFFSET) + { + last->value1 = value; + return 1; + } + + return create_unary_note(func, JIT_OP_MARK_OFFSET, value); } /* Documentation is in jit-debugger.c */