Răsfoiți Sursa

'gcstate' now also runs collector until given state + small changes
in 'testC' to test 'lua_topointer' and 'lua_tocfunction'

Roberto Ierusalimschy 15 ani în urmă
părinte
comite
1e6940f291
1 a modificat fișierele cu 22 adăugiri și 21 ștergeri
  1. 22 21
      ltests.c

+ 22 - 21
ltests.c

@@ -1,5 +1,5 @@
 /*
 /*
-** $Id: ltests.c,v 2.93 2010/04/12 16:07:39 roberto Exp roberto $
+** $Id: ltests.c,v 2.94 2010/04/13 20:48:12 roberto Exp roberto $
 ** Internal Module for Debugging of the Lua Implementation
 ** Internal Module for Debugging of the Lua Implementation
 ** See Copyright Notice in lua.h
 ** See Copyright Notice in lua.h
 */
 */
@@ -535,12 +535,6 @@ static int settrick (lua_State *L) {
 }
 }
 
 
 
 
-/*static int set_gcstate (lua_State *L) {
-  static const char *const state[] = {"propagate", "sweep", "finalize"};
-  return 0;
-}*/
-
-
 static int get_gccolor (lua_State *L) {
 static int get_gccolor (lua_State *L) {
   TValue *o;
   TValue *o;
   luaL_checkany(L, 1);
   luaL_checkany(L, 1);
@@ -554,15 +548,23 @@ static int get_gccolor (lua_State *L) {
 }
 }
 
 
 
 
-static int gcstate (lua_State *L) {
-  switch(G(L)->gcstate) {
-    case GCSpropagate: lua_pushstring(L, "propagate"); break;
-    case GCSsweepstring: lua_pushstring(L, "sweep strings"); break;
-    case GCSsweep: lua_pushstring(L, "sweep"); break;
-    case GCSfinalize: lua_pushstring(L, "finalize"); break;
-    default: lua_assert(0);
+static int gc_state (lua_State *L) {
+  static const char *statenames[] = {"", "pause", "propagate", "atomic",
+    "sweepstring", "sweepudata", "sweep", "finalize"};
+  static const int states[] = {0, GCSpause, GCSpropagate, GCSatomic,
+    GCSsweepstring, GCSsweepudata, GCSsweep, GCSfinalize};
+  int option = luaL_checkoption(L, 1, "", statenames);
+  if (option == 0) {
+    lua_pushstring(L, statenames[G(L)->gcstate]);
+    return 1;
+  }
+  else {
+    lua_lock(L);
+    luaC_runtilstate(L, bitmask(states[option]));
+    lua_assert(G(L)->gcstate == states[option]);
+    lua_unlock(L);
+    return 0;
   }
   }
-  return 1;
 }
 }
 
 
 
 
@@ -945,7 +947,7 @@ static int runC (lua_State *L, lua_State *L1, const char *pc) {
       lua_pushnumber(L1, lua_tonumber(L1, getindex));
       lua_pushnumber(L1, lua_tonumber(L1, getindex));
     }
     }
     else if EQ("topointer") {
     else if EQ("topointer") {
-      lua_pushlightuserdata(L1, cast(void *, lua_topointer(L1, getindex)));
+      lua_pushnumber(L1, cast(size_t, lua_topointer(L1, getindex)));
     }
     }
     else if EQ("tostring") {
     else if EQ("tostring") {
       const char *s = lua_tostring(L1, getindex);
       const char *s = lua_tostring(L1, getindex);
@@ -964,9 +966,9 @@ static int runC (lua_State *L, lua_State *L1, const char *pc) {
     else if EQ("tocfunction") {
     else if EQ("tocfunction") {
       lua_pushcfunction(L1, lua_tocfunction(L1, getindex));
       lua_pushcfunction(L1, lua_tocfunction(L1, getindex));
     }
     }
-    else if EQ("func2udata") {
+    else if EQ("func2num") {
       lua_CFunction func = lua_tocfunction(L1, getindex);
       lua_CFunction func = lua_tocfunction(L1, getindex);
-      lua_pushlightuserdata(L1, &func);
+      lua_pushnumber(L1, cast(size_t, func));
     }
     }
     else if EQ("return") {
     else if EQ("return") {
       int n = getnum;
       int n = getnum;
@@ -1166,8 +1168,7 @@ static int runC (lua_State *L, lua_State *L1, const char *pc) {
       lua_pushinteger(L1, i);
       lua_pushinteger(L1, i);
     }
     }
     else if EQ("checkstack") {
     else if EQ("checkstack") {
-      if (!lua_checkstack(L1, getnum))
-        luaL_error(L, "C stack overflow");
+      luaL_checkstack(L1, getnum, NULL);
     }
     }
     else if EQ("newmetatable") {
     else if EQ("newmetatable") {
       lua_pushboolean(L1, luaL_newmetatable(L1, getstring));
       lua_pushboolean(L1, luaL_newmetatable(L1, getstring));
@@ -1333,7 +1334,7 @@ static const struct luaL_Reg tests_funcs[] = {
   {"doonnewstack", doonnewstack},
   {"doonnewstack", doonnewstack},
   {"doremote", doremote},
   {"doremote", doremote},
   {"gccolor", get_gccolor},
   {"gccolor", get_gccolor},
-  {"gcstate", gcstate},
+  {"gcstate", gc_state},
   {"getref", getref},
   {"getref", getref},
   {"hash", hash_query},
   {"hash", hash_query},
   {"int2fb", int2fb_aux},
   {"int2fb", int2fb_aux},