aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2005-05-03 16:01:17 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2005-05-03 16:01:17 -0300
commitb320d37a80c6068cf6b7a91cdd8c8bc8bf71e06c (patch)
treef2e37cb4b7c90913eea3cea8ab8bd7e096fe85cf
parent9b8d136e1cda86c6292105fb1e92d3b909ce1491 (diff)
downloadlua-b320d37a80c6068cf6b7a91cdd8c8bc8bf71e06c.tar.gz
lua-b320d37a80c6068cf6b7a91cdd8c8bc8bf71e06c.tar.bz2
lua-b320d37a80c6068cf6b7a91cdd8c8bc8bf71e06c.zip
better tests for correctness of `savedpc'
-rw-r--r--ldo.c3
-rw-r--r--ltests.c18
-rw-r--r--ltests.h5
3 files changed, 22 insertions, 4 deletions
diff --git a/ldo.c b/ldo.c
index 1769b784..dc6da54f 100644
--- a/ldo.c
+++ b/ldo.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldo.c,v 2.21 2005/03/29 16:20:48 roberto Exp roberto $ 2** $Id: ldo.c,v 2.22 2005/04/05 13:41:29 roberto Exp roberto $
3** Stack and Call structure of Lua 3** Stack and Call structure of Lua
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -116,6 +116,7 @@ static void correctstack (lua_State *L, TValue *oldstack) {
116 ci->top = (ci->top - oldstack) + L->stack; 116 ci->top = (ci->top - oldstack) + L->stack;
117 ci->base = (ci->base - oldstack) + L->stack; 117 ci->base = (ci->base - oldstack) + L->stack;
118 ci->func = (ci->func - oldstack) + L->stack; 118 ci->func = (ci->func - oldstack) + L->stack;
119 lua_assert(lua_checkpc(L, ci));
119 } 120 }
120 L->base = L->ci->base; 121 L->base = L->ci->base;
121} 122}
diff --git a/ltests.c b/ltests.c
index 6ccc5042..9e7feda2 100644
--- a/ltests.c
+++ b/ltests.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltests.c,v 2.22 2005/03/23 17:51:11 roberto Exp roberto $ 2** $Id: ltests.c,v 2.23 2005/03/28 17:17:53 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*/
@@ -281,8 +281,10 @@ static void checkstack (global_State *g, lua_State *L1) {
281 } 281 }
282 checkliveness(g, gt(L1)); 282 checkliveness(g, gt(L1));
283 if (L1->base_ci) { 283 if (L1->base_ci) {
284 for (ci = L1->base_ci; ci <= L1->ci; ci++) 284 for (ci = L1->base_ci; ci <= L1->ci; ci++) {
285 lua_assert(ci->top <= L1->stack_last); 285 lua_assert(ci->top <= L1->stack_last);
286 lua_assert(lua_checkpc(L1, ci));
287 }
286 } 288 }
287 else lua_assert(L1->size_ci == 0); 289 else lua_assert(L1->size_ci == 0);
288 if (L1->stack) { 290 if (L1->stack) {
@@ -337,6 +339,18 @@ printf(">>> %d %s %02x\n", g->gcstate, luaT_typenames[o->gch.tt], o->gch.marke
337} 339}
338 340
339 341
342int lua_checkpc (lua_State *L, pCallInfo ci) {
343 if (ci == L->base_ci || !f_isLua(ci)) return 1;
344 else {
345 Proto *p = ci_func(ci)->l.p;
346 if (ci < L->ci)
347 return p->code <= ci->savedpc && ci->savedpc <= p->code + p->sizecode;
348 else
349 return p->code <= L->savedpc && L->savedpc <= p->code + p->sizecode;
350 }
351}
352
353
340int lua_checkmemory (lua_State *L) { 354int lua_checkmemory (lua_State *L) {
341 global_State *g = G(L); 355 global_State *g = G(L);
342 GCObject *o; 356 GCObject *o;
diff --git a/ltests.h b/ltests.h
index 7c145680..ff843092 100644
--- a/ltests.h
+++ b/ltests.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltests.h,v 2.12 2005/03/18 18:55:45 roberto Exp roberto $ 2** $Id: ltests.h,v 2.13 2005/04/13 17:24:20 roberto Exp roberto $
3** Internal Header for Debugging of the Lua Implementation 3** Internal Header for Debugging of the Lua Implementation
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -47,7 +47,10 @@ void *debug_realloc (void *ud, void *block, size_t osize, size_t nsize);
47#endif 47#endif
48 48
49 49
50typedef struct CallInfo *pCallInfo;
51
50int lua_checkmemory (lua_State *L); 52int lua_checkmemory (lua_State *L);
53int lua_checkpc (lua_State *L, pCallInfo ci);
51 54
52 55
53/* test for lock/unlock */ 56/* test for lock/unlock */