LuaTinker是一套还不错的C++代码和Lua代码的绑定库,作者是韩国人Kwon-il Lee,作者应该是参考了LuaBind后,为了简化和避免过重而实现的。其官网在http://gpgstudy.com/gpgiki/LuaTinker ,但可惜全部是韩文的,而新的代码可以在Git上下载,https://github.com/zupet/LuaTinker 。对比LuaBind,LuaPlus这类库,其实现非常非常非常非常非常轻,大约只有1000多行,至少给了你一个机会,去了解和改写部分功能,所以其在国内也有不少群众基础。而且其轻薄的身材也让剖析一下一个脚本粘合层是如何工作成为了可能。
  但另外一方面LuaTinker的bug数量并不在少数。也有不少同学曾经零散的提出来过。这儿只是做个总结,另外感谢fergzhang同学。很多问题都是他帮忙指出的。
  BUG(错误)
  第一个问题,int64_t 数据的比较是错误的,完全没有考虑符号位的情况嘛。
  static int lt_s64(lua_State *L)
  {
  //完全没有考虑符号位的情况,居然用memcmp
  lua_pushboolean(L, memcmp(lua_topointer(L, 1), lua_topointer(L, 2), sizeof(long long)) < 0);
  return 1;
  }
  第二个问题,在处理类成员的修改函数(__newindex)时,没有考虑要处理父类成员的,而LuaTinker是支持继承的,而且int lua_tinker::meta_get(lua_State *L) (对应__index)也是支持。这应该是作者的一个疏漏。
int lua_tinker::meta_set(lua_State *L)
{
enum_stack(L);
lua_getmetatable(L, 1);
lua_pushvalue(L, 2);
lua_rawget(L, -2);
enum_stack(L);
if (lua_isuserdata(L, -1))
{
user2type<var_base *>::invoke(L, -1)->set(L);
}
else if (lua_isnil(L, -1))
{
//这儿没有调用invoke_parent(L)处理父类的情况
lua_pushvalue(L, 2);
lua_pushvalue(L, 3);
lua_rawset(L, -4);
}
lua_settop(L, 3);
return 0;
}
  第三个bug,使用I64d这种过时的标签,I64d应该是微软很老很老很老的一个格式化字符串标签,而且完全不具备可移植性。应该改为%lld。
  static int tostring_s64(lua_State *L)
  {
  char temp[64];
  sprintf_s(temp, "%I64d", *(long long*)lua_topointer(L, 1));
  lua_pushstring(L, temp);
  return 1;
  }