diff options
author | Mike Pall <mike> | 2010-02-19 03:13:48 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2010-02-19 03:13:48 +0100 |
commit | c52da1f2da4963762e7743419d58e372e1c9ac06 (patch) | |
tree | 17c5d88b4c36c9b369ef9ad1dcd913431e019136 /src/buildvm_x86.dasc | |
parent | bbe7d818d9d9d47c48f255104166a58e7f65d3ec (diff) | |
download | luajit-c52da1f2da4963762e7743419d58e372e1c9ac06.tar.gz luajit-c52da1f2da4963762e7743419d58e372e1c9ac06.tar.bz2 luajit-c52da1f2da4963762e7743419d58e372e1c9ac06.zip |
Rethrow errors from trace exit handling from the right C frame.
Diffstat (limited to 'src/buildvm_x86.dasc')
-rw-r--r-- | src/buildvm_x86.dasc | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/buildvm_x86.dasc b/src/buildvm_x86.dasc index 5ec87aa8..0d97d01c 100644 --- a/src/buildvm_x86.dasc +++ b/src/buildvm_x86.dasc | |||
@@ -2591,11 +2591,14 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | |||
2591 | | lea FCARG2, [esp+16] | 2591 | | lea FCARG2, [esp+16] |
2592 | | lea FCARG1, [DISPATCH+GG_DISP2J] | 2592 | | lea FCARG1, [DISPATCH+GG_DISP2J] |
2593 | | call extern lj_trace_exit@8 // (jit_State *J, ExitState *ex) | 2593 | | call extern lj_trace_exit@8 // (jit_State *J, ExitState *ex) |
2594 | | // Interpreter C frame returned in eax. | 2594 | | // Error code returned in eax (RD). |
2595 | | mov esp, eax // Reposition stack to C frame. | 2595 | | mov RAa, L:RB->cframe |
2596 | | and RAa, CFRAME_RAWMASK | ||
2597 | | mov esp, RAa // Reposition stack to C frame. | ||
2598 | | mov SAVE_L, L:RB // Needed for on-trace resume/yield. | ||
2599 | | test RD, RD; jnz >1 // Check for error from exit. | ||
2596 | | mov BASE, L:RB->base | 2600 | | mov BASE, L:RB->base |
2597 | | mov PC, SAVE_PC | 2601 | | mov PC, SAVE_PC |
2598 | | mov SAVE_L, L:RB // Needed for on-trace resume/yield. | ||
2599 | |.endif | 2602 | |.endif |
2600 | #endif | 2603 | #endif |
2601 | |->vm_exit_interp: | 2604 | |->vm_exit_interp: |
@@ -2606,6 +2609,11 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | |||
2606 | | mov dword [DISPATCH+DISPATCH_GL(jit_L)], 0 | 2609 | | mov dword [DISPATCH+DISPATCH_GL(jit_L)], 0 |
2607 | | set_vmstate INTERP | 2610 | | set_vmstate INTERP |
2608 | | ins_next | 2611 | | ins_next |
2612 | | | ||
2613 | |1: // Rethrow error from the right C frame. | ||
2614 | | mov FCARG1, L:RB | ||
2615 | | mov FCARG2, RD | ||
2616 | | call extern lj_err_throw@8 // (lua_State *L, int errcode) | ||
2609 | #endif | 2617 | #endif |
2610 | | | 2618 | | |
2611 | |//----------------------------------------------------------------------- | 2619 | |//----------------------------------------------------------------------- |