Files
LuaCangjia_api/lib/lua_runner.hpp
JianFeeeee 237aab3f36 feat: typed interop 原始类型直通映射 (Int64/Float64/Bool)
- C++ 层: callfunction_int/num/bool/void + run_int/num/bool/void
- 新增 capture_result()/finish_call() 正确计算 lua_pcall 实际返回值数量,
  修复无返回值场景下误读栈残留的问题
- C FFI 层: 11 个新导出函数 + lua_runner 结构体 tresult_* 镜像字段
- 仓颉层: callFunctionInt/Num/Bool, runScriptInt/Num/Bool, resultType()
  带严格类型校验(不匹配抛 LUAERR_RESULT_TYPE)
- 大整数跨 2^53 保真(字符串路径做不到)
- 管道模式语义保留给字符串 API; typed run_* 为独立调用保持栈清洁
- GTest 新增 10 个 typed 测试用例(共 44 个全部通过)
- 独立程序验证仓颉层运行时正确性(int/num/bool直通/大整数保真/错误路径)
2026-08-25 09:29:24 +08:00

79 lines
3.1 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef LUA_RUNNER
#define LUA_RUNNER
#include "lua/lua.hpp"
#ifdef __cplusplus
#include <string>
#endif
#define MAX_LUA_LIB 20
typedef struct loaded_package
{
char name[128];
int ref;
}ld_pkg;
// 预加载函数表:使用 luaL_ref 存入 Lua Registryref 为绝对索引,不受栈变化影响
#define MAX_LUA_FUNC 20
typedef struct loaded_function
{
char name[128];
int ref; // luaL_ref 返回的绝对索引
}ld_func;
// 结果类型标记typed interopv0.2.2
#define CJT_NIL 0
#define CJT_BOOL 1
#define CJT_INT 2
#define CJT_NUM 3
#define CJT_STR 4
#ifdef __cplusplus
class Lua_runner//lua运行器对象
{
public:
Lua_runner(const char *path = NULL);//创建lua状态机并持久化持有
~Lua_runner();//销毁状态机
int load_lib(const char *path,const char *name);//加载库(块压栈)
int unload_lib(const char *name);//解除加载
int loadfunction(const char *path,const char *name);//预加载函数(顶层执行,结果存入独立函数表)
int unloadfunction(const char *name);//卸载预加载函数
int callfunction(const char *name,const char *arg);//按名称调用已预加载的函数(字符串参数)
int callfunction_int(const char *name, long long val);//按名称调用,传 Int64 参数
int callfunction_num(const char *name, double val);//按名称调用,传 Float64 参数
int callfunction_bool(const char *name, int val);//按名称调用,传 Bool 参数
int callfunction_void(const char *name);//按名称调用,不带参数
int run(const char *path = NULL,const char *arg = NULL);//运行脚本(字符串参数)
int run_int(const char *path, long long val);//运行脚本,传 Int64 参数
int run_num(const char *path, double val);//运行脚本,传 Float64 参数
int run_bool(const char *path, int val);//运行脚本,传 Bool 参数
int run_void(const char *path);//运行脚本,不带参数
int clean();//清除状态机缓存
int dostring(const char *target);
std::string reslt;
lua_State *get_lua_State();
// typed interop最近一次调用的结果类型与值callfunction_*/run_* 更新)
int last_result_type; // CJT_NIL/CJT_BOOL/CJT_INT/CJT_NUM/CJT_STR
long long last_result_int;
double last_result_num;
int last_result_bool;
// 内部辅助:读取 Lua 栈顶值并记录类型到 last_result_*
void capture_result();
// 计算 lua_pcall 实际返回值数量并记录结果pop_results=true 时弹出全部返回值
// (管道模式的 run_* 传 false 以保留栈上数据供后续节点使用)
// 返回实际返回值数量
int finish_call(int pre_top, int nargs, bool pop_results);
private:
lua_State *L;
int pkg_cont;
ld_pkg pkgs[MAX_LUA_LIB];
int func_cont;
ld_func funcs[MAX_LUA_FUNC];
bool check_luastatue();
bool check_file_exists(const char *path);
};
#endif
#endif