mirror of
https://gitcode.com/JianFeeeee/LuaCangjia_api.git
synced 2026-09-20 17:08:12 +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:
@ -12,13 +12,13 @@ bool check_luastatue(lua_State *L)
|
||||
/*检查lua状态机状况*/
|
||||
if(L == NULL)
|
||||
{
|
||||
errno = NAPI_LUA_STACK_ERROR;
|
||||
errno = LUAERR_LUA_STACK;
|
||||
return false;
|
||||
}
|
||||
//分为两部分写,防止空指针访问
|
||||
if(lua_status(L) != LUA_OK)
|
||||
{
|
||||
errno = NAPI_LUA_STATE_ERROR;
|
||||
errno = LUAERR_LUA_STATE;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@ -26,6 +26,15 @@ bool check_luastatue(lua_State *L)
|
||||
|
||||
int get_errno(void) { return errno; }//获取错误码
|
||||
|
||||
// 同步 typed 结果:把 Lua_runner 的 last_result_* 拷贝到外层 lua_runner 结构体
|
||||
static void sync_typed_result(lua_runner *self, Lua_runner *runner)
|
||||
{
|
||||
self->tresult_type = runner->last_result_type;
|
||||
self->tresult_int = runner->last_result_int;
|
||||
self->tresult_num = runner->last_result_num;
|
||||
self->tresult_bool = runner->last_result_bool;
|
||||
}
|
||||
|
||||
/// @brief 加载lua文件到lua虚拟栈
|
||||
/// @param self 使用init_lua_runner初始化的lua_runner结构体指针
|
||||
/// @param path 需要加载的脚本的位置
|
||||
@ -37,7 +46,7 @@ int load_lib(void *selfd,const char *path,const char *name)
|
||||
Lua_runner *runner = (Lua_runner*)self->lua_obj;//还原对象
|
||||
if(runner == NULL)
|
||||
{
|
||||
errno = NAPI_LUA_STATE_ERROR;
|
||||
errno = LUAERR_LUA_STATE;
|
||||
return -1;
|
||||
}
|
||||
if(runner->load_lib(path,name)==-1)
|
||||
@ -54,7 +63,7 @@ int unload_lib(void *selfd,const char *name)
|
||||
Lua_runner *runner = (Lua_runner*)self->lua_obj;//还原对象
|
||||
if(runner == NULL)
|
||||
{
|
||||
errno = NAPI_LUA_STATE_ERROR;
|
||||
errno = LUAERR_LUA_STATE;
|
||||
return -1;
|
||||
}
|
||||
if(runner->unload_lib(name)==-1)
|
||||
@ -64,7 +73,7 @@ int unload_lib(void *selfd,const char *name)
|
||||
|
||||
/// @brief 运行脚本(可指定入参)
|
||||
/// @param self 使用init_lua_runner初始化的lua_runner结构体指针
|
||||
/// @param path 脚本的沙盒内路径
|
||||
/// @param path 脚本路径
|
||||
/// @param arg 脚本的入参
|
||||
/// @return 0代表正常结束,-1表示异常退出
|
||||
int run(void *selfd,const char *path,const char *arg)
|
||||
@ -74,7 +83,7 @@ int run(void *selfd,const char *path,const char *arg)
|
||||
Lua_runner *runner = (Lua_runner*)self->lua_obj;//还原对象
|
||||
if(runner == NULL)
|
||||
{
|
||||
errno = NAPI_LUA_STATE_ERROR;
|
||||
errno = LUAERR_LUA_STATE;
|
||||
return -1;
|
||||
}
|
||||
if(runner->run(path,arg)==-1)
|
||||
@ -97,7 +106,7 @@ int loadfunction(void *selfd,const char *path,const char *name)
|
||||
Lua_runner *runner = (Lua_runner*)self->lua_obj;//还原对象
|
||||
if(runner == NULL)
|
||||
{
|
||||
errno = NAPI_LUA_STATE_ERROR;
|
||||
errno = LUAERR_LUA_STATE;
|
||||
return -1;
|
||||
}
|
||||
if(runner->loadfunction(path,name)==-1)
|
||||
@ -115,7 +124,7 @@ int unloadfunction(void *selfd,const char *name)
|
||||
Lua_runner *runner = (Lua_runner*)self->lua_obj;//还原对象
|
||||
if(runner == NULL)
|
||||
{
|
||||
errno = NAPI_LUA_STATE_ERROR;
|
||||
errno = LUAERR_LUA_STATE;
|
||||
return -1;
|
||||
}
|
||||
if(runner->unloadfunction(name)==-1)
|
||||
@ -134,7 +143,7 @@ int callfunction(void *selfd,const char *name,const char *arg)
|
||||
Lua_runner *runner = (Lua_runner*)self->lua_obj;
|
||||
if(runner == NULL)
|
||||
{
|
||||
errno = NAPI_LUA_STATE_ERROR;
|
||||
errno = LUAERR_LUA_STATE;
|
||||
return -1;
|
||||
}
|
||||
if(runner->callfunction(name,arg)==-1){
|
||||
@ -142,9 +151,162 @@ int callfunction(void *selfd,const char *name,const char *arg)
|
||||
return -1;
|
||||
}
|
||||
snprintf(self->result,MAX_RESULT,"%s",runner->reslt.c_str());
|
||||
sync_typed_result(self, runner);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*-------------typed interop(v0.2.2)------------------------*/
|
||||
|
||||
int callfunction_int(void *selfd,const char *name,long long val)
|
||||
{
|
||||
lua_runner* self = (lua_runner*)selfd;
|
||||
Lua_runner *runner = (Lua_runner*)self->lua_obj;
|
||||
if(runner == NULL)
|
||||
{
|
||||
errno = LUAERR_LUA_STATE;
|
||||
return -1;
|
||||
}
|
||||
if(runner->callfunction_int(name,val)==-1){
|
||||
snprintf(self->result,MAX_RESULT,"%s",runner->reslt.c_str());
|
||||
return -1;
|
||||
}
|
||||
snprintf(self->result,MAX_RESULT,"%s",runner->reslt.c_str());
|
||||
sync_typed_result(self, runner);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int callfunction_num(void *selfd,const char *name,double val)
|
||||
{
|
||||
lua_runner* self = (lua_runner*)selfd;
|
||||
Lua_runner *runner = (Lua_runner*)self->lua_obj;
|
||||
if(runner == NULL)
|
||||
{
|
||||
errno = LUAERR_LUA_STATE;
|
||||
return -1;
|
||||
}
|
||||
if(runner->callfunction_num(name,val)==-1){
|
||||
snprintf(self->result,MAX_RESULT,"%s",runner->reslt.c_str());
|
||||
return -1;
|
||||
}
|
||||
snprintf(self->result,MAX_RESULT,"%s",runner->reslt.c_str());
|
||||
sync_typed_result(self, runner);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int callfunction_bool(void *selfd,const char *name,int val)
|
||||
{
|
||||
lua_runner* self = (lua_runner*)selfd;
|
||||
Lua_runner *runner = (Lua_runner*)self->lua_obj;
|
||||
if(runner == NULL)
|
||||
{
|
||||
errno = LUAERR_LUA_STATE;
|
||||
return -1;
|
||||
}
|
||||
if(runner->callfunction_bool(name,val)==-1){
|
||||
snprintf(self->result,MAX_RESULT,"%s",runner->reslt.c_str());
|
||||
return -1;
|
||||
}
|
||||
snprintf(self->result,MAX_RESULT,"%s",runner->reslt.c_str());
|
||||
sync_typed_result(self, runner);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int callfunction_void(void *selfd,const char *name)
|
||||
{
|
||||
lua_runner* self = (lua_runner*)selfd;
|
||||
Lua_runner *runner = (Lua_runner*)self->lua_obj;
|
||||
if(runner == NULL)
|
||||
{
|
||||
errno = LUAERR_LUA_STATE;
|
||||
return -1;
|
||||
}
|
||||
if(runner->callfunction_void(name)==-1){
|
||||
snprintf(self->result,MAX_RESULT,"%s",runner->reslt.c_str());
|
||||
return -1;
|
||||
}
|
||||
snprintf(self->result,MAX_RESULT,"%s",runner->reslt.c_str());
|
||||
sync_typed_result(self, runner);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int run_int(void *selfd,const char *path,long long val)
|
||||
{
|
||||
lua_runner* self = (lua_runner*)selfd;
|
||||
Lua_runner *runner = (Lua_runner*)self->lua_obj;
|
||||
if(runner == NULL)
|
||||
{
|
||||
errno = LUAERR_LUA_STATE;
|
||||
return -1;
|
||||
}
|
||||
if(runner->run_int(path,val)==-1){
|
||||
snprintf(self->result,MAX_RESULT,"%s",runner->reslt.c_str());
|
||||
return -1;
|
||||
}
|
||||
snprintf(self->result,MAX_RESULT,"%s",runner->reslt.c_str());
|
||||
sync_typed_result(self, runner);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int run_num(void *selfd,const char *path,double val)
|
||||
{
|
||||
lua_runner* self = (lua_runner*)selfd;
|
||||
Lua_runner *runner = (Lua_runner*)self->lua_obj;
|
||||
if(runner == NULL)
|
||||
{
|
||||
errno = LUAERR_LUA_STATE;
|
||||
return -1;
|
||||
}
|
||||
if(runner->run_num(path,val)==-1){
|
||||
snprintf(self->result,MAX_RESULT,"%s",runner->reslt.c_str());
|
||||
return -1;
|
||||
}
|
||||
snprintf(self->result,MAX_RESULT,"%s",runner->reslt.c_str());
|
||||
sync_typed_result(self, runner);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int run_bool(void *selfd,const char *path,int val)
|
||||
{
|
||||
lua_runner* self = (lua_runner*)selfd;
|
||||
Lua_runner *runner = (Lua_runner*)self->lua_obj;
|
||||
if(runner == NULL)
|
||||
{
|
||||
errno = LUAERR_LUA_STATE;
|
||||
return -1;
|
||||
}
|
||||
if(runner->run_bool(path,val)==-1){
|
||||
snprintf(self->result,MAX_RESULT,"%s",runner->reslt.c_str());
|
||||
return -1;
|
||||
}
|
||||
snprintf(self->result,MAX_RESULT,"%s",runner->reslt.c_str());
|
||||
sync_typed_result(self, runner);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int run_void(void *selfd,const char *path)
|
||||
{
|
||||
lua_runner* self = (lua_runner*)selfd;
|
||||
Lua_runner *runner = (Lua_runner*)self->lua_obj;
|
||||
if(runner == NULL)
|
||||
{
|
||||
errno = LUAERR_LUA_STATE;
|
||||
return -1;
|
||||
}
|
||||
if(runner->run_void(path)==-1){
|
||||
snprintf(self->result,MAX_RESULT,"%s",runner->reslt.c_str());
|
||||
return -1;
|
||||
}
|
||||
snprintf(self->result,MAX_RESULT,"%s",runner->reslt.c_str());
|
||||
sync_typed_result(self, runner);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int result_type(void *selfd){lua_runner*self =(lua_runner*)selfd;return self->tresult_type;}
|
||||
long long result_int(void *selfd){lua_runner*self =(lua_runner*)selfd;return self->tresult_int;}
|
||||
double result_num(void *selfd){lua_runner*self =(lua_runner*)selfd;return self->tresult_num;}
|
||||
int result_bool(void *selfd){lua_runner*self =(lua_runner*)selfd;return self->tresult_bool;}
|
||||
/*-------------typed interop------------------------*/
|
||||
|
||||
/// @brief 执行单句lua语句
|
||||
/// @param selfd init_lua_runner返回的void指针
|
||||
/// @param target 执行语句(字符串类型)
|
||||
@ -155,7 +317,7 @@ int dostring(void *selfd,const char *target){
|
||||
Lua_runner *runner = (Lua_runner*)self->lua_obj;//还原对象
|
||||
if(runner == NULL)
|
||||
{
|
||||
errno = NAPI_LUA_STATE_ERROR;
|
||||
errno = LUAERR_LUA_STATE;
|
||||
return -1;
|
||||
}
|
||||
if(runner->dostring(target)==-1){
|
||||
@ -175,7 +337,7 @@ int cleanup(void *selfd)
|
||||
Lua_runner *runner = (Lua_runner*)self->lua_obj;//还原对象
|
||||
if(runner == NULL)
|
||||
{
|
||||
errno = NAPI_LUA_STATE_ERROR;
|
||||
errno = LUAERR_LUA_STATE;
|
||||
return -1;
|
||||
}
|
||||
if(runner->clean()==-1)
|
||||
@ -221,7 +383,7 @@ static int l_tty_read(lua_State *L)
|
||||
fclose(fp);
|
||||
if(remove(fname) != 0)
|
||||
{
|
||||
errno = NAPI_RESET_INPUT_FILE_ERROR;
|
||||
errno = LUAERR_RESET_INPUT_FILE;
|
||||
return luaL_error(L, "fail to reset input file: %s", fname);
|
||||
}
|
||||
lua_pushlstring(L, tmp, sz);
|
||||
@ -310,7 +472,7 @@ static void push_tty_file(lua_State *L, int isout, const luaL_Reg *fake_tty_meta
|
||||
int redirecct_path(lua_State *L)
|
||||
{
|
||||
if(!check_luastatue(L)){
|
||||
errno = NAPI_LUA_STATE_ERROR;
|
||||
errno = LUAERR_LUA_STATE;
|
||||
return -1;
|
||||
}
|
||||
iopath *p = (iopath*)lua_getextraspace(L);
|
||||
@ -362,13 +524,18 @@ void *init_lua_runner(const char *pathio,const char *pkgpath,int(*input)(),int(*
|
||||
{
|
||||
//分配内存
|
||||
lua_runner *self = (lua_runner*)malloc(sizeof(lua_runner));
|
||||
// typed interop 字段初始化
|
||||
self->tresult_type = CJT_NIL;
|
||||
self->tresult_int = 0;
|
||||
self->tresult_num = 0.0;
|
||||
self->tresult_bool = 0;
|
||||
//创建对象
|
||||
self->lua_obj = (void*)new Lua_runner(pkgpath);
|
||||
if(errno != 0)
|
||||
return NULL;
|
||||
if(self->lua_obj == NULL)
|
||||
{
|
||||
errno = NAPI_LUA_CLASS_LOST;
|
||||
errno = LUAERR_CLASS_LOST;
|
||||
return NULL;
|
||||
}
|
||||
//提取对象
|
||||
@ -377,7 +544,7 @@ void *init_lua_runner(const char *pathio,const char *pkgpath,int(*input)(),int(*
|
||||
lua_State *L = runner->get_lua_State();
|
||||
|
||||
if(!check_luastatue(L)){
|
||||
errno = NAPI_LUA_STATE_ERROR;
|
||||
errno = LUAERR_LUA_STATE;
|
||||
return NULL;
|
||||
}
|
||||
iopath *io_path = (iopath*)lua_getextraspace(L);
|
||||
@ -388,7 +555,7 @@ void *init_lua_runner(const char *pathio,const char *pkgpath,int(*input)(),int(*
|
||||
}
|
||||
|
||||
if(io_path == NULL){
|
||||
errno = NAPI_ERROR_FUNCS;
|
||||
errno = LUAERR_CALLBACK;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -399,7 +566,7 @@ void *init_lua_runner(const char *pathio,const char *pkgpath,int(*input)(),int(*
|
||||
strcpy(io_path->iopath,pathio);
|
||||
//注册重定向
|
||||
if(redirecct_path(L)==-1){
|
||||
errno = NAPI_LUA_STATE_ERROR;
|
||||
errno = LUAERR_LUA_STATE;
|
||||
return NULL;
|
||||
}
|
||||
WITHOUT_REDIRECT:
|
||||
|
||||
Reference in New Issue
Block a user