diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-06-20 17:41:46 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-06-20 17:41:46 -0300 |
commit | 3941af53adee868e2cccfb9b85783aba9ac311c1 (patch) | |
tree | 8b6295c8aefacf286c13c7d78b1d2a91421ce2b1 /lgc.c | |
parent | 5610fdd776edd0de71864f79d50b4526df861d75 (diff) | |
download | lua-3941af53adee868e2cccfb9b85783aba9ac311c1.tar.gz lua-3941af53adee868e2cccfb9b85783aba9ac311c1.tar.bz2 lua-3941af53adee868e2cccfb9b85783aba9ac311c1.zip |
first implementation of independent global table per function
Diffstat (limited to 'lgc.c')
-rw-r--r-- | lgc.c | 19 |
1 files changed, 10 insertions, 9 deletions
@@ -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 | ||
75 | static 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 | |||
75 | static void markclosure (GCState *st, Closure *cl) { | 83 | static 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 | ||
99 | static 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 | |||
107 | static void markudata (GCState *st, Udata *u) { | 108 | static void markudata (GCState *st, Udata *u) { |
108 | markud(u); | 109 | markud(u); |
109 | marktable(st, u->uv.metatable); | 110 | marktable(st, u->uv.metatable); |