From d67eb4de49759c7c92a56b8d2c1b9858ecbd3bf8 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Wed, 1 Sep 2010 00:25:35 +0200 Subject: [PATCH] PPC: Handle stack growth on return to C. --- src/buildvm_ppc.dasc | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index 7e8178cd..d016ec47 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc @@ -329,7 +329,20 @@ static void build_subroutines(BuildCtx *ctx) | b <3 | |8: // Corner case: need to grow stack for filling up results. - | NYI + | // This can happen if: + | // - A C function grows the stack (a lot). + | // - The GC shrinks the stack in between. + | // - A return back from a lua_call() with (high) nresults adjustment. + | stw BASE, L->top // Save current top held in BASE (yes). + | mr SAVE0, RD + | mr CARG2, TMP2 + | mr CARG1, L + | bl extern lj_state_growstack // (lua_State *L, int n) + | lwz TMP2, SAVE_NRES + | mr RD, SAVE0 + | slwi TMP2, TMP2, 3 + | lwz BASE, L->top // Need the (realloced) L->top in BASE. + | b <2 | |->vm_unwind_c: // Unwind C stack, return from vm_pcall. | NYI