下面的补丁只是用来学习代码,无任何实际用途。
--------------------------------------
1. 替换LUAI_THROW和LUAI_TRY:
使用特定于Windows的__try和__except扩展关键词(见msdn),
用Access Violation(地址违例)来模拟抛异常,
替换原有的setjmp和longjmp实现。
/* default handling with long jumps */ #if 0 #define LUAI_THROW(L,c) longjmp((c)->b, 1) #define LUAI_TRY(L,c,a) if (setjmp((c)->b) == 0) { a } #define luai_jmpbuf jmp_buf #else //新增,用于测试try //http://blog.csdn.net/vblittleboy/article/details/6561868 #define LUAI_THROW(L,c) do { unsigned char *p = (unsigned char *)(0x0); *p = 0; } while(0) //EXCEPTION_EXECUTE_HANDLER #include <stdio.h> #define LUAI_TRY(L,c,a) __try { a } __except(1) \ {fprintf(stderr, "Got __except!\n"); if ((c)->status == 0) (c)->status = -1;} #define luai_jmpbuf int #endif
运行结果:
> a=a..1
Got __except!
stdin:1: attempt to concatenate global 'a' (a nil value)
stack traceback:
stdin:1: in main chunk
[C]: ?
>
--------------------------------------
2. 打印当前虚拟机需要执行的pc指令数组
用于控制台交互模式的指令测试(对照其它lua虚拟机实现)
void luaV_execute (lua_State *L, int nexeccalls) { LClosure *cl; StkId base; TValue *k; const Instruction *pc; reentry: /* entry point */ lua_assert(isLua(L->ci)); pc = L->savedpc; cl = &clvalue(L->ci->func)->l; base = L->base; k = cl->p->k; { const int *mypc; int i = 0; for(mypc = pc; *mypc && i < cl->p->sizecode; i++, mypc++) { printf("Instruction[%d]=%d,OP=%d,A=%d,B=%d,C=%d,Bx=%d,sBx=%d\n", i, *mypc, GET_OPCODE(*mypc), GETARG_A(*mypc), GETARG_B(*mypc), GETARG_C(*mypc), GETARG_Bx(*mypc), GETARG_sBx(*mypc)); } }
运行结果:
> print("hello")
Instruction[0]=5,OP=5,A=0,B=0,C=0,Bx=0,sBx=-131071
Instruction[1]=16449,OP=1,A=1,B=0,C=1,Bx=1,sBx=-131070
Instruction[2]=16793628,OP=28,A=0,B=2,C=1,Bx=1025,sBx=-130046
Instruction[3]=8388638,OP=30,A=0,B=1,C=0,Bx=512,sBx=-130559
hello
>
查看OP码最简单的方法是直接用luac看指令
(Windows下用Ctrl+Z结束stdin输入)
print("hello")
^Z
main <stdin:0,0> (4 instructions, 16 bytes at 00383270)
0+ params, 2 slots, 0 upvalues, 0 locals, 2 constants, 0 functions
1 [1] GETGLOBAL 0 -1 ; print
2 [1] LOADK 1 -2 ; "hello"
3 [1] CALL 0 2 1
4 [1] RETURN 0 1
3. luadec使用
如果用luadec反编译时崩溃,可尝试加些额外的参数:
luadec -l guess_local -l2 LDS2 luac.out > out.txt
还有一个用lua实现的lua反编译器(功能类似luac的反编译,指令级,但稍微详细点):
chunkspy:
http://luaforge.net/projects/chunkspy/
还有一个是用perl写的(应该也是基于指令级的)
luadisam
http://bbs.luaer.cn/read-Lua-tid-990.html
http://code.google.com/p/mimon-tools/source/browse/trunk/lua/luadisasm?r=12
4. 类C改造
(20150529)
luaの構文はいけてないので C言語ぽくしよう
https://github.com/rti7743/rtilabs/tree/master/files/asobiba/lua
相关推荐
其中,table是Lua的通用数据结构,可以用来表示数组、集合、记录等。nil是唯一的特殊值,用于表示变量未赋值或值不存在。 3. **控制结构**:Lua提供了if...then...else、while、repeat...until和for循环等控制结构...
6. **字符串处理**:Lua中的字符串是不可变的,这意味着每次修改都会创建新的字符串对象,但这并不影响其在处理文本时的效率。 7. **标准库**:Lua的标准库提供了许多实用功能,包括基本的数学运算、文件I/O、字符...
3. 脚本修改:检查并修改所有使用旧版Lua语法的脚本,以适应5.3的新特性。 4. 单元测试:运行所有脚本的单元测试,确保升级后功能的正确性。 四、新特性实战 1. 利用新的数字类型进行更高效的计算,例如在游戏...
安装完成后,确保LUA的安装路径被正确记录,例如在这个例子中,路径为"E:\work\lua\Lua5.1"。 接下来,打开Visual Studio,进入"Tools" -> "Options" -> "Projects" -> "VC++ Directories"。在这个界面中,你需要对...
Lua5.1虚拟机指令集是Lua解释器的核心组成部分,它定义了Lua代码在运行时的行为。这些指令被编译器或解释器转换为字节码,然后由虚拟机执行。Lua5.1的指令集包括一系列用于执行各种操作的基本命令,如加载常量、处理...
4. **灵活的API**: lua-flatbuffers提供了丰富的API,方便在Lua中创建、修改和解析数据。 **六、应用场景** lua-flatbuffers适合于需要快速读取和写入大量结构化数据的场合,如游戏中的对象状态保存、网络通信协议...
- `header_filter_by_lua`: 修改响应头。 - `body_filter_by_lua`: 操作响应体。 四、典型应用场景 4.1 API网关 利用lua-nginx-module可以实现动态路由、限流、鉴权等网关功能。 4.2 数据缓存 结合ngx_lua_shared...
LuaConsole 是一个强大的命令行接口(CLI)工具,专为 Lua 开发者设计,支持多个 Lua 版本,包括 Lua-5.1.x、LuaJIT-2.0、Lua-5.2.x 和 Lua5.3.x。它旨在替代传统的 PUC-Lua 和 LuaJIT 的命令行解释器,提供更现代、...
通过分析和修改源代码,可以进一步提升对游戏网络编程的理解和技能。 总结,这个3D台球游戏项目展示了Cocos2d-x在开发复杂3D游戏时的强大能力,以及帧同步和强联网技术在多人在线游戏中的关键作用。通过学习和实践...
8. **lua5.1.dll**:Lua脚本引擎的动态库,PhoenixCard可能使用Lua语言来编写部分控制逻辑或用户界面,使得软件具有更好的可扩展性。 9. **PhoenixCardFun.dll**:核心功能模块,包含了PhoenixCard的主要烧录算法和...
1. **API兼容性**:原版lua-mongo是基于lua 5.1编写的,而新的API需要兼容lua 5.2,因此引入了lua-compat-5.2库来解决版本差异问题。 2. **网络库的替换**:原始代码使用了mongo.socket模块,但这里改用了ngx....
- `lua5.1.dll` 或 `luajit-5.1.dll`:Lua 解释器,用于编写自定义的代理逻辑。 - `proxy-lua.dll`:MySQL Proxy 的 Lua 插件,用于与 Lua 脚本交互。 - `libmysql.dll`:MySQL 客户端库,用于与 MySQL 服务器通信。...
- **特点**:Lua中的字符串是不可变的,即一旦创建,其内容不能更改。 - **用途**:文本处理、格式化输出等。 ##### 2.5 函数类型 - **定义**:函数是Lua中最核心的数据类型之一,可以视为一等公民。 - **特点**:...
这个代理程序基于网络协议,因此它可以与任何标准的 MySQL 客户端无缝配合,无需对客户端代码进行任何修改。MySQL Proxy 的主要功能包括但不限于查询过滤、负载均衡和故障切换,这使得它对于数据库监控、性能优化和...
这允许用户自定义赋值行为,比如记录赋值动作或执行某些操作。 #### 四、控制结构 **4.1 条件语句 (If Statement)** Lua中的条件语句遵循与其他语言相似的结构: ```lua if condition then -- 当条件为真时执行...
【lua5.1.dll】是Lua脚本语言的库,Lua是一种广泛应用于游戏开发的轻量级脚本语言。The Diamond Server使用Lua可能用于编写游戏逻辑、事件处理和服务器管理脚本,提供可扩展性和灵活性。 【mysql.dll】是MySQL...