先下Luajit 代码
#define LJ_TLIGHTUD (~3u)
#if LJ_64 #define checklightudptr(L, p) \ (((uint64_t)(p) >> 47) ? (lj_err_msg(L, LJ_ERR_BADLU), NULL) : (p)) #else #define checklightudptr(L, p) (p) #endif
static LJ_AINLINE void setlightudV(TValue *o, void *p) { #if LJ_GC64 o->u64 = (uint64_t)p | (((uint64_t)LJ_TLIGHTUD) << 47); #elif LJ_64 o->u64 = (uint64_t)p | (((uint64_t)0xffff) << 48); #else setgcrefp(o->gcr, p); setitype(o, LJ_TLIGHTUD); #endif }
LUA_API void lua_pushlightuserdata(lua_State *L, void *p) { setlightudV(L->top, checklightudptr(L, p)); incr_top(L); }
大于47位的就被判断为bad light userdata pointer 我没有深入分析过源码。也不知道为什么要做判断。
所以暂时不能用这种处理方式来处理负数的问题