MCPcopy Create free account
hub / github.com/F-Stack/f-stack / luaF_findupval

Function luaF_findupval

freebsd/contrib/openzfs/module/lua/lfunc.c:46–71  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

44
45
46UpVal *luaF_findupval (lua_State *L, StkId level) {
47 global_State *g = G(L);
48 GCObject **pp = &L->openupval;
49 UpVal *p;
50 UpVal *uv;
51 while (*pp != NULL && (p = gco2uv(*pp))->v >= level) {
52 GCObject *o = obj2gco(p);
53 lua_assert(p->v != &p->u.value);
54 lua_assert(!isold(o) || isold(obj2gco(L)));
55 if (p->v == level) { /* found a corresponding upvalue? */
56 if (isdead(g, o)) /* is it dead? */
57 changewhite(o); /* resurrect it */
58 return p;
59 }
60 pp = &p->next;
61 }
62 /* not found: create a new one */
63 uv = &luaC_newobj(L, LUA_TUPVAL, sizeof(UpVal), pp, 0)->uv;
64 uv->v = level; /* current value lives in the stack */
65 uv->u.l.prev = &g->uvhead; /* double link it in `uvhead' list */
66 uv->u.l.next = g->uvhead.u.l.next;
67 uv->u.l.next->u.l.prev = uv;
68 g->uvhead.u.l.next = uv;
69 lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv);
70 return uv;
71}
72
73
74static void unlinkupval (UpVal *uv) {

Callers 1

pushclosureFunction · 0.70

Calls 1

luaC_newobjFunction · 0.85

Tested by

no test coverage detected