以下是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类型值所对应的数据指针

lua_touserdata函数源代码并解析一下getudatamem

原文地址: http://www.cveoy.top/t/topic/hvLP 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录