diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2013-08-26 09:41:10 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2013-08-26 09:41:10 -0300 |
| commit | 742b7377d38e43224ee5dda4bb83a42763c20af8 (patch) | |
| tree | 7caeaa7077ff6414f20646b7cef5308ad5bc2199 /lfunc.c | |
| parent | 50955e27f592441a223c6267956e470f98eeb3c0 (diff) | |
| download | lua-742b7377d38e43224ee5dda4bb83a42763c20af8.tar.gz lua-742b7377d38e43224ee5dda4bb83a42763c20af8.tar.bz2 lua-742b7377d38e43224ee5dda4bb83a42763c20af8.zip | |
Lua closures go to local, too
Diffstat (limited to 'lfunc.c')
| -rw-r--r-- | lfunc.c | 19 |
1 files changed, 14 insertions, 5 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lfunc.c,v 2.33 2013/08/16 18:55:49 roberto Exp roberto $ | 2 | ** $Id: lfunc.c,v 2.34 2013/08/23 13:34:54 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 | */ |
| @@ -29,7 +29,8 @@ Closure *luaF_newCclosure (lua_State *L, int n) { | |||
| 29 | 29 | ||
| 30 | 30 | ||
| 31 | Closure *luaF_newLclosure (lua_State *L, int n) { | 31 | Closure *luaF_newLclosure (lua_State *L, int n) { |
| 32 | Closure *c = &luaC_newobj(L, LUA_TLCL, sizeLclosure(n), NULL, 0)->cl; | 32 | Closure *c = &luaC_newobj(L, LUA_TLCL, sizeLclosure(n), |
| 33 | &G(L)->localgc, 0)->cl; | ||
| 33 | c->l.p = NULL; | 34 | c->l.p = NULL; |
| 34 | c->l.nupvalues = cast_byte(n); | 35 | c->l.nupvalues = cast_byte(n); |
| 35 | while (n--) c->l.upvals[n] = NULL; | 36 | while (n--) c->l.upvals[n] = NULL; |
| @@ -38,7 +39,8 @@ Closure *luaF_newLclosure (lua_State *L, int n) { | |||
| 38 | 39 | ||
| 39 | 40 | ||
| 40 | UpVal *luaF_newupval (lua_State *L) { | 41 | UpVal *luaF_newupval (lua_State *L) { |
| 41 | UpVal *uv = &luaC_newobj(L, LUA_TUPVAL, sizeof(UpVal), NULL, 0)->uv; | 42 | UpVal *uv = &luaC_newobj(L, LUA_TUPVAL, sizeof(UpVal), |
| 43 | &G(L)->localupv, 0)->uv; | ||
| 42 | uv->v = &uv->value; | 44 | uv->v = &uv->value; |
| 43 | setnilvalue(uv->v); | 45 | setnilvalue(uv->v); |
| 44 | return uv; | 46 | return uv; |
| @@ -79,8 +81,15 @@ void luaF_close (lua_State *L, StkId level) { | |||
| 79 | else { | 81 | else { |
| 80 | setobj(L, &uv->value, uv->v); /* move value to upvalue slot */ | 82 | setobj(L, &uv->value, uv->v); /* move value to upvalue slot */ |
| 81 | uv->v = &uv->value; /* now current value lives here */ | 83 | uv->v = &uv->value; /* now current value lives here */ |
| 82 | gch(o)->next = g->allgc; /* link upvalue into 'allgc' list */ | 84 | if (islocal(o)) { |
| 83 | g->allgc = o; | 85 | gch(o)->next = g->localupv; /* link upvalue into 'localupv' list */ |
| 86 | g->localupv = o; | ||
| 87 | resetbit(o->gch.marked, LOCALBLACK); | ||
| 88 | } | ||
| 89 | else { /* link upvalue into 'allgc' list */ | ||
| 90 | gch(o)->next = g->allgc; | ||
| 91 | g->allgc = o; | ||
| 92 | } | ||
| 84 | valnolocal(uv->v); /* keep local invariant */ | 93 | valnolocal(uv->v); /* keep local invariant */ |
| 85 | luaC_checkupvalcolor(g, uv); | 94 | luaC_checkupvalcolor(g, uv); |
| 86 | } | 95 | } |
