aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-08-19 11:16:33 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-08-19 11:16:33 -0300
commit8e6b7ef9ab226b9184d300ad1b14c3812a6e86d8 (patch)
tree3267567b2110b418d4fa8fccd1054c710e123924
parentcaceeab750ed80e94f8ec763248ae04cd90fefb5 (diff)
downloadlua-8e6b7ef9ab226b9184d300ad1b14c3812a6e86d8.tar.gz
lua-8e6b7ef9ab226b9184d300ad1b14c3812a6e86d8.tar.bz2
lua-8e6b7ef9ab226b9184d300ad1b14c3812a6e86d8.zip
new function 'isgclocal' + test for GC consistency of prototype's caches
-rw-r--r--ltests.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/ltests.c b/ltests.c
index 1fb01cfd..10b5ec02 100644
--- a/ltests.c
+++ b/ltests.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltests.c,v 2.143 2013/08/16 19:02:31 roberto Exp roberto $ 2** $Id: ltests.c,v 2.144 2013/08/18 16:12:18 roberto Exp roberto $
3** Internal Module for Debugging of the Lua Implementation 3** Internal Module for Debugging of the Lua Implementation
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -203,6 +203,8 @@ static int testobjref2 (GCObject *f, GCObject *t) {
203 UpVal *uv = gco2uv(f); 203 UpVal *uv = gco2uv(f);
204 return (uv->v != &uv->value); /* open upvalue can point to local stuff */ 204 return (uv->v != &uv->value); /* open upvalue can point to local stuff */
205 } 205 }
206 if (gch(f)->tt == LUA_TPROTO && gch(t)->tt == LUA_TLCL)
207 return 1; /* cache from a prototype */
206 return 0; 208 return 0;
207} 209}
208 210
@@ -274,6 +276,7 @@ static void checktable (global_State *g, Table *h) {
274static void checkproto (global_State *g, Proto *f) { 276static void checkproto (global_State *g, Proto *f) {
275 int i; 277 int i;
276 GCObject *fgc = obj2gco(f); 278 GCObject *fgc = obj2gco(f);
279 if (f->cache) checkobjref(g, fgc, f->cache);
277 if (f->source) checkobjref(g, fgc, f->source); 280 if (f->source) checkobjref(g, fgc, f->source);
278 for (i=0; i<f->sizek; i++) { 281 for (i=0; i<f->sizek; i++) {
279 if (ttisstring(f->k+i)) 282 if (ttisstring(f->k+i))
@@ -634,7 +637,7 @@ static int settrick (lua_State *L) {
634} 637}
635 638
636 639
637static int get_gccolor (lua_State *L) { 640static int gc_color (lua_State *L) {
638 TValue *o; 641 TValue *o;
639 luaL_checkany(L, 1); 642 luaL_checkany(L, 1);
640 o = obj_at(L, 1); 643 o = obj_at(L, 1);
@@ -647,6 +650,15 @@ static int get_gccolor (lua_State *L) {
647} 650}
648 651
649 652
653static int gc_local (lua_State *L) {
654 TValue *o;
655 luaL_checkany(L, 1);
656 o = obj_at(L, 1);
657 lua_pushboolean(L, !iscollectable(o) || islocal(gcvalue(o)));
658 return 1;
659}
660
661
650static int gc_state (lua_State *L) { 662static int gc_state (lua_State *L) {
651 static const char *statenames[] = {"propagate", "atomic", 663 static const char *statenames[] = {"propagate", "atomic",
652 "sweepstring", "sweepudata", "sweep", "pause", ""}; 664 "sweepstring", "sweepudata", "sweep", "pause", ""};
@@ -1447,7 +1459,8 @@ static const struct luaL_Reg tests_funcs[] = {
1447 {"d2s", d2s}, 1459 {"d2s", d2s},
1448 {"doonnewstack", doonnewstack}, 1460 {"doonnewstack", doonnewstack},
1449 {"doremote", doremote}, 1461 {"doremote", doremote},
1450 {"gccolor", get_gccolor}, 1462 {"gccolor", gc_color},
1463 {"isgclocal", gc_local},
1451 {"gcstate", gc_state}, 1464 {"gcstate", gc_state},
1452 {"getref", getref}, 1465 {"getref", getref},
1453 {"hash", hash_query}, 1466 {"hash", hash_query},