Files
LuaCangjia_api/lib/lua_cj_api.h
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

170 lines
6.0 KiB
C
Executable File
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_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 interopv0.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