luajit 使用云风的int64库 负数 bad light userdata pointer

来源:互联网 发布:软件开发和互联网 编辑:程序博客网 时间:2024/06/05 05:15

先下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);}


由代码分析出  void *p  是不完全支持64位指针的,checklightudptr 判断就说明了,  (((uint64_t)(p) >> 47) ? (lj_err_msg(L, LJ_ERR_BADLU), NULL) : (p)) 

大于47位的就被判断为bad light userdata pointer 我没有深入分析过源码。也不知道为什么要做判断。


所以暂时不能用这种处理方式来处理负数的问题

                                             
0 0