diff options
author | Mike Pall <mike> | 2010-09-01 00:27:48 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2010-09-01 00:27:48 +0200 |
commit | 7ccdc8045bf06d8f2b24892e37a440c1c8b7d550 (patch) | |
tree | afb41e45a2f9be57241e78b35dc1df085e356136 /src | |
parent | d67eb4de49759c7c92a56b8d2c1b9858ecbd3bf8 (diff) | |
download | luajit-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.dasc | 26 |
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 ----------------------------------------------- |