lua53
简介
用于执行 lua 脚本, 相关 lua 代码
lua gc 问题
lua 的 gc 回收是在 gs 调用 lua_gc 函数来实现的, 目前是 1024 次 lua 调用 pcall 或者 LuaFunction.invoke, 自动 gc 一次
在 gs 里启 动 lua 虚拟机
object lua = lua53.open();
在 gs 里执行 lua 代码
lua.dostring("print(\"hello lua\"));
向 lua 注册 gs 函数, 并在 lua 中完成调用
- 向 lua 注册 gs 函数
lua.register_gs_function((int a, int b){
return a + b;
}, "callgs");
- 在 lua 中完成调用
提示
这里通过 gs 中的, dostring 模拟在 lua 中的调用, 当然可以在 lua 源码中直接完成调用
write(lua.dostring("callgs(10, 20)"));
设置 lua 的 require 的搜索路径
设置之后, lua 的 require 路径从设置路径开始算, 设置的为脚本路径, 请确保该路径在可被访问
lua.set_search_path("");
在 gs 中持有 lua 的 table
在 gs 中, 回通过 LuaTable 代理 lua 的 table
PS
在 gs 中持有的 lua table, 为弱引用, 请必须保证其在 lua 中不会被 gc 回收, 如果被 gc 回收, 该 table 无法使用
- 通过
set_val(mixed key, mixed val)
来设置 table 的值 - 通过
get_val(mixed key)
来获取 table 的值 - 通过
set_metatable(map | LuaTable key)
来设置 metatable 的 - 通过
get_metatable()
来获取 metatable 的
在 gs 调用 lua 的函数
在 gs 中, 回通过 LuaFunction 代理 lua 的函数 LuaFunction
-
可以通过 load_file, load_string, load_buffer 得到
这种方式获得的 LuaFunction 保证在 lua 里面存活
-
也可以通过 do_string 或者 调用 LuaFunction 的返回值得到
这种方式获得函数, 使用 弱引用, 需要开发自己保证该函数在 lua 中不被 gc
// foo2.lua
// return function(a, b)
// return a + b
// end
LuaFunction func = lua.load_file("./test/modules/foo2.lua").invoke(); // 从返回值获取 lua 闭包
write(func.invoke(10, 20)); // 30
组件接口
lua53.gs
函数原型 | 函数作用 |
---|---|
object open() | 新建一个 lua 虚拟机, 并绑定到 gs 操作类上 |
lua_state.gs
lua 虚拟机操作对象
函数原型 | 函数作用 |
---|---|
mixed dofile(mixed path) | 执行对应的 lua 文件 |
mixed dostring(mixed code, string name = "gs_lua") | 将 string 作为 lua 脚本执行 |
mixed pcall(string func_name, ...) | 调用 lua 函数 |
LuaFunction load_file(string path, string mode = "bt") | 将对应文件加载为 lua chunk |
LuaFunction load_string(string code, string mode = "bt") | 将对应字符串加载为 lua chunk |
LuaFunction load_buffer(buffer code, string mode = "bt") | 将对应 buffer 加载为 lua chunk |
LuaTable new_lua_table(map val = nil) | 将 gs 的 map 推到 lua, 中 |
样例
// 启动虚拟机
_lua = lua53.open();
_lua.dostring("print(\"call in gs\")")