mirror of
https://gitcode.com/JianFeeeee/LuaCangjia_api.git
synced 2026-09-20 08:58:13 +00:00
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直通/大整数保真/错误路径)
This commit is contained in:
@ -27,6 +27,12 @@ typedef struct lua_runner
|
||||
|
||||
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;
|
||||
/*内部使用结构体,仓颉无需关心*/
|
||||
|
||||
@ -75,6 +81,56 @@ int unloadfunction(void *selfd,const char *name);
|
||||
/// @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 脚本路径
|
||||
|
||||
Reference in New Issue
Block a user