diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2013-12-13 13:17:00 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2013-12-13 13:17:00 -0200 |
| commit | c8585efc7807b3cfeb1622a73f48a285ea4da5e5 (patch) | |
| tree | 8d77d69d97c92d8ec3aff7264997a4f9abf13827 | |
| parent | 16493b777f1412beffc5b6640f27ea6c13bcb7d7 (diff) | |
| download | lua-c8585efc7807b3cfeb1622a73f48a285ea4da5e5.tar.gz lua-c8585efc7807b3cfeb1622a73f48a285ea4da5e5.tar.bz2 lua-c8585efc7807b3cfeb1622a73f48a285ea4da5e5.zip | |
use goto to implement a tail call in 'reallymarkobject'
| -rw-r--r-- | lgc.c | 13 |
1 files changed, 9 insertions, 4 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lgc.c,v 2.165 2013/09/13 16:21:52 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 2.166 2013/09/17 15:40:06 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 | */ |
| @@ -227,6 +227,7 @@ GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) { | |||
| 227 | */ | 227 | */ |
| 228 | static void reallymarkobject (global_State *g, GCObject *o) { | 228 | static void reallymarkobject (global_State *g, GCObject *o) { |
| 229 | lu_mem size; | 229 | lu_mem size; |
| 230 | reentry: | ||
| 230 | white2gray(o); | 231 | white2gray(o); |
| 231 | switch (gch(o)->tt) { | 232 | switch (gch(o)->tt) { |
| 232 | case LUA_TSHRSTR: | 233 | case LUA_TSHRSTR: |
| @@ -237,9 +238,13 @@ static void reallymarkobject (global_State *g, GCObject *o) { | |||
| 237 | case LUA_TUSERDATA: { | 238 | case LUA_TUSERDATA: { |
| 238 | Table *mt = gco2u(o)->metatable; | 239 | Table *mt = gco2u(o)->metatable; |
| 239 | markobject(g, mt); | 240 | markobject(g, mt); |
| 240 | markobject(g, gco2u(o)->env); | 241 | gray2black(o); |
| 241 | size = sizeudata(gco2u(o)); | 242 | g->GCmemtrav += sizeudata(gco2u(o)); |
| 242 | break; | 243 | /* markobject(g, gco2u(o)->env); */ |
| 244 | o = obj2gco(gco2u(o)->env); | ||
| 245 | if (o && iswhite(o)) | ||
| 246 | goto reentry; | ||
| 247 | return; | ||
| 243 | } | 248 | } |
| 244 | case LUA_TLCL: { | 249 | case LUA_TLCL: { |
| 245 | gco2lcl(o)->gclist = g->gray; | 250 | gco2lcl(o)->gclist = g->gray; |
