LuaJIT

源码剖析 编译 词法分析+语法分析+字节码生成 Lua这三个阶段不是分开进行的,一个statement先进行词法分析( lex_scan )得到当前LexToken,然后根据当前LexToken和前置LexToken进行语法分析和字节码生成,这两步是同时进行的。所以语法分析一部分(例如函数的参数)代码的同时会将该部分的机器码emit到寄存器,不是语法分析一整个statment结束之后再统一emit字节码。 注释及长注释在词法分析( lex_scan )获得LexToken时跳过的。 需求:屏蔽print函数调用 屏蔽程序代码中的print函数调用,想到了四个方案: 在静态代码检查时做一个print函数的检测,如果发现有print函数调用,则自动开单给责任人处理。 未采用原因:感觉这个方案治标不治本,而且开单给别人处理比较麻烦。 在词法分析时,如果检测到TK_name的值是"print",做一个词法分析的特殊逻辑,将整个函数调用的LexToken跳过。 未采用原因:该方案要对所有的TK_name进行 memcmp ,不太合理。而且分析函数调用的LexToken范围,属于语法分析的逻辑, 不应该在词法分析阶段做。 在语法分析+字节码生成时,在 parse_call_assign 中如果检测到函数调用的函数名是"print",将 expr_primary 替换成新写的语法分析逻辑,只保留语法分析部分,不生成函数调用的字节码。 未采用原因:由于LuaJIT的 parse_call_assign 源码实现,该方案需要修改主表达式解析 expr_primary 以及将函数调用是否为"print"的结果从 expr_primary 透传到 parse_call_assign 进行相关字节码处理,改变了luaJIT现有的函数定义、代码结构的一贯性。又考虑到保留 print() 的字节码性能影响很小,因此没有采用该方方案。 在语法分析+字节码生成时,如果检测到函数调用的函数名是"print",将 parse_args 替换成新写的语法分析逻辑,只保留语法分析部分,不生成参数的字节码(即最终 print(...) 生成的字节码实际上是函数 print() )。 ...