mirror of
https://gitcode.com/JianFeeeee/LuaCangjia_api.git
synced 2026-09-19 16:42:48 +00:00
- 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直通/大整数保真/错误路径)
170 lines
6.0 KiB
C
Executable File
170 lines
6.0 KiB
C
Executable File
#ifndef LUA_CJ_API
|
||
#define LUA_CJ_API
|
||
|
||
#define MAX_RESULT 4096
|
||
|
||
#include "lua_runner.hpp"
|
||
|
||
/*内部使用结构体,仓颉无需关心*/
|
||
typedef struct redirectfuncs
|
||
{
|
||
int (*io_input)();
|
||
int (*io_output)();
|
||
}redirectfuncs;
|
||
|
||
typedef struct iopath
|
||
{
|
||
char iopath[256];
|
||
redirectfuncs funcs;
|
||
}iopath;
|
||
|
||
#define LUAI_EXTRASPACE sizeof(iopath)
|
||
|
||
typedef struct lua_runner
|
||
{
|
||
|
||
char result[4096];//返回值,每次调用run方法时更新脚本返回至result(当前支持单个字符串或整形返回)
|
||
|
||
void *lua_obj;//cpp对象,指向在cpp中封装的luarunner对象
|
||
|
||
// typed interop:最近一次调用的结果类型与值(镜像 Lua_runner 同名字段)
|
||
int tresult_type; // 0=nil, 1=bool, 2=int, 3=num, 4=str
|
||
long long tresult_int;
|
||
double tresult_num;
|
||
int tresult_bool;
|
||
|
||
}lua_runner;
|
||
/*内部使用结构体,仓颉无需关心*/
|
||
|
||
#ifdef __cplusplus
|
||
extern "C"{
|
||
#endif
|
||
|
||
/// @brief 用于在仓颉中初始化lua解释器,返回void形指针
|
||
/// @param pathio 重定向终端输入出入到执行文件
|
||
/// @param pkgpath 用户包搜索路径
|
||
/// @param input 输入回调函数
|
||
/// @param output 输出回调函数
|
||
/// @return 成功返回对应指针,失败返回NULL
|
||
void *init_lua_runner(const char *pathio,const char *pkgpath,int(*input)(),int(*output)());
|
||
|
||
/// @brief 用于在lua状态机中加载lua源码
|
||
/// @param selfd init_lua_runner返回的void指针
|
||
/// @param path 源码路径
|
||
/// @param name 为加载的源码命名(unload时使用)
|
||
/// @return 成功返回0,失败返回-1
|
||
int load_lib(void *selfd,const char *path,const char *name);
|
||
|
||
/// @brief 用于在lua状态机中卸载加载过的lua源码
|
||
/// @param selfd init_lua_runner返回的void指针
|
||
/// @param name 加载库时候的命名
|
||
/// @return 成功返回0,失败返回-1
|
||
int unload_lib(void *selfd,const char *name);
|
||
|
||
/// @brief 预加载lua文件到内存:加载文件、执行顶层代码、捕获返回的函数并存入 Registry,供后续 callfunction 多次调用
|
||
/// @param selfd init_lua_runner返回的void指针
|
||
/// @param path 需要加载的文件路径
|
||
/// @param name 函数名称(callfunction/unloadfunction时使用)
|
||
/// @return 0代表正常结束,-1表示异常退出
|
||
int loadfunction(void *selfd,const char *path,const char *name);
|
||
|
||
/// @brief 卸载预加载的函数(释放 Registry 引用)
|
||
/// @param selfd init_lua_runner返回的void指针
|
||
/// @param name loadfunction加载时的函数名称
|
||
/// @return 0代表正常结束,-1表示异常退出
|
||
int unloadfunction(void *selfd,const char *name);
|
||
|
||
/// @brief 按名称调用已预加载的函数(从 Registry 取出,不消耗该函数,可重复调用)
|
||
/// @param selfd init_lua_runner返回的void指针
|
||
/// @param name loadfunction加载时的函数名称
|
||
/// @param arg 传递给函数的单参数(可为NULL)
|
||
/// @return 成功返回0,失败返回-1,并将lua出错原因拷贝至result中
|
||
int callfunction(void *selfd,const char *name,const char *arg);
|
||
|
||
/*-------------typed interop(v0.2.2)------------------------*/
|
||
// 原始类型直通映射:仓颉 Int64/Float64/Bool 与 Lua integer/number/boolean
|
||
// 直接互转,无需序列化为字符串。调用后用 result_type/result_int/result_num/
|
||
// result_bool/getresult 读取结果。
|
||
|
||
/// @brief 按名称调用预加载函数,传递 Int64 参数(Lua integer)
|
||
/// @return 成功返回0,失败返回-1
|
||
int callfunction_int(void *selfd,const char *name,long long val);
|
||
|
||
/// @brief 按名称调用预加载函数,传递 Float64 参数(Lua number)
|
||
int callfunction_num(void *selfd,const char *name,double val);
|
||
|
||
/// @brief 按名称调用预加载函数,传递 Bool 参数(Lua boolean)
|
||
int callfunction_bool(void *selfd,const char *name,int val);
|
||
|
||
/// @brief 按名称调用预加载函数,不传参数
|
||
int callfunction_void(void *selfd,const char *name);
|
||
|
||
/// @brief 运行脚本,传递 Int64 参数
|
||
int run_int(void *selfd,const char *path,long long val);
|
||
|
||
/// @brief 运行脚本,传递 Float64 参数
|
||
int run_num(void *selfd,const char *path,double val);
|
||
|
||
/// @brief 运行脚本,传递 Bool 参数
|
||
int run_bool(void *selfd,const char *path,int val);
|
||
|
||
/// @brief 运行脚本,不带参数
|
||
int run_void(void *selfd,const char *path);
|
||
|
||
#define CJT_NIL 0
|
||
#define CJT_BOOL 1
|
||
#define CJT_INT 2
|
||
#define CJT_NUM 3
|
||
#define CJT_STR 4
|
||
|
||
/// @brief 获取最近一次 typed 调用的结果类型
|
||
/// @return CJT_NIL/CJT_BOOL/CJT_INT/CJT_NUM/CJT_STR
|
||
int result_type(void *selfd);
|
||
|
||
/// @brief 获取最近一次 typed 调用的整数结果(非整型结果时为转换值)
|
||
long long result_int(void *selfd);
|
||
|
||
/// @brief 获取最近一次 typed 调用的浮点结果(非浮点结果时为转换值)
|
||
double result_num(void *selfd);
|
||
|
||
/// @brief 获取最近一次 typed 调用的布尔结果
|
||
int result_bool(void *selfd);
|
||
/*-------------typed interop------------------------*/
|
||
|
||
/// @brief 运行lua脚本
|
||
/// @param selfd init_lua_runner返回的void指针
|
||
/// @param path 脚本路径
|
||
/// @param arg 脚本入参(字符串类型)
|
||
/// @return 成功返回0,失败返回-1,并将lua出错原因拷贝至result中
|
||
int run(void *selfd,const char *path,const char *arg);
|
||
|
||
/// @brief 执行单句lua语句
|
||
/// @param selfd init_lua_runner返回的void指针
|
||
/// @param target 执行语句(字符串类型)
|
||
/// @return 成功返回0,失败返回-1,并将lua出错原因拷贝至result中
|
||
int dostring(void *selfd,const char *target);
|
||
|
||
/// @brief 清理lua状态机缓存,不销毁状态机
|
||
/// @param selfd init_lua_runner返回的void指针
|
||
/// @return 成功返回0,失败返回-1
|
||
int cleanup(void *selfd);
|
||
|
||
/// @brief 获取lua状态机执行过程中产生的错误码
|
||
/// @param 不需要入参
|
||
/// @return 返回errrors中定义的错误码
|
||
int get_errno(void);
|
||
|
||
/// @brief 用于获取脚本返回值
|
||
/// @param selfd init_lua_runner返回的void指针
|
||
/// @return 返回运行结果
|
||
char *getresult(void *selfd);
|
||
|
||
/// @brief 清理lua状态机并释放内存
|
||
/// @param selfd init_lua_runner返回的void指针
|
||
/// @return 成功返回0,失败返回-1
|
||
int free_lua(void *selfd);
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif |