tolua#中的int64与pbc

目前我们的项目中使用的是tolua# + 云风的pbc库解决方案。

lua5.3已经原生的支持int64,但我们使用的是lua5.1版本,好在tolua#内置了对int64的支持,其源码位于tolua#的int64.c中。通过源码可以发现,tolua#将int64当作一个userdata来对待:
tolua#中的int64与pbc_第1张图片
尽管很好,但是和pbc库一起使用时就会产生问题,因为pbc库将int64当作number来对待。这里给出3个我想到的解决方案,如果有更好的,希望不吝赐教。
  • 通过修改tolua#的C#层代码,让int64仍然以number的方式与lua交互。这也是我采用的一种方式,因为我们的项目已经开发到中后期,因此大批量修改的方式不适合我们,也容易造成不稳定。

    在ToLuaExport.cs文件的ProcessArg函数中,我们注释掉对int64的特殊处理:
    tolua#中的int64与pbc_第2张图片
    同样在ToLuaExport.cs文件的GenPushStr函数中,注释掉对int64的特殊处理:
    tolua#中的int64与pbc_第3张图片
  • 云风在他的pbc库中集成了他自己对于int64的处理,详情可见博客:http://blog.codingnow.com/2012/04/lua_int64.html。他将int64作为lightuserdata来对待。我们可以在编译tolua#时,使用该int64.c(https://github.com/cloudwu/lua-int64)来替换tolua#中的int64.c,从而达到和pbc库的一致性。缺点在于云风使用的方式由于实际在内存存储的是一个64bit的指针,因此只支持64位平台,不支持32位平台。

  • 通过自己的实现将tolua#中的int64在lua中从userdata转换到number。这里选择通过实现lua中的“#”运算符。在tolua#的int64.c文件中,添加如下代码:

static int _int64len(lua_State* L)
{
    int64_t n = tolua_checkint64(L, 1);
    lua_pushnumber(L, (lua_Number)n);
    return 1;
}

该方法将int64转换为number。接着,为了让“#”运算符可以调用到该方法,在tolua_openint64函数中添加如下代码:

lua_pushstring(L, "__len");
lua_pushcfunction(L, _int64len);
lua_rawset(L, -3);

这样就完成了,在lua中我们就可以这样使用:

-- proto
message XXX
{
    optional int64 roleid = 1;
}

-- player.roleid是来自C#的int64对象
msg = { roleid = #player.roleid }

本文固定链接: http://www.jianshu.com/p/6ac5b84ec267?utm_campaign=hugo&utm_medium=reader_share&utm_content=note
转载请注明: EnigmaJJ 2017年07月28日 于 发表

你可能感兴趣的:(tolua#中的int64与pbc)