From 68ca796d28f616f38a376ed1bb1a3de29d1b1200 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Thu, 12 Apr 2012 12:02:38 +0200 Subject: [PATCH] Make lua_concat() work from C hook with partial frame. --- src/lj_api.c | 2 +- src/lj_meta.c | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/lj_api.c b/src/lj_api.c index 6c129164..b807900d 100644 --- a/src/lj_api.c +++ b/src/lj_api.c @@ -709,7 +709,7 @@ LUA_API void lua_concat(lua_State *L, int n) if (n >= 2) { n--; do { - TValue *top = lj_meta_cat(L, L->top-1, n); + TValue *top = lj_meta_cat(L, L->top-1, -n); if (top == NULL) { L->top -= n; break; diff --git a/src/lj_meta.c b/src/lj_meta.c index 4c4bf49d..ab8099e8 100644 --- a/src/lj_meta.c +++ b/src/lj_meta.c @@ -240,6 +240,8 @@ static LJ_AINLINE int tostring(lua_State *L, TValue *o) /* Helper for CAT. Coercion, iterative concat, __concat metamethod. */ TValue *lj_meta_cat(lua_State *L, TValue *top, int left) { + int fromc = 0; + if (left < 0) { left = -left; fromc = 1; } do { int n = 1; if (!(tvisstr(top-1) || tvisnumber(top-1)) || !tostring(L, top)) { @@ -300,7 +302,10 @@ TValue *lj_meta_cat(lua_State *L, TValue *top, int left) left -= n; top -= n; } while (left >= 1); - lj_gc_check_fixtop(L); + if (LJ_UNLIKELY(G(L)->gc.total >= G(L)->gc.threshold)) { + if (!fromc) L->top = curr_topL(L); + lj_gc_step(L); + } return NULL; } -- 2.11.4.GIT