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]); |
