** Close all upvalues up to the given stack level. */
| 191 | ** Close all upvalues up to the given stack level. |
| 192 | */ |
| 193 | void luaF_closeupval (lua_State *L, StkId level) { |
| 194 | UpVal *uv; |
| 195 | StkId upl; /* stack index pointed by 'uv' */ |
| 196 | while ((uv = L->openupval) != NULL && (upl = uplevel(uv)) >= level) { |
| 197 | TValue *slot = &uv->u.value; /* new position for value */ |
| 198 | lua_assert(uplevel(uv) < L->top.p); |
| 199 | luaF_unlinkupval(uv); /* remove upvalue from 'openupval' list */ |
| 200 | setobj(L, slot, uv->v.p); /* move value to upvalue slot */ |
| 201 | uv->v.p = slot; /* now current value lives here */ |
| 202 | if (!iswhite(uv)) { /* neither white nor dead? */ |
| 203 | nw2black(uv); /* closed upvalues cannot be gray */ |
| 204 | luaC_barrier(L, uv, slot); |
| 205 | } |
| 206 | } |
| 207 | } |
| 208 | |
| 209 | |
| 210 | /* |
no test coverage detected