`

Lua5.1代码阅读(三):lcode.h/lcode.c

 
阅读更多

 

Lua5.1代码阅读(三):lcode.h/lcode.c

 

(未完成,待修改)

 

一、概述

lcode.h/lcode.c是Lua的代码生成器,

用于优化和生成目标二进制代码。

lcode.c的所有导出函数只被lparser.c引用。

lcode内部的函数引用图如下:


 

二、宏

1. #define NO_JUMP (-1)

2. #define getcode(fs,e) ((fs)->f->code[(e)->u.s.info])

3. #define luaK_codeAsBx(fs,o,A,sBx) luaK_codeABx(fs,o,A,(sBx)+MAXARG_sBx)

4. #define luaK_setmultret(fs,e) luaK_setreturns(fs, e, LUA_MULTRET)

5. #define lcode_c

6. #define LUA_CORE

7. #define hasjumps(e) ((e)->t != (e)->f)

 

三、枚举值

1. typedef enum BinOpr {

 OPR_ADD, OPR_SUB, OPR_MUL, OPR_DIV, OPR_MOD, OPR_POW,

 OPR_CONCAT,

 OPR_NE, OPR_EQ,

 OPR_LT, OPR_LE, OPR_GT, OPR_GE,

 OPR_AND, OPR_OR,

 OPR_NOBINOPR

} BinOpr;

2. typedef enum UnOpr { OPR_MINUS, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr;

 

四、私有静态函数

1. static int isnumeral(expdesc *e) {

2. static int condjump (FuncState *fs, OpCode op, int A, int B, int C) {

3. static void fixjump (FuncState *fs, int pc, int dest) {

4. static int getjump (FuncState *fs, int pc) {

5. static Instruction *getjumpcontrol (FuncState *fs, int pc) {

6. static int need_value (FuncState *fs, int list) {

7. static int patchtestreg (FuncState *fs, int node, int reg) {

8. static void removevalues (FuncState *fs, int list) {

9. static void patchlistaux (FuncState *fs, int list, int vtarget, int reg, int dtarget) {

10. static void dischargejpc (FuncState *fs) {

11. static void freereg (FuncState *fs, int reg) {

12. static void freeexp (FuncState *fs, expdesc *e) {

13. static int addk (FuncState *fs, TValue *k, TValue *v) {

14. static int boolK (FuncState *fs, int b) {

15. static int nilK (FuncState *fs) {

16. static int code_label (FuncState *fs, int A, int b, int jump) {

17. static void discharge2reg (FuncState *fs, expdesc *e, int reg) {

18. static void discharge2anyreg (FuncState *fs, expdesc *e) {

19. static void exp2reg (FuncState *fs, expdesc *e, int reg) {

20. static void invertjump (FuncState *fs, expdesc *e) {

21. static int jumponcond (FuncState *fs, expdesc *e, int cond) {

22. static void luaK_goiffalse (FuncState *fs, expdesc *e) {

23. static void codenot (FuncState *fs, expdesc *e) {

24. static int constfolding (OpCode op, expdesc *e1, expdesc *e2) {

25. static void codearith (FuncState *fs, OpCode op, expdesc *e1, expdesc *e2) {

26. static void codecomp (FuncState *fs, OpCode op, int cond, expdesc *e1, expdesc *e2) {

27. static int luaK_code (FuncState *fs, Instruction i, int line) {

 

五、公共全局函数

1. void luaK_nil (FuncState *fs, int from, int n) {

2. int luaK_jump (FuncState *fs) {

3. void luaK_ret (FuncState *fs, int first, int nret) {

4. int luaK_getlabel (FuncState *fs) {

5. void luaK_patchlist (FuncState *fs, int list, int target) {

6. void luaK_patchtohere (FuncState *fs, int list) {

7. void luaK_concat (FuncState *fs, int *l1, int l2) {

8. void luaK_checkstack (FuncState *fs, int n) {

9. void luaK_reserveregs (FuncState *fs, int n) {

10. int luaK_stringK (FuncState *fs, TString *s) {

11. int luaK_numberK (FuncState *fs, lua_Number r) {

12. void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) {

13. void luaK_setoneret (FuncState *fs, expdesc *e) {

14. void luaK_dischargevars (FuncState *fs, expdesc *e) {

15. void luaK_exp2nextreg (FuncState *fs, expdesc *e) {

16. int luaK_exp2anyreg (FuncState *fs, expdesc *e) {

17. void luaK_exp2val (FuncState *fs, expdesc *e) {

18. int luaK_exp2RK (FuncState *fs, expdesc *e) {

19. void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) {

20. void luaK_self (FuncState *fs, expdesc *e, expdesc *key) {

21. void luaK_goiftrue (FuncState *fs, expdesc *e) {

22. void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) {

23. void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e) {

24. void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) {

25. void luaK_posfix (FuncState *fs, BinOpr op, expdesc *e1, expdesc *e2) {

26. void luaK_fixline (FuncState *fs, int line) {

27. int luaK_codeABC (FuncState *fs, OpCode o, int a, int b, int c) {

28. int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) {

29. void luaK_setlist (FuncState *fs, int base, int nelems, int tostore) {

 

六、值得观察的代码

1. luaK_code

可以在此处设置断点,

观察Lua编译器是何时生成Instruction代码,

以及如何将其保存到Proto(函数原型)结构体的code数组中。

2. TODO:

大多数公共全局函数或全局宏(luaK_*)都有生成OP_*指令的能力。

 

(未完成,待修改)


  • 大小: 278.3 KB
分享到:
评论

相关推荐

    lua-utf8.zip

    a utf-8 support module for Lua and LuaJIT 源码地址:https://github.com/starwing/luautf8 编译后可用的库: Linux版:lua-utf8.so Windows版:lua-utf8.dll(若是用在openresty中,openresty版本需使用32位版本...

    luadec解密工具 包含了5.1、5.2、5.3版本的 luareplace.exe/ luaopswap.exe/ luadec.exe/ lua.exe

    ├─5.1 │ └─bin │ liblua51.lib │ lua.exe │ lua51.dll │ lua51.lib │ luac.exe │ luadec.exe │ luaopswap.exe │ luareplace.exe │ ├─5.2 │ └─bin │ liblua52.lib │ lua.exe │ lua52.dll │ ...

    lua5.1 cjson.dll模块

    cjson.dll 需要lua5.1.dll 调用require “cjson” cjson.dll 需要lua5.1.dll 调用require “cjson”

    Lua5.1.5-lib库

    1. **lua.h**: 这是Lua C API的头文件,定义了所有与C语言交互的函数和数据结构。 2. **lua.c/lua.o**: Lua的主解析器和虚拟机实现,编译后的对象文件或静态库。 3. **lapi.c/lapi.o**: 实现了Lua与C之间的接口,...

    Lua5.1全三套:Lua Programming(中英文版)+中文手册

    本文将详细解析"Lua5.1全三套:Lua Programming(中英文版)+中文手册"中包含的知识点。 首先,我们有《Lua Programming》第二版的中文版和英文版。这本书由Mario J. Silva、Luiz Henrique de Figueiredo和Roberto ...

    lua5.1基础环境包(LuaForWindows_v5.1.5-52及mingw).zip

    总结来说,这个压缩包为Windows用户提供了完整的Lua 5.1开发环境,包括解释器、调试工具以及用于编译C扩展的MinGW。通过这个环境,开发者能够快速入门并深入掌握Lua编程,利用其强大的功能来解决各种问题。

    FairyGUI生成lua代码插件.rar

    FairyGUI生成lua代码插件 导入到FairyGUI编辑器,可以为UI生成lua代码。 Git路径: https://github.com/qufangliu/Plugin_FairyGUI_Lua

    lua-5.1.5-Win64-bin (exe)程序

    2. **luac5.1.exe**:这是Lua的编译器,它可以将Lua源代码转换为预编译的字节码,这种字节码可以直接由Lua虚拟机执行,提高了加载速度。这对于大型应用或者需要快速启动的环境尤其有用。 3. **bin2c5.1.exe**:这是...

    在线编码环境Praxis.zip

    Praxis 是基于 Lua,Lisp 和 Forth 的在线编码环境。 特性 OpenGL 实时音频生成 Midi 立体引擎 可编程的文本编辑器 等等 Introduction: https://www.youtube.com/watch?v=1VRtRazMYSA Running the ...

    ZeroBraneStudio1.9和lua脚本测试代码

    ZeroBrane Studio是一个免费、开源、跨平台(Windows、MacOSX和Linux)的Lua集成开发环境(IDE),它提供了代码提示、远程调试、代码分析、语法高亮等功能,支持Lua 5.1、Lua 5.2、Lua 5.3、LuaJIT和其他Lua引擎1。

    Lua-5.1.5-部分源码注释.rar

    1. **API接口(lapi.c)**:这部分代码定义了Lua与C语言交互的接口,包括创建和销毁lua_State,调用lua_pcall,注册C函数到全局环境等操作。 2. **编译器(lcode.c, llex.c, lparser.c)**:Lua的编译器将源代码转换为...

    lua5.1.lib

    lua5.1.lib文件缺失,LNK1181

    lua-nginx-module-0.10.9rc7

    例如,使用`lua_code_cache on|off`来控制Lua代码缓存策略,用`set_by_lua_file`或`access_by_lua_file`等指令执行Lua脚本。 4. **测试与启动**:在修改配置后,务必先运行`nginx -t`测试配置文件的正确性,无误后...

    lua5.1 +luarocks for windows64安装版

    Lua 5.1是Lua语言的一个版本,发布于2006年,它提供了强大的数据结构,如表(tables),支持动态类型的面向对象编程,以及灵活的接口机制,使它能够方便地与各种C/C++程序进行交互。这个版本相对于更早期或更晚期的...

    Cocos2d-x之C++和Lua通信5个入门Demo

    木头Cocos2d-x教程 Lua篇 Demo源代码。 教程地址: 第1章:http://blog.csdn.net/musicvs/article/details/8440707 第2章:http://blog.csdn.net/musicvs/article/details/8440919 第3章:...

    lua5.1静态库

    源代码通常包含`.c`和`.h`文件,`.c`文件是实现函数和数据结构的C语言代码,`.h`文件则定义了头文件,包含对外接口声明。这对于理解Lua的内部工作原理以及根据特定需求定制功能非常有用。 "编译 lua5.1"标签指示了...

    lua源码下载 Lua-5.3.4 源码 最新 截止2017-3-7

    3. **lualib.h** 和 **luac.h**: 分别包含了标准库和编译器的接口。 4. **lstate.h**: 描述了lua_State结构,它是Lua执行环境的核心,保存了所有运行时信息。 5. **lparser.h** 和 **llex.h**: 用于解析Lua源代码...

    lua5.1压缩包源文件

    其中,`lua.c` 和 `luac.c` 分别是 Lua 解释器和编译器的主要实现。通过阅读这些源码,你可以了解到 Lua 如何解析和执行代码。 2. `lualib/`:这个目录包含了 Lua 标准库的源代码,如数学运算、字符串处理、文件I/O...

    c#调用脚本语言Lua——简单Demo

    c#调用脚本语言Lua——简单Demo 配置: 1. 下载c#下的Lua支持类库。下载地址:http://files.luaforge.net/releases/luainterface/luainterface/2.0.3 将(lua51.dll\LuaInterface.dll)引用自己的项目中。 2. 修改...

    windows下使用的luac 基于5.1版本

    《Windows环境下基于5.1版本的LuaC使用详解》 LuaC是一款用于编译Lua脚本的工具,它将源代码转换成预编译的字节码,以便于提高程序的加载速度和安全性。在Windows操作系统中,Luac 5.1版本是广泛使用的版本,与lua...

Global site tag (gtag.js) - Google Analytics