diff options
| -rw-r--r-- | gtest/gtest_tsg_lua_exec_with_context.cpp | 48 | ||||
| -rw-r--r-- | src/tsg_lua_func.cpp | 74 | ||||
| -rw-r--r-- | src/tsg_lua_interface.h | 25 |
3 files changed, 90 insertions, 57 deletions
diff --git a/gtest/gtest_tsg_lua_exec_with_context.cpp b/gtest/gtest_tsg_lua_exec_with_context.cpp index 095bc25..447f460 100644 --- a/gtest/gtest_tsg_lua_exec_with_context.cpp +++ b/gtest/gtest_tsg_lua_exec_with_context.cpp @@ -26,7 +26,7 @@ int get_userdata(tsg_lua_handle L) return 1; } -TEST(lua_exec_file_with_context, normal) +TEST(lua_exec_file, normal) { tsg_lua_handle L = tsg_lua_vm_create_with_name("TEST"); @@ -42,8 +42,8 @@ TEST(lua_exec_file_with_context, normal) lua_register_function(L, "get", "get_userdata", get_userdata); lua_script_context context = NULL; - lua_set_script_context(L, &context); - int ret = lua_exec_file_with_context(L, script, in, (void *)ud, context, &out); + context = lua_script_context_malloc(L); + int ret = lua_exec_file(L, script, in, (void *)ud, context, &out); const char *str = "userdata:hello world., context.count:1, context.message:This is first called"; EXPECT_EQ(0, ret); EXPECT_EQ(strlen(str), out.len); @@ -52,7 +52,7 @@ TEST(lua_exec_file_with_context, normal) bzero(out.str, 1024); ud = "hello lua."; - ret = lua_exec_file_with_context(L, script, in, (void *)ud, context, &out); + ret = lua_exec_file(L, script, in, (void *)ud, context, &out); str = "userdata:hello lua., context.count:2, context.message:This is not first called"; EXPECT_EQ(0, ret); EXPECT_EQ(strlen(str), out.len); @@ -61,8 +61,8 @@ TEST(lua_exec_file_with_context, normal) bzero(out.str, 1024); lua_script_context context2 = NULL; - lua_set_script_context(L, &context2); - ret = lua_exec_file_with_context(L, script, in, (void *)ud, context2, &out); + context2 = lua_script_context_malloc(L); + ret = lua_exec_file(L, script, in, (void *)ud, context2, &out); str = "userdata:hello lua., context.count:1, context.message:This is first called"; EXPECT_EQ(0, ret); EXPECT_EQ(strlen(str), out.len); @@ -70,13 +70,13 @@ TEST(lua_exec_file_with_context, normal) EXPECT_STREQ(str, out.str); bzero(out.str, 1024); - lua_unset_script_context(L, context); - lua_unset_script_context(L, context2); + lua_script_context_free(L, context); + lua_script_context_free(L, context2); tsg_destory_lua(L); free(out.str); } -TEST(lua_exec_with_context, normal) +TEST(lua_exec, normal) { tsg_lua_handle L = tsg_lua_vm_create_with_name("TEST"); @@ -94,8 +94,8 @@ TEST(lua_exec_with_context, normal) lua_register_function(L, "get", "get_userdata", get_userdata); lua_script_context context = NULL; - lua_set_script_context(L, &context); - int ret = lua_exec_with_context(L, script, in, (void *)ud, context, &out); + context = lua_script_context_malloc(L); + int ret = lua_exec(L, script, in, (void *)ud, context, &out); const char *str = "userdata:hello world., context.count:1, context.message:This is first called"; EXPECT_EQ(0, ret); EXPECT_EQ(strlen(str), out.len); @@ -104,7 +104,7 @@ TEST(lua_exec_with_context, normal) bzero(out.str, 1024); ud = "hello lua."; - ret = lua_exec_with_context(L, script, in, (void *)ud, context, &out); + ret = lua_exec(L, script, in, (void *)ud, context, &out); str = "userdata:hello lua., context.count:2, context.message:This is not first called"; EXPECT_EQ(0, ret); EXPECT_EQ(strlen(str), out.len); @@ -113,8 +113,8 @@ TEST(lua_exec_with_context, normal) bzero(out.str, 1024); lua_script_context context2 = NULL; - lua_set_script_context(L, &context2); - ret = lua_exec_with_context(L, script, in, (void *)ud, context2, &out); + context2 = lua_script_context_malloc(L); + ret = lua_exec(L, script, in, (void *)ud, context2, &out); str = "userdata:hello lua., context.count:1, context.message:This is first called"; EXPECT_EQ(0, ret); EXPECT_EQ(strlen(str), out.len); @@ -122,13 +122,13 @@ TEST(lua_exec_with_context, normal) EXPECT_STREQ(str, out.str); bzero(out.str, 1024); - lua_unset_script_context(L, context); - lua_unset_script_context(L, context2); + lua_script_context_free(L, context); + lua_script_context_free(L, context2); tsg_destory_lua(L); free(out.str); } -TEST(lua_cache_exec_with_context, normal) +TEST(lua_cache_exec, normal) { tsg_lua_handle L = tsg_lua_vm_create_with_name("TEST"); @@ -145,8 +145,8 @@ TEST(lua_cache_exec_with_context, normal) lua_register_function(L, "get", "get_userdata", get_userdata); lua_script_context context = NULL; - lua_set_script_context(L, &context); - int ret = lua_cache_exec_with_context(L, script_id, in, (void *)ud, context, &out); + context = lua_script_context_malloc(L); + int ret = lua_cache_exec(L, script_id, in, (void *)ud, context, &out); const char *str = "userdata:hello world., context.count:1, context.message:This is first called"; EXPECT_EQ(0, ret); EXPECT_EQ(strlen(str), out.len); @@ -155,7 +155,7 @@ TEST(lua_cache_exec_with_context, normal) bzero(out.str, 1024); ud = "hello lua."; - ret = lua_cache_exec_with_context(L, script_id, in, (void *)ud, context, &out); + ret = lua_cache_exec(L, script_id, in, (void *)ud, context, &out); str = "userdata:hello lua., context.count:2, context.message:This is not first called"; EXPECT_EQ(0, ret); EXPECT_EQ(strlen(str), out.len); @@ -164,8 +164,8 @@ TEST(lua_cache_exec_with_context, normal) bzero(out.str, 1024); lua_script_context context2 = NULL; - lua_set_script_context(L, &context2); - ret = lua_cache_exec_with_context(L, script_id, in, (void *)ud, context2, &out); + context2 = lua_script_context_malloc(L); + ret = lua_cache_exec(L, script_id, in, (void *)ud, context2, &out); str = "userdata:hello lua., context.count:1, context.message:This is first called"; EXPECT_EQ(0, ret); EXPECT_EQ(strlen(str), out.len); @@ -173,8 +173,8 @@ TEST(lua_cache_exec_with_context, normal) EXPECT_STREQ(str, out.str); bzero(out.str, 1024); - lua_unset_script_context(L, context); - lua_unset_script_context(L, context2); + lua_script_context_free(L, context); + lua_script_context_free(L, context2); tsg_destory_lua(L); free(out.str); } diff --git a/src/tsg_lua_func.cpp b/src/tsg_lua_func.cpp index b19ec01..3eea13a 100644 --- a/src/tsg_lua_func.cpp +++ b/src/tsg_lua_func.cpp @@ -114,6 +114,7 @@ struct lua_private_info_t jmp_buf *lua_exception; char lua_name[1024]; void *userdata; + int errcode; }; //static jmp_buf lua_exception[TSG_MAX_LUA_ID]; @@ -488,7 +489,7 @@ tsg_lua_handle tsg_lua_vm_create_with_name(const char *name) return NULL; } - struct lua_private_info_t *lua_info = (struct lua_private_info_t *)malloc(sizeof(struct lua_private_info_t)); + struct lua_private_info_t *lua_info = (struct lua_private_info_t *)calloc(1, sizeof(struct lua_private_info_t)); if (lua_info == NULL) { free(lua_exception); @@ -507,6 +508,7 @@ tsg_lua_handle tsg_lua_vm_create_with_name(const char *name) memcpy(lua_info->lua_name, name, MIN(1023, len)); lua_info->lua_name[len] = '\0'; lua_info->userdata = NULL; + lua_info->errcode = 0; lua_setexdata(L, lua_info); lua_atpanic(L, c_lua_atpanic); luaL_openlibs(L); @@ -1589,7 +1591,7 @@ void *lua_get_userdata(tsg_lua_handle L) int lua_register_function(tsg_lua_handle L, const char *function_set, const char *function_name, lua_function_ptr const function) { - if (L == NULL || function_set == NULL || function_name == NULL || function == NULL) + if (L == NULL || function_name == NULL || function == NULL) { return ERR_PARAMETER; } @@ -1600,15 +1602,23 @@ int lua_register_function(tsg_lua_handle L, const char *function_set, const char } lua_getglobal(L, lua_info->lua_name); - lua_getfield(L, -1, function_set); - int ret = lua_type(L, -1); - if (ret != LUA_TTABLE) + if (function_set != NULL) { - lua_pop(L, 1); - lua_newtable(L); - lua_pushcfunction(L, function); - lua_setfield(L, -2, function_name); - lua_setfield(L, -2, function_set); + lua_getfield(L, -1, function_set); + int ret = lua_type(L, -1); + if (ret != LUA_TTABLE) + { + lua_pop(L, 1); + lua_newtable(L); + lua_pushcfunction(L, function); + lua_setfield(L, -2, function_name); + lua_setfield(L, -2, function_set); + } + else + { + lua_pushcfunction(L, function); + lua_setfield(L, -2, function_name); + } } else { @@ -1625,29 +1635,35 @@ struct lua_script_context_t int context_id; }; -int lua_set_script_context(tsg_lua_handle L, struct lua_script_context_t **context) +struct lua_script_context_t *lua_script_context_malloc(tsg_lua_handle L) { - if (L == NULL || *context != NULL) + if (L == NULL) { - return ERR_PARAMETER; + return NULL; } + struct lua_private_info_t *lua_info = (struct lua_private_info_t *)lua_getexdata(L); + if (lua_info == NULL) + { + return NULL; + } lua_newtable(L); int context_id = luaL_ref(L, LUA_REGISTRYINDEX); if (context_id == LUA_REFNIL || context_id == LUA_NOREF) { - return ERR_LUA_SET_CONTEXT_FAILED; + lua_info->errcode = ERR_LUA_CACHE_FAILED; + return NULL; } lua_settop(L, 0); - *context = (struct lua_script_context_t *)malloc(sizeof(struct lua_script_context_t *)); - (*context)->context_id = context_id; + struct lua_script_context_t *context = (struct lua_script_context_t *)malloc(sizeof(struct lua_script_context_t)); + context->context_id = context_id; - return 0; + return context; } -int lua_unset_script_context(tsg_lua_handle L, struct lua_script_context_t *context) +int lua_script_context_free(tsg_lua_handle L, struct lua_script_context_t *context) { if (L == NULL) { @@ -1665,7 +1681,7 @@ int lua_unset_script_context(tsg_lua_handle L, struct lua_script_context_t *cont return 0; } -int lua_cache_exec_with_context(tsg_lua_handle L, size_t script_id, struct lua_data_t in, void *userdata, lua_script_context context, struct lua_arg_t *outvalue) +int lua_cache_exec(tsg_lua_handle L, size_t script_id, struct lua_data_t in, void *userdata, lua_script_context context, struct lua_arg_t *outvalue) { if (L == NULL) { @@ -1695,7 +1711,7 @@ int lua_cache_exec_with_context(tsg_lua_handle L, size_t script_id, struct lua_d return tsg_lua_cache_exec(L, script_id, in.data, in.len, outvalue->str, &outvalue->len, &outvalue->type); } -int lua_exec_with_context(tsg_lua_handle L, struct lua_data_t script, struct lua_data_t in, void *userdata, lua_script_context context, struct lua_arg_t *outvalue) +int lua_exec(tsg_lua_handle L, struct lua_data_t script, struct lua_data_t in, void *userdata, lua_script_context context, struct lua_arg_t *outvalue) { if (L == NULL) { @@ -1726,7 +1742,7 @@ int lua_exec_with_context(tsg_lua_handle L, struct lua_data_t script, struct lua return tsg_lua_exec(L, script.data, script.len, in.data, in.len, outvalue->str, &outvalue->len, &outvalue->type); } -int lua_exec_file_with_context(tsg_lua_handle L, const char *script, struct lua_data_t in, void *userdata, lua_script_context context, struct lua_arg_t *outvalue) +int lua_exec_file(tsg_lua_handle L, const char *script, struct lua_data_t in, void *userdata, lua_script_context context, struct lua_arg_t *outvalue) { if (L == NULL) { @@ -1755,4 +1771,20 @@ int lua_exec_file_with_context(tsg_lua_handle L, const char *script, struct lua_ } return tsg_lua_exec_file(L, script, in.data, in.len, outvalue->str, &outvalue->len, &outvalue->type); +} + +int lua_get_error_code(tsg_lua_handle L) +{ + if (L == NULL) + { + return ERR_LUAVM_ISNULL; + } + + struct lua_private_info_t *lua_info = (struct lua_private_info_t *)lua_getexdata(L); + if (lua_info == NULL) + { + retunr ERR_LUA_PRIVATE_INFO_IS_NIL; + } + + return lua_info->errcode; }
\ No newline at end of file diff --git a/src/tsg_lua_interface.h b/src/tsg_lua_interface.h index 4f73d25..9369036 100644 --- a/src/tsg_lua_interface.h +++ b/src/tsg_lua_interface.h @@ -191,19 +191,18 @@ int lua_register_function(tsg_lua_handle L, const char *function_set, const char struct lua_script_context_t; typedef lua_script_context_t * lua_script_context; -/* 函数名: lua_set_script_context +/* 函数名: lua_script_context_malloc * 输入参数: tsg_lua_handle L - * 输出参数: lua_script_context **context 成功时返回lua context - * 返回值: int 成功,返回0;失败返回 -1*/ -int lua_set_script_context(tsg_lua_handle L, lua_script_context *context); + * 返回值: lua_script_context 失败返回 NULL,并设置error code*/ +lua_script_context lua_script_context_malloc(tsg_lua_handle L); -/* 函数名: lua_unset_script_context +/* 函数名: lua_script_context_free * 输入参数: tsg_lua_handle L * 输出参数: lua_script_context *context_id 成功时回收lua context * 返回值: int 成功,返回0;失败返回 -1*/ -int lua_unset_script_context(tsg_lua_handle L, lua_script_context context); +int lua_script_context_free(tsg_lua_handle L, lua_script_context context); -/* 函数名: lua_cache_exec_with_context +/* 函数名: lua_cache_exec * 输入参数: tsg_lua_handle L size_t script_id 缓存的脚本id struct lua_data_t in 待处理的数据 @@ -211,9 +210,9 @@ int lua_unset_script_context(tsg_lua_handle L, lua_script_context context); struct lua_script_context *context lua上下文 * 输出参数: struct lua_arg_t *outvalue 脚本执行成功返回的内容 * 返回值: int 成功,返回0;失败返回 -1*/ -int lua_cache_exec_with_context(tsg_lua_handle L, size_t script_id, struct lua_data_t in, void *userdata, lua_script_context context, struct lua_arg_t *outvalue); +int lua_cache_exec(tsg_lua_handle L, size_t script_id, struct lua_data_t in, void *userdata, lua_script_context context, struct lua_arg_t *outvalue); -/* 函数名: lua_cache_exec_with_context +/* 函数名: lua_exec * 输入参数: tsg_lua_handle L struct lua_data_t script lua脚本(lua脚本内容) struct lua_data_t in 待处理的数据 @@ -221,9 +220,9 @@ int lua_cache_exec_with_context(tsg_lua_handle L, size_t script_id, struct lua_d struct lua_script_context *context lua上下文 * 输出参数: struct lua_arg_t *outvalue 脚本执行成功返回的内容 * 返回值: int 成功,返回0;失败返回 -1*/ -int lua_exec_with_context(tsg_lua_handle L, struct lua_data_t script, struct lua_data_t in, void *userdata, lua_script_context context, struct lua_arg_t *outvalue); +int lua_exec(tsg_lua_handle L, struct lua_data_t script, struct lua_data_t in, void *userdata, lua_script_context context, struct lua_arg_t *outvalue); -/* 函数名: lua_cache_exec_with_context +/* 函数名: lua_cache_exec * 输入参数: tsg_lua_handle L struct script lua脚本(lua脚本路径) struct lua_data_t in 待处理的数据 @@ -231,11 +230,13 @@ int lua_exec_with_context(tsg_lua_handle L, struct lua_data_t script, struct lua struct lua_script_context *context lua上下文文 * 输出参数: struct lua_arg_t *outvalue 脚本执行成功返回的内容 * 返回值: int 成功,返回0;失败返回 -1*/ -int lua_exec_file_with_context(tsg_lua_handle L, const char *script, struct lua_data_t in, void *userdata, lua_script_context context, struct lua_arg_t *outvalue); +int lua_exec_file(tsg_lua_handle L, const char *script, struct lua_data_t in, void *userdata, lua_script_context context, struct lua_arg_t *outvalue); /* 函数名:tsg_lua_vm_create_with_name * 返回值:tsg_lua_handle 成功,返回一个虚拟机, * 输入参数: char *name 虚拟机名称,可以在lua中找到该名字的全局变量,建议大写字母开头。如果为空,默认填写"TSG" * 失败,返回NULL */ tsg_lua_handle tsg_lua_vm_create_with_name(const char *name); + +int lua_get_error_code(tsg_lua_handle L); #endif |
