aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2010-09-01 00:27:48 +0200
committerMike Pall <mike>2010-09-01 00:27:48 +0200
commit7ccdc8045bf06d8f2b24892e37a440c1c8b7d550 (patch)
treeafb41e45a2f9be57241e78b35dc1df085e356136 /src
parentd67eb4de49759c7c92a56b8d2c1b9858ecbd3bf8 (diff)
downloadluajit-7ccdc8045bf06d8f2b24892e37a440c1c8b7d550.tar.gz
luajit-7ccdc8045bf06d8f2b24892e37a440c1c8b7d550.tar.bz2
luajit-7ccdc8045bf06d8f2b24892e37a440c1c8b7d550.zip
PPC: Unwind the stack after an error is thrown.
Diffstat (limited to 'src')
-rw-r--r--src/buildvm_ppc.dasc26
1 files changed, 22 insertions, 4 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc
index d016ec47..57c146b8 100644
--- a/src/buildvm_ppc.dasc
+++ b/src/buildvm_ppc.dasc
@@ -345,14 +345,32 @@ static void build_subroutines(BuildCtx *ctx)
345 | b <2 345 | b <2
346 | 346 |
347 |->vm_unwind_c: // Unwind C stack, return from vm_pcall. 347 |->vm_unwind_c: // Unwind C stack, return from vm_pcall.
348 | NYI 348 | // (void *cframe, int errcode)
349 | mr sp, CARG1
350 | mr CRET1, CARG2
349 |->vm_unwind_c_eh: // Landing pad for external unwinder. 351 |->vm_unwind_c_eh: // Landing pad for external unwinder.
350 | NYI 352 | lwz L, SAVE_L
353 | li TMP0, ~LJ_VMST_C
354 | lwz GL:TMP1, L->glref
355 | stw TMP0, GL:TMP1->vmstate
356 | b ->vm_leave_unw
351 | 357 |
352 |->vm_unwind_ff: // Unwind C stack, return from ff pcall. 358 |->vm_unwind_ff: // Unwind C stack, return from ff pcall.
353 | NYI 359 | // (void *cframe)
360 | rlwinm sp, CARG1, 0, 0, 29
354 |->vm_unwind_ff_eh: // Landing pad for external unwinder. 361 |->vm_unwind_ff_eh: // Landing pad for external unwinder.
355 | NYI 362 | lwz L, SAVE_L
363 | lwz BASE, L->base
364 | li TMP1, LJ_TFALSE
365 | lwz DISPATCH, L->glref // Setup pointer to dispatch table.
366 | li_vmstate INTERP
367 | lwz PC, FRAME_PC(BASE) // Fetch PC of previous frame.
368 | subi RA, BASE, 8 // Results start at BASE-8.
369 | addi DISPATCH, DISPATCH, GG_G2DISP
370 | stw TMP1, 0(RA) // Prepend false to error message.
371 | li RD, 16 // 2 results: false + error message.
372 | st_vmstate
373 | b ->vm_returnc
356 | 374 |
357 |//----------------------------------------------------------------------- 375 |//-----------------------------------------------------------------------
358 |//-- Grow stack for calls ----------------------------------------------- 376 |//-- Grow stack for calls -----------------------------------------------