Lua `lua_touserdata` 函数源码解析及 `ttype` 函数详解
以下是 lua_touserdata 函数的源代码:
void *lua_touserdata (lua_State *L, int idx) {
TValue *o = index2addr(L, idx);
if (ttislightuserdata(o) || ttisfulluserdata(o))
return getudatamem(o);
else
return NULL;
}
该函数用于获取 Lua 栈上指定位置的值,如果该值是一个 userdata 类型的值,则将其转换为一个 void* 指针返回。如果该值不是一个 userdata 类型的值,则返回 NULL。
下面是 ttype() 函数的解析:
ttype() 函数是一个宏定义,定义如下:
#define ttype(o) (ttnov(o) & 0x3F)
该宏实际上是对 TValue 类型值的类型信息的获取。在 Lua 中,TValue 类型值的类型信息保存在其 tt 字段中。tt 字段是一个 8 位的无符号整数,其中高 2 位用于表示值的颜色(白色、灰色或黑色),低 6 位用于表示值的类型信息。在 ttype() 函数中,通过将 TValue 类型值的 tt 字段与 0x3F 按位与操作,获取该值的类型信息。0x3F 的二进制表示是 00111111,按位与操作可以将 TValue 类型值的 tt 字段的高 2 位清零,只保留低 6 位的类型信息。最终,ttype() 函数返回的值是一个整数,表示 TValue 类型值的类型信息。
原文地址: https://www.cveoy.top/t/topic/oYCC 著作权归作者所有。请勿转载和采集!