For the pointer we return it needs to look like a valid OOP. The trick that was used to align the code to make that true. Otherwise empty_context_stack will set a DUMMY_NATIVE_IP and we will resume at the ipOffset (e.g. the beginning of a loop) and not after the interrupt check.
This fixes something like this: a := nil. p := [a := 3] newProcess. [p isTerminated] whileFalse: [p singleStep; suspend] 2014-01-09 Holger Hans Peter Freyther <[email protected]> * xlat.c: Align the label correctly. --- libgst/ChangeLog | 4 ++++ libgst/xlat.c | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/libgst/ChangeLog b/libgst/ChangeLog index 05bc54b..528b6ae 100644 --- a/libgst/ChangeLog +++ b/libgst/ChangeLog @@ -1,3 +1,7 @@ +2014-01-09 Holger Hans Peter Freyther <[email protected]> + + * xlat.c: Align the label correctly. + 2013-12-23 Holger Hans Peter Freyther <[email protected]> * xlat.c: Change emitted code in emit_interrupt_check. diff --git a/libgst/xlat.c b/libgst/xlat.c index 9f45b33..260c7f6 100644 --- a/libgst/xlat.c +++ b/libgst/xlat.c @@ -2502,8 +2502,6 @@ emit_interrupt_check (int restartReg, int ipOffset) { jit_insn *jmp, *restart = NULL; - jit_align (2); - jit_ldi_i (JIT_R2, &_gst_except_flag); jmp = jit_beqi_i (jit_forward (), JIT_R2, 0); @@ -2514,6 +2512,8 @@ emit_interrupt_check (int restartReg, int ipOffset) jit_sti_ul (&ip, JIT_R2); } + jit_align (2); + /* Where to restart?*/ if (restartReg == JIT_NOREG) restart = jit_movi_p (JIT_RET, jit_forward()); -- 1.8.5.2 _______________________________________________ help-smalltalk mailing list [email protected] https://lists.gnu.org/mailman/listinfo/help-smalltalk
