diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-07-18 09:17:54 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-07-18 09:17:54 -0300 |
commit | 56137d58ff7abe8cb22ee3469366e08888c84f28 (patch) | |
tree | 6769e3c2403a69cf3f0d6dbf6fb4acb7442367e0 /lgc.c | |
parent | 9aec500a2691d2b13c307d143868c8a4fab33220 (diff) | |
download | lua-56137d58ff7abe8cb22ee3469366e08888c84f28.tar.gz lua-56137d58ff7abe8cb22ee3469366e08888c84f28.tar.bz2 lua-56137d58ff7abe8cb22ee3469366e08888c84f28.zip |
added check for conversion 'obj2gco' (and corrections for small
problems detected by this check)
Diffstat (limited to 'lgc.c')
-rw-r--r-- | lgc.c | 13 |
1 files changed, 8 insertions, 5 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lgc.c,v 2.184 2014/06/30 19:48:08 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 2.185 2014/07/17 17:27:49 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 | */ |
@@ -83,6 +83,9 @@ | |||
83 | #define markobject(g,t) \ | 83 | #define markobject(g,t) \ |
84 | { if ((t) && iswhite(obj2gco(t))) reallymarkobject(g, obj2gco(t)); } | 84 | { if ((t) && iswhite(obj2gco(t))) reallymarkobject(g, obj2gco(t)); } |
85 | 85 | ||
86 | #define markstring(g,t) \ | ||
87 | { if ((t) && iswhite(ts2gco(t))) reallymarkobject(g, ts2gco(t)); } | ||
88 | |||
86 | static void reallymarkobject (global_State *g, GCObject *o); | 89 | static void reallymarkobject (global_State *g, GCObject *o); |
87 | 90 | ||
88 | 91 | ||
@@ -126,7 +129,7 @@ static void removeentry (Node *n) { | |||
126 | static int iscleared (global_State *g, const TValue *o) { | 129 | static int iscleared (global_State *g, const TValue *o) { |
127 | if (!iscollectable(o)) return 0; | 130 | if (!iscollectable(o)) return 0; |
128 | else if (ttisstring(o)) { | 131 | else if (ttisstring(o)) { |
129 | markobject(g, rawtsvalue(o)); /* strings are `values', so are never weak */ | 132 | markobject(g, tsvalue(o)); /* strings are `values', so are never weak */ |
130 | return 0; | 133 | return 0; |
131 | } | 134 | } |
132 | else return iswhite(gcvalue(o)); | 135 | else return iswhite(gcvalue(o)); |
@@ -448,15 +451,15 @@ static int traverseproto (global_State *g, Proto *f) { | |||
448 | int i; | 451 | int i; |
449 | if (f->cache && iswhite(obj2gco(f->cache))) | 452 | if (f->cache && iswhite(obj2gco(f->cache))) |
450 | f->cache = NULL; /* allow cache to be collected */ | 453 | f->cache = NULL; /* allow cache to be collected */ |
451 | markobject(g, f->source); | 454 | markstring(g, f->source); |
452 | for (i = 0; i < f->sizek; i++) /* mark literals */ | 455 | for (i = 0; i < f->sizek; i++) /* mark literals */ |
453 | markvalue(g, &f->k[i]); | 456 | markvalue(g, &f->k[i]); |
454 | for (i = 0; i < f->sizeupvalues; i++) /* mark upvalue names */ | 457 | for (i = 0; i < f->sizeupvalues; i++) /* mark upvalue names */ |
455 | markobject(g, f->upvalues[i].name); | 458 | markstring(g, f->upvalues[i].name); |
456 | for (i = 0; i < f->sizep; i++) /* mark nested protos */ | 459 | for (i = 0; i < f->sizep; i++) /* mark nested protos */ |
457 | markobject(g, f->p[i]); | 460 | markobject(g, f->p[i]); |
458 | for (i = 0; i < f->sizelocvars; i++) /* mark local-variable names */ | 461 | for (i = 0; i < f->sizelocvars; i++) /* mark local-variable names */ |
459 | markobject(g, f->locvars[i].varname); | 462 | markstring(g, f->locvars[i].varname); |
460 | return sizeof(Proto) + sizeof(Instruction) * f->sizecode + | 463 | return sizeof(Proto) + sizeof(Instruction) * f->sizecode + |
461 | sizeof(Proto *) * f->sizep + | 464 | sizeof(Proto *) * f->sizep + |
462 | sizeof(TValue) * f->sizek + | 465 | sizeof(TValue) * f->sizek + |