diff options
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 | } |