LuaJIT,是 Lua 语言的高性能即时编译器,结合了 Lua5.1 的语法和特性,大幅提升了执行效率。LuaJIT 的 JIT 编译器能将 Lua 代码动态编译为机器码,实现接近原生 C/C++ 的运行速度。在项目开发过程中,会有一些需求要对底层的方法做一些修改,实现进一步的性能优化和业务安全。本篇文章记录了修改 LuaJIT 底层方法过程中踩的坑。
1. 问题概述
根据需要,要对 LuaJIT 底层的一些方法做出修改,使设为只读的 table 不可以被修改,因此要对 table.remove
table.insert
等方法做一些改动。但是修改以后发现,使用 table.remove
仍然可以修改 table 中的数据,但是代码本身没有问题,只是检查没有被触发。因此开始排查该问题。
2. 源码分析
考虑到 insert
的修改成功了,但是 remove
的修改没有成功,因此我对比了这两个方法的实现,发现两个方法使用的宏定义不同。table.insert
使用的是 LJLIB_CF
,即 C function ,而table.remove
使用的是LJLIB_LUA
,并且后面的具体实现是被注释掉的。于是去查看了这两个宏究竟被定义成了什么。
1 | LJLIB_CF(table_insert) LJLIB_REC(.) |
可以看到,如下所示,LJLIB_CF
被定义为了一个静态函数,但是 LJLIB_LUA
则是一个空字符,也就是说在编译过程中,这段代码会被替换成空字符串,结合后面代码主体内容是写在注释中的,说明实际编译以后,这段代码根本不生效。
more >>