Lua touderdata 函数解析:获取 Userdata 数据指针
以下是 lua_touserdata 函数的源代码:
void *lua_touserdata(lua_State *L, int idx) {
const TValue *o = index2addr(L, idx);
switch (ttype(o)) {
case LUA_TUSERDATA: return getudatamem(uvalue(o));
case LUA_TLIGHTUSERDATA: return pvalue(o);
default: return NULL;
}
}
该函数的作用是从栈中获取指定索引处的 Userdata 类型的值,并返回其对应的数据指针。如果栈中该索引处的值不是 Userdata 类型,则返回 NULL。
在函数内部,首先通过调用 index2addr 函数获取指定索引处的值的地址,并将其保存在 o 变量中。然后通过 switch 语句判断 o 所指向的值的类型。如果类型是 LUA_TUSERDATA,则调用 getudatamem 函数获取其对应的数据指针,并返回。如果类型是 LUA_TLIGHTUSERDATA,则直接返回其指向的数据指针。如果类型不是 Userdata 类型,则返回 NULL。
getudatamem 函数是用于获取 Userdata 类型值对应的数据指针的函数。其源代码如下:
void *getudatamem(const Udata *u) {
return (void *)(u + 1);
}
该函数的实现非常简单,它接收一个 Udata 类型的指针 u,并返回 u + 1 所指向的地址。由于 Udata 类型的结构体中第一个元素是一个 GCObject 类型的成员,因此 u + 1 即为 Userdata 类型值所对应的数据指针。
原文地址: https://www.cveoy.top/t/topic/oYB7 著作权归作者所有。请勿转载和采集!