aboutsummaryrefslogtreecommitdiff
path: root/lgc.c
diff options
context:
space:
mode:
Diffstat (limited to 'lgc.c')
-rw-r--r--lgc.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/lgc.c b/lgc.c
index 3ca610e6..3f9bcf86 100644
--- a/lgc.c
+++ b/lgc.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lgc.c,v 1.135 2002/04/23 15:04:39 roberto Exp roberto $ 2** $Id: lgc.c,v 1.136 2002/05/08 17:34:23 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*/
@@ -72,6 +72,14 @@ static void protomark (Proto *f) {
72} 72}
73 73
74 74
75static void marktable (GCState *st, Table *h) {
76 if (!ismarked(h)) {
77 h->mark = st->tmark; /* chain it for later traversal */
78 st->tmark = h;
79 }
80}
81
82
75static void markclosure (GCState *st, Closure *cl) { 83static void markclosure (GCState *st, Closure *cl) {
76 if (!cl->c.marked) { 84 if (!cl->c.marked) {
77 cl->c.marked = 1; 85 cl->c.marked = 1;
@@ -83,6 +91,7 @@ static void markclosure (GCState *st, Closure *cl) {
83 else { 91 else {
84 int i; 92 int i;
85 lua_assert(cl->l.nupvalues == cl->l.p->nupvalues); 93 lua_assert(cl->l.nupvalues == cl->l.p->nupvalues);
94 marktable(st, hvalue(&cl->l.g));
86 protomark(cl->l.p); 95 protomark(cl->l.p);
87 for (i=0; i<cl->l.nupvalues; i++) { /* mark its upvalues */ 96 for (i=0; i<cl->l.nupvalues; i++) { /* mark its upvalues */
88 UpVal *u = cl->l.upvals[i]; 97 UpVal *u = cl->l.upvals[i];
@@ -96,14 +105,6 @@ static void markclosure (GCState *st, Closure *cl) {
96} 105}
97 106
98 107
99static void marktable (GCState *st, Table *h) {
100 if (!ismarked(h)) {
101 h->mark = st->tmark; /* chain it for later traversal */
102 st->tmark = h;
103 }
104}
105
106
107static void markudata (GCState *st, Udata *u) { 108static void markudata (GCState *st, Udata *u) {
108 markud(u); 109 markud(u);
109 marktable(st, u->uv.metatable); 110 marktable(st, u->uv.metatable);