From dd0f09f95f36caf1f2111c10fec02748116003bb Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Tue, 22 Sep 2020 23:37:43 +0200 Subject: [PATCH] Another fix for lua_yield() from C hook. Reported by Jason Carr. --- src/lj_ccallback.c | 2 +- src/lj_err.c | 2 +- src/lj_frame.h | 2 +- src/lj_meta.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lj_ccallback.c b/src/lj_ccallback.c index 49775d2b..4c71f1a6 100644 --- a/src/lj_ccallback.c +++ b/src/lj_ccallback.c @@ -549,13 +549,13 @@ static void callback_conv_args(CTState *cts, lua_State *L) if (LJ_FR2) { (o++)->u64 = LJ_CONT_FFI_CALLBACK; (o++)->u64 = rid; - o++; } else { o->u32.lo = LJ_CONT_FFI_CALLBACK; o->u32.hi = rid; o++; } setframe_gc(o, obj2gco(fn), fntp); + if (LJ_FR2) o++; setframe_ftsz(o, ((char *)(o+1) - (char *)L->base) + FRAME_CONT); L->top = L->base = ++o; if (!ct) diff --git a/src/lj_err.c b/src/lj_err.c index 47f88740..656631a9 100644 --- a/src/lj_err.c +++ b/src/lj_err.c @@ -687,9 +687,9 @@ LJ_NOINLINE void lj_err_optype_call(lua_State *L, TValue *o) const BCIns *pc = cframe_Lpc(L); if (((ptrdiff_t)pc & FRAME_TYPE) != FRAME_LUA) { const char *tname = lj_typename(o); + setframe_gc(o, obj2gco(L), LJ_TTHREAD); if (LJ_FR2) o++; setframe_pc(o, pc); - setframe_gc(o, obj2gco(L), LJ_TTHREAD); L->top = L->base = o+1; err_msgv(L, LJ_ERR_BADCALL, tname); } diff --git a/src/lj_frame.h b/src/lj_frame.h index 599a2d1c..46a5c782 100644 --- a/src/lj_frame.h +++ b/src/lj_frame.h @@ -46,7 +46,7 @@ enum { #define frame_gc(f) (gcval((f)-1)) #define frame_ftsz(f) ((ptrdiff_t)(f)->ftsz) #define frame_pc(f) ((const BCIns *)frame_ftsz(f)) -#define setframe_gc(f, p, tp) (setgcVraw((f)-1, (p), (tp))) +#define setframe_gc(f, p, tp) (setgcVraw((f), (p), (tp))) #define setframe_ftsz(f, sz) ((f)->ftsz = (sz)) #define setframe_pc(f, pc) ((f)->ftsz = (int64_t)(intptr_t)(pc)) #else diff --git a/src/lj_meta.c b/src/lj_meta.c index 2cdb6a0f..f6e6d46a 100644 --- a/src/lj_meta.c +++ b/src/lj_meta.c @@ -86,8 +86,8 @@ int lj_meta_tailcall(lua_State *L, cTValue *tv) else top->u32.lo = LJ_CONT_TAILCALL; setframe_pc(top++, pc); - if (LJ_FR2) top++; setframe_gc(top, obj2gco(L), LJ_TTHREAD); /* Dummy frame object. */ + if (LJ_FR2) top++; setframe_ftsz(top, ((char *)(top+1) - (char *)base) + FRAME_CONT); L->base = L->top = top+1; /*