summaryrefslogtreecommitdiff
path: root/libs/liblua/src/lapi.c
diff options
context:
space:
mode:
authordartraiden <wowemuh@gmail.com>2020-12-03 22:07:47 +0300
committerdartraiden <wowemuh@gmail.com>2020-12-03 22:11:32 +0300
commitb2a67a796656f20dfae0ecdf7c2870d3ece927b4 (patch)
tree9303169add151612645879732a069b779a0c92ba /libs/liblua/src/lapi.c
parentddade34e808330a64902d55fdbcb496c576599db (diff)
liblua: update to 5.4.2
Diffstat (limited to 'libs/liblua/src/lapi.c')
-rw-r--r--libs/liblua/src/lapi.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/libs/liblua/src/lapi.c b/libs/liblua/src/lapi.c
index 9048245f36..c824da27cb 100644
--- a/libs/liblua/src/lapi.c
+++ b/libs/liblua/src/lapi.c
@@ -1383,13 +1383,16 @@ LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) {
static UpVal **getupvalref (lua_State *L, int fidx, int n, LClosure **pf) {
+ static const UpVal *const nullup = NULL;
LClosure *f;
TValue *fi = index2value(L, fidx);
api_check(L, ttisLclosure(fi), "Lua function expected");
f = clLvalue(fi);
- api_check(L, (1 <= n && n <= f->p->sizeupvalues), "invalid upvalue index");
if (pf) *pf = f;
- return &f->upvals[n - 1]; /* get its upvalue pointer */
+ if (1 <= n && n <= f->p->sizeupvalues)
+ return &f->upvals[n - 1]; /* get its upvalue pointer */
+ else
+ return (UpVal**)&nullup;
}
@@ -1401,11 +1404,14 @@ LUA_API void *lua_upvalueid (lua_State *L, int fidx, int n) {
}
case LUA_VCCL: { /* C closure */
CClosure *f = clCvalue(fi);
- api_check(L, 1 <= n && n <= f->nupvalues, "invalid upvalue index");
- return &f->upvalue[n - 1];
- }
+ if (1 <= n && n <= f->nupvalues)
+ return &f->upvalue[n - 1];
+ /* else */
+ } /* FALLTHROUGH */
+ case LUA_VLCF:
+ return NULL; /* light C functions have no upvalues */
default: {
- api_check(L, 0, "closure expected");
+ api_check(L, 0, "function expected");
return NULL;
}
}
@@ -1417,6 +1423,7 @@ LUA_API void lua_upvaluejoin (lua_State *L, int fidx1, int n1,
LClosure *f1;
UpVal **up1 = getupvalref(L, fidx1, n1, &f1);
UpVal **up2 = getupvalref(L, fidx2, n2, NULL);
+ api_check(L, *up1 != NULL && *up2 != NULL, "invalid upvalue index");
*up1 = *up2;
luaC_objbarrier(L, f1, *up1);
}