Selaa lähdekoodia

Make lua_concat() work from C hook with partial frame.

Mike Pall 13 vuotta sitten
vanhempi
commit
68ca796d28
2 muutettua tiedostoa jossa 7 lisäystä ja 2 poistoa
  1. 1 1
      src/lj_api.c
  2. 6 1
      src/lj_meta.c

+ 1 - 1
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;

+ 6 - 1
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;
 }