diff options
-rw-r--r-- | ldebug.c | 13 | ||||
-rw-r--r-- | lfunc.c | 15 | ||||
-rw-r--r-- | lfunc.h | 3 | ||||
-rw-r--r-- | lgc.c | 64 | ||||
-rw-r--r-- | lobject.h | 12 | ||||
-rw-r--r-- | lstate.h | 7 | ||||
-rw-r--r-- | ltests.c | 41 |
7 files changed, 88 insertions, 67 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ldebug.c,v 2.87 2011/10/07 20:45:19 roberto Exp roberto $ | 2 | ** $Id: ldebug.c,v 2.88 2011/11/30 12:43:51 roberto Exp roberto $ |
3 | ** Debug Interface | 3 | ** Debug Interface |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -30,6 +30,9 @@ | |||
30 | 30 | ||
31 | 31 | ||
32 | 32 | ||
33 | #define noLuaClosure(f) ((f) == NULL || (f)->c.tt == LUA_TCCL) | ||
34 | |||
35 | |||
33 | static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name); | 36 | static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name); |
34 | 37 | ||
35 | 38 | ||
@@ -173,7 +176,7 @@ LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { | |||
173 | 176 | ||
174 | 177 | ||
175 | static void funcinfo (lua_Debug *ar, Closure *cl) { | 178 | static void funcinfo (lua_Debug *ar, Closure *cl) { |
176 | if (cl == NULL || cl->c.isC) { | 179 | if (noLuaClosure(cl)) { |
177 | ar->source = "=[C]"; | 180 | ar->source = "=[C]"; |
178 | ar->linedefined = -1; | 181 | ar->linedefined = -1; |
179 | ar->lastlinedefined = -1; | 182 | ar->lastlinedefined = -1; |
@@ -191,7 +194,7 @@ static void funcinfo (lua_Debug *ar, Closure *cl) { | |||
191 | 194 | ||
192 | 195 | ||
193 | static void collectvalidlines (lua_State *L, Closure *f) { | 196 | static void collectvalidlines (lua_State *L, Closure *f) { |
194 | if (f == NULL || f->c.isC) { | 197 | if (noLuaClosure(f)) { |
195 | setnilvalue(L->top); | 198 | setnilvalue(L->top); |
196 | incr_top(L); | 199 | incr_top(L); |
197 | } | 200 | } |
@@ -210,7 +213,7 @@ static void collectvalidlines (lua_State *L, Closure *f) { | |||
210 | 213 | ||
211 | 214 | ||
212 | static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar, | 215 | static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar, |
213 | Closure *f, CallInfo *ci) { | 216 | Closure *f, CallInfo *ci) { |
214 | int status = 1; | 217 | int status = 1; |
215 | for (; *what; what++) { | 218 | for (; *what; what++) { |
216 | switch (*what) { | 219 | switch (*what) { |
@@ -224,7 +227,7 @@ static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar, | |||
224 | } | 227 | } |
225 | case 'u': { | 228 | case 'u': { |
226 | ar->nups = (f == NULL) ? 0 : f->c.nupvalues; | 229 | ar->nups = (f == NULL) ? 0 : f->c.nupvalues; |
227 | if (f == NULL || f->c.isC) { | 230 | if (noLuaClosure(f)) { |
228 | ar->isvararg = 1; | 231 | ar->isvararg = 1; |
229 | ar->nparams = 0; | 232 | ar->nparams = 0; |
230 | } | 233 | } |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lfunc.c,v 2.26 2010/06/10 21:27:09 roberto Exp roberto $ | 2 | ** $Id: lfunc.c,v 2.27 2010/06/30 14:11:17 roberto Exp roberto $ |
3 | ** Auxiliary functions to manipulate prototypes and closures | 3 | ** Auxiliary functions to manipulate prototypes and closures |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -21,8 +21,7 @@ | |||
21 | 21 | ||
22 | 22 | ||
23 | Closure *luaF_newCclosure (lua_State *L, int n) { | 23 | Closure *luaF_newCclosure (lua_State *L, int n) { |
24 | Closure *c = &luaC_newobj(L, LUA_TFUNCTION, sizeCclosure(n), NULL, 0)->cl; | 24 | Closure *c = &luaC_newobj(L, LUA_TCCL, sizeCclosure(n), NULL, 0)->cl; |
25 | c->c.isC = 1; | ||
26 | c->c.nupvalues = cast_byte(n); | 25 | c->c.nupvalues = cast_byte(n); |
27 | return c; | 26 | return c; |
28 | } | 27 | } |
@@ -30,8 +29,7 @@ Closure *luaF_newCclosure (lua_State *L, int n) { | |||
30 | 29 | ||
31 | Closure *luaF_newLclosure (lua_State *L, Proto *p) { | 30 | Closure *luaF_newLclosure (lua_State *L, Proto *p) { |
32 | int n = p->sizeupvalues; | 31 | int n = p->sizeupvalues; |
33 | Closure *c = &luaC_newobj(L, LUA_TFUNCTION, sizeLclosure(n), NULL, 0)->cl; | 32 | Closure *c = &luaC_newobj(L, LUA_TLCL, sizeLclosure(n), NULL, 0)->cl; |
34 | c->l.isC = 0; | ||
35 | c->l.p = p; | 33 | c->l.p = p; |
36 | c->l.nupvalues = cast_byte(n); | 34 | c->l.nupvalues = cast_byte(n); |
37 | while (n--) c->l.upvals[n] = NULL; | 35 | while (n--) c->l.upvals[n] = NULL; |
@@ -146,13 +144,6 @@ void luaF_freeproto (lua_State *L, Proto *f) { | |||
146 | } | 144 | } |
147 | 145 | ||
148 | 146 | ||
149 | void luaF_freeclosure (lua_State *L, Closure *c) { | ||
150 | int size = (c->c.isC) ? sizeCclosure(c->c.nupvalues) : | ||
151 | sizeLclosure(c->l.nupvalues); | ||
152 | luaM_freemem(L, c, size); | ||
153 | } | ||
154 | |||
155 | |||
156 | /* | 147 | /* |
157 | ** Look for n-th local variable at line `line' in function `func'. | 148 | ** Look for n-th local variable at line `line' in function `func'. |
158 | ** Returns NULL if not found. | 149 | ** Returns NULL if not found. |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lfunc.h,v 2.5 2010/03/26 20:58:11 roberto Exp roberto $ | 2 | ** $Id: lfunc.h,v 2.6 2010/06/04 13:06:15 roberto Exp roberto $ |
3 | ** Auxiliary functions to manipulate prototypes and closures | 3 | ** Auxiliary functions to manipulate prototypes and closures |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -25,7 +25,6 @@ LUAI_FUNC UpVal *luaF_newupval (lua_State *L); | |||
25 | LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level); | 25 | LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level); |
26 | LUAI_FUNC void luaF_close (lua_State *L, StkId level); | 26 | LUAI_FUNC void luaF_close (lua_State *L, StkId level); |
27 | LUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f); | 27 | LUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f); |
28 | LUAI_FUNC void luaF_freeclosure (lua_State *L, Closure *c); | ||
29 | LUAI_FUNC void luaF_freeupval (lua_State *L, UpVal *uv); | 28 | LUAI_FUNC void luaF_freeupval (lua_State *L, UpVal *uv); |
30 | LUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number, | 29 | LUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number, |
31 | int pc); | 30 | int pc); |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lgc.c,v 2.115 2011/11/28 17:25:48 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 2.116 2011/12/02 13:18:41 roberto Exp roberto $ |
3 | ** Garbage Collector | 3 | ** Garbage Collector |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -217,7 +217,8 @@ void luaC_checkupvalcolor (global_State *g, UpVal *uv) { | |||
217 | GCObject *luaC_newobj (lua_State *L, int tt, size_t sz, GCObject **list, | 217 | GCObject *luaC_newobj (lua_State *L, int tt, size_t sz, GCObject **list, |
218 | int offset) { | 218 | int offset) { |
219 | global_State *g = G(L); | 219 | global_State *g = G(L); |
220 | GCObject *o = obj2gco(cast(char *, luaM_newobject(L, tt, sz)) + offset); | 220 | char *raw = cast(char *, luaM_newobject(L, novariant(tt), sz)); |
221 | GCObject *o = obj2gco(raw + offset); | ||
221 | if (list == NULL) | 222 | if (list == NULL) |
222 | list = &g->allgc; /* standard list for collectable objects */ | 223 | list = &g->allgc; /* standard list for collectable objects */ |
223 | gch(o)->marked = luaC_white(g); | 224 | gch(o)->marked = luaC_white(g); |
@@ -266,8 +267,13 @@ static void reallymarkobject (global_State *g, GCObject *o) { | |||
266 | gray2black(o); /* make it black */ | 267 | gray2black(o); /* make it black */ |
267 | return; | 268 | return; |
268 | } | 269 | } |
269 | case LUA_TFUNCTION: { | 270 | case LUA_TLCL: { |
270 | gco2cl(o)->c.gclist = g->gray; | 271 | gco2lcl(o)->gclist = g->gray; |
272 | g->gray = o; | ||
273 | break; | ||
274 | } | ||
275 | case LUA_TCCL: { | ||
276 | gco2ccl(o)->gclist = g->gray; | ||
271 | g->gray = o; | 277 | g->gray = o; |
272 | break; | 278 | break; |
273 | } | 279 | } |
@@ -470,20 +476,20 @@ static int traverseproto (global_State *g, Proto *f) { | |||
470 | } | 476 | } |
471 | 477 | ||
472 | 478 | ||
473 | static int traverseclosure (global_State *g, Closure *cl) { | 479 | static int traverseCclosure (global_State *g, CClosure *cl) { |
474 | if (cl->c.isC) { | 480 | int i; |
475 | int i; | 481 | for (i = 0; i < cl->nupvalues; i++) /* mark its upvalues */ |
476 | for (i=0; i<cl->c.nupvalues; i++) /* mark its upvalues */ | 482 | markvalue(g, &cl->upvalue[i]); |
477 | markvalue(g, &cl->c.upvalue[i]); | 483 | return TRAVCOST + cl->nupvalues; |
478 | } | 484 | } |
479 | else { | 485 | |
480 | int i; | 486 | static int traverseLclosure (global_State *g, LClosure *cl) { |
481 | lua_assert(cl->l.nupvalues == cl->l.p->sizeupvalues); | 487 | int i; |
482 | markobject(g, cl->l.p); /* mark its prototype */ | 488 | assert(cl->nupvalues == cl->p->sizeupvalues); |
483 | for (i=0; i<cl->l.nupvalues; i++) /* mark its upvalues */ | 489 | markobject(g, cl->p); /* mark its prototype */ |
484 | markobject(g, cl->l.upvals[i]); | 490 | for (i = 0; i < cl->nupvalues; i++) /* mark its upvalues */ |
485 | } | 491 | markobject(g, cl->upvals[i]); |
486 | return TRAVCOST + cl->c.nupvalues; | 492 | return TRAVCOST + cl->nupvalues; |
487 | } | 493 | } |
488 | 494 | ||
489 | 495 | ||
@@ -517,10 +523,15 @@ static int propagatemark (global_State *g) { | |||
517 | g->gray = h->gclist; | 523 | g->gray = h->gclist; |
518 | return traversetable(g, h); | 524 | return traversetable(g, h); |
519 | } | 525 | } |
520 | case LUA_TFUNCTION: { | 526 | case LUA_TLCL: { |
521 | Closure *cl = gco2cl(o); | 527 | LClosure *cl = gco2lcl(o); |
522 | g->gray = cl->c.gclist; | 528 | g->gray = cl->gclist; |
523 | return traverseclosure(g, cl); | 529 | return traverseLclosure(g, cl); |
530 | } | ||
531 | case LUA_TCCL: { | ||
532 | CClosure *cl = gco2ccl(o); | ||
533 | g->gray = cl->gclist; | ||
534 | return traverseCclosure(g, cl); | ||
524 | } | 535 | } |
525 | case LUA_TTHREAD: { | 536 | case LUA_TTHREAD: { |
526 | lua_State *th = gco2th(o); | 537 | lua_State *th = gco2th(o); |
@@ -640,7 +651,14 @@ static void clearvalues (GCObject *l, GCObject *f) { | |||
640 | static void freeobj (lua_State *L, GCObject *o) { | 651 | static void freeobj (lua_State *L, GCObject *o) { |
641 | switch (gch(o)->tt) { | 652 | switch (gch(o)->tt) { |
642 | case LUA_TPROTO: luaF_freeproto(L, gco2p(o)); break; | 653 | case LUA_TPROTO: luaF_freeproto(L, gco2p(o)); break; |
643 | case LUA_TFUNCTION: luaF_freeclosure(L, gco2cl(o)); break; | 654 | case LUA_TLCL: { |
655 | luaM_freemem(L, o, sizeLclosure(gco2lcl(o)->nupvalues)); | ||
656 | break; | ||
657 | } | ||
658 | case LUA_TCCL: { | ||
659 | luaM_freemem(L, o, sizeCclosure(gco2ccl(o)->nupvalues)); | ||
660 | break; | ||
661 | } | ||
644 | case LUA_TUPVAL: luaF_freeupval(L, gco2uv(o)); break; | 662 | case LUA_TUPVAL: luaF_freeupval(L, gco2uv(o)); break; |
645 | case LUA_TTABLE: luaH_free(L, gco2t(o)); break; | 663 | case LUA_TTABLE: luaH_free(L, gco2t(o)); break; |
646 | case LUA_TTHREAD: luaE_freethread(L, gco2th(o)); break; | 664 | case LUA_TTHREAD: luaE_freethread(L, gco2th(o)); break; |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lobject.h,v 2.63 2011/10/17 14:46:13 roberto Exp roberto $ | 2 | ** $Id: lobject.h,v 2.64 2011/10/31 17:48:22 roberto Exp roberto $ |
3 | ** Type definitions for Lua objects | 3 | ** Type definitions for Lua objects |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -109,12 +109,14 @@ typedef struct lua_TValue TValue; | |||
109 | /* raw type tag of a TValue */ | 109 | /* raw type tag of a TValue */ |
110 | #define rttype(o) ((o)->tt_) | 110 | #define rttype(o) ((o)->tt_) |
111 | 111 | ||
112 | /* tag with no variants (bits 0-3) */ | ||
113 | #define novariant(x) ((x) & 0x0F) | ||
114 | |||
112 | /* type tag of a TValue (bits 0-3 for tags + variant bits 4-5) */ | 115 | /* type tag of a TValue (bits 0-3 for tags + variant bits 4-5) */ |
113 | #define ttype(o) (rttype(o) & 0x3F) | 116 | #define ttype(o) (rttype(o) & 0x3F) |
114 | 117 | ||
115 | |||
116 | /* type tag of a TValue with no variants (bits 0-3) */ | 118 | /* type tag of a TValue with no variants (bits 0-3) */ |
117 | #define ttypenv(o) (rttype(o) & 0x0F) | 119 | #define ttypenv(o) (novariant(rttype(o))) |
118 | 120 | ||
119 | 121 | ||
120 | /* Macros to test type */ | 122 | /* Macros to test type */ |
@@ -161,7 +163,7 @@ typedef struct lua_TValue TValue; | |||
161 | 163 | ||
162 | 164 | ||
163 | /* Macros for internal tests */ | 165 | /* Macros for internal tests */ |
164 | #define righttt(obj) (ttypenv(obj) == gcvalue(obj)->gch.tt) | 166 | #define righttt(obj) (ttype(obj) == gcvalue(obj)->gch.tt) |
165 | 167 | ||
166 | #define checkliveness(g,obj) \ | 168 | #define checkliveness(g,obj) \ |
167 | lua_longassert(!iscollectable(obj) || \ | 169 | lua_longassert(!iscollectable(obj) || \ |
@@ -501,7 +503,7 @@ typedef struct UpVal { | |||
501 | */ | 503 | */ |
502 | 504 | ||
503 | #define ClosureHeader \ | 505 | #define ClosureHeader \ |
504 | CommonHeader; lu_byte isC; lu_byte nupvalues; GCObject *gclist | 506 | CommonHeader; lu_byte nupvalues; GCObject *gclist |
505 | 507 | ||
506 | typedef struct CClosure { | 508 | typedef struct CClosure { |
507 | ClosureHeader; | 509 | ClosureHeader; |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lstate.h,v 2.73 2011/08/23 17:24:34 roberto Exp roberto $ | 2 | ** $Id: lstate.h,v 2.74 2011/09/30 12:45:07 roberto Exp roberto $ |
3 | ** Global State | 3 | ** Global State |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -197,7 +197,10 @@ union GCObject { | |||
197 | #define gco2ts(o) (&rawgco2ts(o)->tsv) | 197 | #define gco2ts(o) (&rawgco2ts(o)->tsv) |
198 | #define rawgco2u(o) check_exp((o)->gch.tt == LUA_TUSERDATA, &((o)->u)) | 198 | #define rawgco2u(o) check_exp((o)->gch.tt == LUA_TUSERDATA, &((o)->u)) |
199 | #define gco2u(o) (&rawgco2u(o)->uv) | 199 | #define gco2u(o) (&rawgco2u(o)->uv) |
200 | #define gco2cl(o) check_exp((o)->gch.tt == LUA_TFUNCTION, &((o)->cl)) | 200 | #define gco2lcl(o) check_exp((o)->gch.tt == LUA_TLCL, &((o)->cl.l)) |
201 | #define gco2ccl(o) check_exp((o)->gch.tt == LUA_TCCL, &((o)->cl.c)) | ||
202 | #define gco2cl(o) \ | ||
203 | check_exp(novariant((o)->gch.tt) == LUA_TFUNCTION, &((o)->cl)) | ||
201 | #define gco2t(o) check_exp((o)->gch.tt == LUA_TTABLE, &((o)->h)) | 204 | #define gco2t(o) check_exp((o)->gch.tt == LUA_TTABLE, &((o)->h)) |
202 | #define gco2p(o) check_exp((o)->gch.tt == LUA_TPROTO, &((o)->p)) | 205 | #define gco2p(o) check_exp((o)->gch.tt == LUA_TPROTO, &((o)->p)) |
203 | #define gco2uv(o) check_exp((o)->gch.tt == LUA_TUPVAL, &((o)->uv)) | 206 | #define gco2uv(o) check_exp((o)->gch.tt == LUA_TUPVAL, &((o)->uv)) |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ltests.c,v 2.123 2011/09/24 21:11:29 roberto Exp roberto $ | 2 | ** $Id: ltests.c,v 2.124 2011/11/09 19:08:07 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 | */ |
@@ -267,22 +267,23 @@ static void checkproto (global_State *g, Proto *f) { | |||
267 | 267 | ||
268 | 268 | ||
269 | 269 | ||
270 | static void checkclosure (global_State *g, Closure *cl) { | 270 | static void checkCclosure (global_State *g, CClosure *cl) { |
271 | GCObject *clgc = obj2gco(cl); | 271 | GCObject *clgc = obj2gco(cl); |
272 | if (cl->c.isC) { | 272 | int i; |
273 | int i; | 273 | for (i = 0; i < cl->nupvalues; i++) |
274 | for (i=0; i<cl->c.nupvalues; i++) | 274 | checkvalref(g, clgc, &cl->upvalue[i]); |
275 | checkvalref(g, clgc, &cl->c.upvalue[i]); | 275 | } |
276 | } | 276 | |
277 | else { | 277 | |
278 | int i; | 278 | static void checkLclosure (global_State *g, LClosure *cl) { |
279 | lua_assert(cl->l.nupvalues == cl->l.p->sizeupvalues); | 279 | GCObject *clgc = obj2gco(cl); |
280 | checkobjref(g, clgc, cl->l.p); | 280 | int i; |
281 | for (i=0; i<cl->l.nupvalues; i++) { | 281 | lua_assert(cl->nupvalues == cl->p->sizeupvalues); |
282 | if (cl->l.upvals[i]) { | 282 | checkobjref(g, clgc, cl->p); |
283 | lua_assert(cl->l.upvals[i]->tt == LUA_TUPVAL); | 283 | for (i=0; i<cl->nupvalues; i++) { |
284 | checkobjref(g, clgc, cl->l.upvals[i]); | 284 | if (cl->upvals[i]) { |
285 | } | 285 | lua_assert(cl->upvals[i]->tt == LUA_TUPVAL); |
286 | checkobjref(g, clgc, cl->upvals[i]); | ||
286 | } | 287 | } |
287 | } | 288 | } |
288 | } | 289 | } |
@@ -347,8 +348,12 @@ static void checkobject (global_State *g, GCObject *o) { | |||
347 | checkstack(g, gco2th(o)); | 348 | checkstack(g, gco2th(o)); |
348 | break; | 349 | break; |
349 | } | 350 | } |
350 | case LUA_TFUNCTION: { | 351 | case LUA_TLCL: { |
351 | checkclosure(g, gco2cl(o)); | 352 | checkLclosure(g, gco2lcl(o)); |
353 | break; | ||
354 | } | ||
355 | case LUA_TCCL: { | ||
356 | checkCclosure(g, gco2ccl(o)); | ||
352 | break; | 357 | break; |
353 | } | 358 | } |
354 | case LUA_TPROTO: { | 359 | case LUA_TPROTO: { |