文章目录

之前一直有朋友希望让eluna支持一下lua5.3,其实不修改的话eluna本身也是可以用在lua5.3上的,只是在整型上面的支持不友好,尤其是64位整型会丢失精度。虽然能用,但确实不友好,所以决定对eluna做一下对lua5.3的升级。

这次改动主要有两方面,一方面是升级了整型交互接口,让eluna在使用lua5.3时对整型兼容更好,尤其是对64位整型将完全支持。eluna在lua5.1和5.2下因为是使用lua_Number来保存的64位整型,所以最大只能支持-2^53~2^53范围内的整型,这是由double型52位尾数和默认的一位整数1决定的,如果要保存的整型超过这个范围,将丢失精度,而lua5.3中增加了对整型的友好支持,lua_Integer变成了64位的整型,所以直接使用lua_Integer就不会再有精度丢失这个问题了。

当然因为lua5.3对lua_Integer和lua_Number的严格区分,也出现了一个新问题:类型转换。比如之前在使用lua5.2,5.1时向一个int参数传小数时,这个小数会被转成整数,而在5.3中用lua_tointeger转换小数会报错,除非你传的小数位是0,如1.0。当然我们可以先用lua_isinteger判断参数是否为整型,再决定是调用lua_tointeger还是lua_tonumber转换,这样就能够兼容以前的行为将小数转换成整数,但问题是这又会让64位的数值转换丢失精度,而且与lua5.3数值型严格区分的思想也相悖,所以我最终没有选择这种方案,因此使用者需要自己将小数转成整数再传进来。

1
2
3
// cpp中的函数
void foo(int a) {
}
1
2
-- lua中调用
foo(4/3) -- lua5.3中将报错,5.2,5.1正常
1
foo(math.tointeger(4/3)) -- lua5.3中需要转成整型

如果你希望兼容这种小数到整数的强制转换,可以自行修改一下read2cpp的代码,很简单。

除此之外还做了类型校验的优化,以前eluna在与lua交互时对传入cpp的参数类型验证并不严格,当所传的参数类型错误时并没有给出友好的提示,因此这次针对这个问题做了优化。新版本的eluna在接受到错误类型的参数时会给出提示,让使用者更好的分析错误原因,避免一些隐蔽的错误。

文章目录