28 GCObject *o = luaC_newobj(L, LUA_VCCL, sizeCclosure(nupvals));
30 c->nupvalues = cast_byte(nupvals);
36 GCObject *o = luaC_newobj(L, LUA_VLCL, sizeLclosure(nupvals));
39 c->nupvalues = cast_byte(nupvals);
40 while (nupvals--) c->upvals[nupvals] = NULL;
50 for (i = 0; i < cl->nupvalues; i++) {
52 UpVal *uv = gco2upv(o);
53 uv->v.p = &uv->u.value;
56 luaC_objbarrier(L, cl, uv);
67 UpVal *uv = gco2upv(o);
70 uv->u.open.next = next;
71 uv->u.open.previous = prev;
73 next->u.open.previous = &uv->u.open.next;
76 L->twups = G(L)->twups;
88 UpVal **pp = &L->openupval;
90 lua_assert(isintwups(L) || L->openupval == NULL);
91 while ((p = *pp) != NULL && uplevel(p) >= level) {
92 lua_assert(!isdead(G(L), p));
93 if (uplevel(p) == level)
98 return newupval(L, level, pp);
108 StkId top = L->top.p;
109 const TValue *tm = luaT_gettmbyobj(L, obj, TM_CLOSE);
110 setobj2s(L, top, tm);
111 setobj2s(L, top + 1, obj);
112 setobj2s(L, top + 2, err);
115 luaD_call(L, top, 0);
117 luaD_callnoyield(L, top, 0);
125static void checkclosemth (
lua_State *L, StkId level) {
126 const TValue *tm = luaT_gettmbyobj(L, s2v(level), TM_CLOSE);
128 int idx = cast_int(level - L->ci->func.p);
129 const char *vname = luaG_findlocal(L, L->ci, idx, NULL);
130 if (vname == NULL) vname =
"?";
131 luaG_runerror(L,
"variable '%s' got a non-closable value", vname);
143static void prepcallclosemth (
lua_State *L, StkId level,
int status,
int yy) {
146 if (status == CLOSEKTOP)
147 errobj = &G(L)->nilvalue;
149 errobj = s2v(level + 1);
150 luaD_seterrorobj(L, status, level + 1);
152 callclosemethod(L, uv, errobj, yy);
162 ((256ul << ((sizeof(L->stack.p->tbclist.delta) - 1) * 8)) - 1)
168void luaF_newtbcupval (
lua_State *L, StkId level) {
169 lua_assert(level > L->tbclist.p);
170 if (l_isfalse(s2v(level)))
172 checkclosemth(L, level);
173 while (cast_uint(level - L->tbclist.p) > MAXDELTA) {
174 L->tbclist.p += MAXDELTA;
175 L->tbclist.p->tbclist.delta = 0;
177 level->tbclist.delta = cast(
unsigned short, level - L->tbclist.p);
178 L->tbclist.p = level;
182void luaF_unlinkupval (
UpVal *uv) {
183 lua_assert(upisopen(uv));
184 *uv->u.open.previous = uv->u.open.next;
186 uv->u.open.next->u.open.previous = uv->u.open.previous;
193void luaF_closeupval (
lua_State *L, StkId level) {
196 while ((uv = L->openupval) != NULL && (upl = uplevel(uv)) >= level) {
197 TValue *slot = &uv->u.value;
198 lua_assert(uplevel(uv) < L->top.p);
199 luaF_unlinkupval(uv);
200 setobj(L, slot, uv->v.p);
204 luaC_barrier(L, uv, slot);
214 StkId tbc = L->tbclist.p;
215 lua_assert(tbc->tbclist.delta > 0);
216 tbc -= tbc->tbclist.delta;
217 while (tbc > L->stack.p && tbc->tbclist.delta == 0)
227StkId luaF_close (
lua_State *L, StkId level,
int status,
int yy) {
228 ptrdiff_t levelrel = savestack(L, level);
229 luaF_closeupval(L, level);
230 while (L->tbclist.p >= level) {
231 StkId tbc = L->tbclist.p;
233 prepcallclosemth(L, tbc, status, yy);
234 level = restorestack(L, levelrel);
251 f->abslineinfo = NULL;
252 f->sizeabslineinfo = 0;
261 f->lastlinedefined = 0;
268 luaM_freearray(L, f->code, f->sizecode);
269 luaM_freearray(L, f->p, f->sizep);
270 luaM_freearray(L, f->k, f->sizek);
271 luaM_freearray(L, f->lineinfo, f->sizelineinfo);
272 luaM_freearray(L, f->abslineinfo, f->sizeabslineinfo);
273 luaM_freearray(L, f->locvars, f->sizelocvars);
274 luaM_freearray(L, f->upvalues, f->sizeupvalues);
283const char *luaF_getlocalname (
const Proto *f,
int local_number,
int pc) {
285 for (i = 0; i<f->sizelocvars && f->locvars[i].startpc <= pc; i++) {
286 if (pc < f->locvars[i].endpc) {
288 if (local_number == 0)
289 return getstr(f->locvars[i].varname);