diff options
-rw-r--r-- | lfunc.c | 14 | ||||
-rw-r--r-- | lfunc.h | 2 | ||||
-rw-r--r-- | lvm.c | 2 |
3 files changed, 10 insertions, 8 deletions
@@ -82,20 +82,22 @@ static UpVal *newupval (lua_State *L, int tbc, StkId level, UpVal **prev) { | |||
82 | 82 | ||
83 | 83 | ||
84 | /* | 84 | /* |
85 | ** Find and reuse, or create if it does not exist, a regular upvalue | 85 | ** Find and reuse, or create if it does not exist, an upvalue |
86 | ** at the given level. | 86 | ** at the given level and set it to the given slot. |
87 | */ | 87 | */ |
88 | UpVal *luaF_findupval (lua_State *L, StkId level) { | 88 | void luaF_setupval (lua_State *L, StkId level, UpVal **slot) { |
89 | UpVal **pp = &L->openupval; | 89 | UpVal **pp = &L->openupval; |
90 | UpVal *p; | 90 | UpVal *p; |
91 | lua_assert(isintwups(L) || L->openupval == NULL); | 91 | lua_assert(isintwups(L) || L->openupval == NULL); |
92 | while ((p = *pp) != NULL && uplevel(p) >= level) { /* search for it */ | 92 | while ((p = *pp) != NULL && uplevel(p) >= level) { /* search for it */ |
93 | *slot = p; | ||
93 | if (uplevel(p) == level && !isdead(G(L), p)) /* corresponding upvalue? */ | 94 | if (uplevel(p) == level && !isdead(G(L), p)) /* corresponding upvalue? */ |
94 | return p; /* return it */ | 95 | return; /* found it */ |
95 | pp = &p->u.open.next; | 96 | pp = &p->u.open.next; |
96 | } | 97 | } |
97 | /* not found: create a new upvalue after 'pp' */ | 98 | /* not found: create a new upvalue after 'pp' (which is |
98 | return newupval(L, 0, level, pp); | 99 | anchored in 'slot', in case of an emergency collection) */ |
100 | *slot = newupval(L, 0, level, pp); | ||
99 | } | 101 | } |
100 | 102 | ||
101 | 103 | ||
@@ -57,7 +57,7 @@ LUAI_FUNC Proto *luaF_newproto (lua_State *L); | |||
57 | LUAI_FUNC CClosure *luaF_newCclosure (lua_State *L, int nelems); | 57 | LUAI_FUNC CClosure *luaF_newCclosure (lua_State *L, int nelems); |
58 | LUAI_FUNC LClosure *luaF_newLclosure (lua_State *L, int nelems); | 58 | LUAI_FUNC LClosure *luaF_newLclosure (lua_State *L, int nelems); |
59 | LUAI_FUNC void luaF_initupvals (lua_State *L, LClosure *cl); | 59 | LUAI_FUNC void luaF_initupvals (lua_State *L, LClosure *cl); |
60 | LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level); | 60 | LUAI_FUNC void luaF_setupval (lua_State *L, StkId level, UpVal **slot); |
61 | LUAI_FUNC void luaF_newtbcupval (lua_State *L, StkId level); | 61 | LUAI_FUNC void luaF_newtbcupval (lua_State *L, StkId level); |
62 | LUAI_FUNC int luaF_close (lua_State *L, StkId level, int status); | 62 | LUAI_FUNC int luaF_close (lua_State *L, StkId level, int status); |
63 | LUAI_FUNC void luaF_unlinkupval (UpVal *uv); | 63 | LUAI_FUNC void luaF_unlinkupval (UpVal *uv); |
@@ -697,7 +697,7 @@ static void pushclosure (lua_State *L, Proto *p, UpVal **encup, StkId base, | |||
697 | setclLvalue2s(L, ra, ncl); /* anchor new closure in stack */ | 697 | setclLvalue2s(L, ra, ncl); /* anchor new closure in stack */ |
698 | for (i = 0; i < nup; i++) { /* fill in its upvalues */ | 698 | for (i = 0; i < nup; i++) { /* fill in its upvalues */ |
699 | if (uv[i].instack) /* upvalue refers to local variable? */ | 699 | if (uv[i].instack) /* upvalue refers to local variable? */ |
700 | ncl->upvals[i] = luaF_findupval(L, base + uv[i].idx); | 700 | luaF_setupval(L, base + uv[i].idx, &ncl->upvals[i]); |
701 | else /* get upvalue from enclosing function */ | 701 | else /* get upvalue from enclosing function */ |
702 | ncl->upvals[i] = encup[uv[i].idx]; | 702 | ncl->upvals[i] = encup[uv[i].idx]; |
703 | luaC_objbarrier(L, ncl, ncl->upvals[i]); | 703 | luaC_objbarrier(L, ncl, ncl->upvals[i]); |