summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpengxuanzheng <[email protected]>2020-08-24 17:10:55 +0800
committerpengxuanzheng <[email protected]>2020-08-24 17:10:55 +0800
commit503f4af4d8514913eb2ad0405b557abfd4326976 (patch)
tree5dd4f67e39f543c1cb1e2048eae0c0f720691c58
Initial commit
-rw-r--r--.gitignore42
-rw-r--r--example/CMakeLists.txt14
-rwxr-xr-xexample/multithreadbin0 -> 25480 bytes
-rw-r--r--example/multithread.cpp265
-rw-r--r--example/script/count_1.lua16
-rw-r--r--example/script/find_1.lua13
-rw-r--r--example/script/find_1.luajitbin0 -> 267 bytes
-rw-r--r--example/script/find_1_b.luabin0 -> 371 bytes
-rw-r--r--example/script/find_hello.lua8
-rw-r--r--example/script/find_hello.luajitbin0 -> 324 bytes
-rw-r--r--example/script/match_12345.lua24
-rw-r--r--example/script/print_hello.lua5
-rw-r--r--example/script/print_hello.luajitbin0 -> 124 bytes
-rw-r--r--example/script/protocol_recognition.lua79
-rwxr-xr-xexample/single_threadbin0 -> 25696 bytes
-rw-r--r--example/single_thread.cpp344
-rw-r--r--gtest/CMakeLists.txt13
-rw-r--r--gtest/gtest_tsg_destory_lua.cpp27
-rwxr-xr-xgtest/gtest_tsg_luabin0 -> 3869264 bytes
-rw-r--r--gtest/gtest_tsg_lua_cache_exec.cpp309
-rw-r--r--gtest/gtest_tsg_lua_cache_script.cpp168
-rw-r--r--gtest/gtest_tsg_lua_cache_script_bytecode_file.cpp44
-rw-r--r--gtest/gtest_tsg_lua_cache_script_file.cpp164
-rw-r--r--gtest/gtest_tsg_lua_exec.cpp500
-rw-r--r--gtest/gtest_tsg_lua_exec_bytecode.cpp311
-rw-r--r--gtest/gtest_tsg_lua_exec_bytecode_file.cpp293
-rw-r--r--gtest/gtest_tsg_lua_exec_file.cpp485
-rw-r--r--gtest/gtest_tsg_lua_uncache_script.cpp37
-rw-r--r--gtest/gtest_tsg_lua_vm_create.cpp16
-rw-r--r--gtest/script/call_global_but_nil.lua2
-rw-r--r--gtest/script/call_global_but_nil.luajitbin0 -> 75 bytes
-rw-r--r--gtest/script/do_expected.lua3
-rw-r--r--gtest/script/end_expected.lua3
-rw-r--r--gtest/script/eof_expected.lua4
-rw-r--r--gtest/script/equal_in_expected.lua4
-rw-r--r--gtest/script/name_expected.lua5
-rw-r--r--gtest/script/return_boolean_normal.lua6
-rw-r--r--gtest/script/return_boolean_normal.luajitbin0 -> 109 bytes
-rw-r--r--gtest/script/return_integer_normal.lua7
-rw-r--r--gtest/script/return_integer_normal.luajitbin0 -> 109 bytes
-rw-r--r--gtest/script/return_length_iszero.lua2
-rw-r--r--gtest/script/return_length_iszero.luajitbin0 -> 36 bytes
-rw-r--r--gtest/script/return_string_normal.lua2
-rw-r--r--gtest/script/return_string_normal.luajitbin0 -> 66 bytes
-rw-r--r--gtest/script/return_too_few.lua2
-rw-r--r--gtest/script/return_too_few.luajitbin0 -> 51 bytes
-rw-r--r--gtest/script/return_too_much.lua2
-rw-r--r--gtest/script/return_too_much.luajitbin0 -> 63 bytes
-rw-r--r--gtest/script/return_type_invaild.lua2
-rw-r--r--gtest/script/return_type_invaild.luajitbin0 -> 59 bytes
-rw-r--r--gtest/script/right_curly_bracket_expected.lua4
-rw-r--r--gtest/script/right_curves_bracket_expected.lua2
-rw-r--r--gtest/script/string_expected_but_boolean.lua3
-rw-r--r--gtest/script/string_expected_but_boolean.luajitbin0 -> 59 bytes
-rw-r--r--gtest/script/string_expected_but_nil.lua1
-rw-r--r--gtest/script/string_expected_but_nil.luajitbin0 -> 53 bytes
-rw-r--r--gtest/script/string_expected_but_table.lua2
-rw-r--r--gtest/script/string_expected_but_table.luajitbin0 -> 63 bytes
-rw-r--r--gtest/script/then_expected.lua4
-rw-r--r--gtest/script/unexpected_symbol.lua3
-rw-r--r--include/tsg_lua_interface.h126
-rw-r--r--lib/libtsglua.abin0 -> 43946 bytes
-rwxr-xr-xlib/libtsglua.sobin0 -> 615024 bytes
-rw-r--r--src/CMakeLists.txt14
-rw-r--r--src/tsg_lua_func.cpp1329
-rw-r--r--test/CMakeLists.txt9
-rwxr-xr-xtest/cache_bytecode_Gbin0 -> 38496 bytes
-rwxr-xr-xtest/multithread_testbin0 -> 40520 bytes
-rw-r--r--test/multithread_test.cpp384
-rw-r--r--test/multithread_test.lua48
-rw-r--r--test/multithread_test.luajitbin0 -> 113 bytes
-rwxr-xr-xtest/singlethread_testbin0 -> 38496 bytes
-rw-r--r--test/test.cpp316
-rw-r--r--test/test.lua16
-rw-r--r--test/test.luajitbin0 -> 113 bytes
75 files changed, 5482 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c5c1890
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,42 @@
+CMakeCache.txt
+CMakeCCompiler.cmake
+CMakeCXXCompiler.cmake
+CMakeDetermineCompilerABI_C.bin
+CMakeDetermineCompilerABI_CXX.bin
+CMakeSystem.cmake
+CMakeCCompilerId.c
+a.out
+CMakeCXXCompilerId.cpp
+CMakeDirectoryInformation.cmake
+CMakeOutput.log
+Makefile.cmake
+Makefile2
+TargetDirectories.txt
+CXX.includecache
+DependInfo.cmake
+build.make
+cmake_clean.cmake
+depend.internal
+depend.make
+flags.make
+handle_weixinnum.cpp.o
+link.txt
+progress.make
+cmake_clean_target.cmake
+cmake.check_cache
+feature_tests.bin
+feature_tests.c
+feature_tests.cxx
+handle_fasta_count.cpp.o
+handle_fasta_find.cpp.o
+progress.marks
+Makefile
+cmake_install.cmake
+libc_handle_weixinnum.a
+libc_handle_weixinnum.so
+libhandle_fasta_count.a
+libhandle_fasta_count.so
+libhandle_fasta_find.a
+libhandle_fasta_find.so
+luatest
+tags
diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt
new file mode 100644
index 0000000..f696207
--- /dev/null
+++ b/example/CMakeLists.txt
@@ -0,0 +1,14 @@
+cmake_minimum_required(VERSION 3.5)
+project (single_thread)
+project (multithread)
+
+link_directories("/root/workspace/tsg_lua_0.99/lib")
+link_libraries(tsglua pthread)
+
+add_definitions(-g -W -Wall)
+
+add_executable(single_thread single_thread.cpp)
+add_executable(multithread multithread.cpp)
+target_link_libraries(single_thread tsglua)
+target_link_libraries(multithread tsglua)
+
diff --git a/example/multithread b/example/multithread
new file mode 100755
index 0000000..d7d9dbd
--- /dev/null
+++ b/example/multithread
Binary files differ
diff --git a/example/multithread.cpp b/example/multithread.cpp
new file mode 100644
index 0000000..26b45ec
--- /dev/null
+++ b/example/multithread.cpp
@@ -0,0 +1,265 @@
+/*************************************************************************
+ > File Name: main.c
+ > Author: pxz
+ > Created Time: Thu 09 Jul 2020 07:08:40 AM CST
+ ************************************************************************/
+extern "C"
+{
+ #include<stdio.h>
+ #include<stdlib.h>
+ #include<string.h>
+ #include<pthread.h>
+ #include<unistd.h>
+ #include<time.h>
+}
+#include"../include/tsg_lua_interface.h"
+#ifndef MAX_THREAD_NUM
+#define MAX_THREAD_NUM 9
+#endif
+#define MAX_SCRIPT_NUM 3
+#define SCRIPT_NO_CACHE -1
+
+typedef struct lua_script_info_s{
+ const char *script_data;
+ int script_len;
+ int script_id;
+}lua_script_info_t;
+
+typedef struct lua_data_s{
+ char data[1024];
+ int data_len;
+}lua_data_t;
+
+typedef struct{
+ lua_data_t data;
+ int thread_id;
+}userdata_t;
+
+
+/* 存储脚本以及脚本id */
+#define SCRIPT_PROTOCOL_RECOGNITION "./script/protocol_recognition.lua"
+#define SCRIPT_COUNT_1 "./script/count_1.lua"
+#define SCRIPT_MATCH_12345 "./script/match_12345.lua"
+
+void debuginfo(int thread_id, char *out, int out_len, int out_type)
+{
+ printf("[C][thread_id:%d]output.len:%d\n", thread_id, out_len);
+ printf("[C][thread_id:%d]output.type:%d\n", thread_id, out_type);
+ switch(out_type)
+ {
+ case STRING:
+ printf("[C][thread_id:%d]output.data:%s\n", thread_id, out);
+ break;
+ case BOOLEAN:
+ printf("[C][thread_id:%d]outpt.data:%d\n", thread_id, out[0]);
+ break;
+ case INTEGER:
+ printf("[C][thread_id:%d]outpt.data:%ld\n", thread_id, *(long int *)out);
+ break;
+ default:
+
+ break;
+ }
+ return;
+}
+
+void *lua_function(void *ptr)
+{
+ int ret;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+ memset(out, 0, 255);
+ tsg_lua_handle L = NULL;
+
+ userdata_t *userdata = (userdata_t *)ptr;
+ lua_data_t *data = &userdata->data;
+ int thread_id = userdata->thread_id;
+
+ lua_script_info_t script_info[MAX_SCRIPT_NUM] =
+ {
+ {SCRIPT_PROTOCOL_RECOGNITION, (int)strlen(SCRIPT_PROTOCOL_RECOGNITION), SCRIPT_NO_CACHE},
+ {SCRIPT_COUNT_1, (int)strlen(SCRIPT_COUNT_1), SCRIPT_NO_CACHE},
+ {SCRIPT_MATCH_12345, (int)strlen(SCRIPT_MATCH_12345), SCRIPT_NO_CACHE},
+ };
+
+ printf("[C][thread_id:%d]:tsg_lua_vm_create start...\n", thread_id);
+ L = tsg_lua_vm_create();
+ if (L == NULL)
+ {
+ printf("[C][thread_id:%d]:tsg_lua_vm_create failed...\n", thread_id);
+ return (void *)"lua vm create failed";
+ }
+ printf("[C][thread_id:%d]:lua:%p ...\n", thread_id, L);
+ printf("[C][thread_id:%d]:tsg_lua_vm_create success...\n", thread_id);
+
+ printf("[C][thread_id:%d]:tsg_lua_exec_file start...\n", thread_id);
+ ret = tsg_lua_exec_file(L, script_info[0].script_data, data->data, data->data_len, out, &out_len, &out_type);
+ if(ret < 0)
+ {
+ printf("[C][thread_id:%d]:tsg_lua_exec_file failed...\n", thread_id);
+ return (void *)"exec failed";
+ }
+ debuginfo(thread_id, out, out_len, out_type);
+ printf("[C][thread_id:%d]:tsg_lua_exec_file success...\n", thread_id);
+
+ printf("[C][thread_id:%d]:tsg_lua_cache_script_file start...\n", thread_id);
+ script_info[1].script_id = tsg_lua_cache_script_file(L, script_info[1].script_data);
+ if (script_info[1].script_id < 0)
+ {
+ printf("[C][thread_id:%d]:tsg_lua_cache_script_file failed...\n", thread_id);
+ return (void *)"cache script failed";
+ }
+ printf("[C][thread_id:%d]:script_id:%d ...\n", thread_id, script_info[1].script_id);
+ printf("[C][thread_id:%d]:tsg_lua_cache_script_file success...\n", thread_id);
+
+ printf("[C][thread_id:%d]:tsg_lua_cache_exec start...\n", thread_id);
+ ret = tsg_lua_cache_exec(L, script_info[1].script_id, data->data, data->data_len, out, &out_len, &out_type);
+ if(ret < 0)
+ {
+ printf("[C][thread_id:%d]:tsg_lua_cache_exec failed...\n", thread_id);
+ return (void *)"cache exec failed";
+ }
+ debuginfo(thread_id, out, out_len, out_type);
+ printf("[C][thread_id:%d]:tsg_lua_cache_exec success...\n", thread_id);
+
+ printf("[C][thread_id:%d]:tsg_lua_cache_script_file start...\n", thread_id);
+ script_info[2].script_id = tsg_lua_cache_script_file(L, script_info[2].script_data);
+ if (script_info[2].script_id < 0)
+ {
+ printf("[C][thread_id:%d]:tsg_lua_cache_script_file failed...\n", thread_id);
+ return (void *)"cache script failed";
+ }
+ printf("[C][thread_id:%d]:script_id:%d ...\n", thread_id, script_info[2].script_id);
+ printf("[C][thread_id:%d]:tsg_lua_cache_script_file success...\n", thread_id);
+
+ printf("[C][thread_id:%d]:tsg_lua_cache_exec start...\n", thread_id);
+ ret = tsg_lua_cache_exec(L, script_info[2].script_id, data->data, data->data_len, out, &out_len, &out_type);
+ if(ret < 0)
+ {
+ printf("[C][thread_id:%d]:tsg_lua_cache_exec failed...\n", thread_id);
+ return (void *)"cache exec failed";
+ }
+ debuginfo(thread_id, out, out_len, out_type);
+ printf("[C][thread_id:%d]:tsg_lua_cache_exec success...\n", thread_id);
+
+ printf("[C][thread_id:%d]:tsg_lua_uncache_script start...\n", thread_id);
+ ret = tsg_lua_uncache_script(L, script_info[1].script_id);
+ if(ret < 0)
+ {
+ printf("[C][thread_id:%d]:tsg_lua_uncache_script failed...\n", thread_id);
+ return (void *)"uncache script failed";
+ }
+ printf("[C][thread_id:%d]:tsg_uncache_script success...\n", thread_id);
+
+ printf("[C][thread_id:%d]:tsg_lua_uncache_script start...\n", thread_id);
+ ret = tsg_lua_uncache_script(L, script_info[2].script_id);
+ if(ret < 0)
+ {
+ printf("[C][thread_id:%d]:tsg_lua_uncache_script failed...\n", thread_id);
+ return (void *)"uncache script failed";
+ }
+ printf("[C][thread_id:%d]:tsg_uncache_script success...\n", thread_id);
+
+ printf("[C][thread_id:%d]:tsg_destory_lua start...\n", thread_id);
+ ret = tsg_destory_lua(L);
+ if(ret < 0)
+ {
+ printf("[C][thread_id:%d]:tsg_destory_lua failed...\n", thread_id);
+ return (void *)"uncache script failed";
+ }
+ printf("[C][thread_id:%d]:tsg_destory_lua success...\n", thread_id);
+ pthread_exit((void *)"OK");
+}
+
+
+int main(int argc, char *argv[])
+{
+ int thread_num;
+ pthread_t thread[MAX_THREAD_NUM] = {0};
+ int thread_sum;
+ int ch, i;
+ char buf[1024];
+ int buf_len;
+ userdata_t userdata[MAX_THREAD_NUM] = {0};
+ lua_data_t *data = NULL;
+ char *retval;
+
+#ifndef MIN
+#define MIN(a, b) ((a) > (b) ?(b):(a))
+#endif
+
+ /* default */
+ thread_sum = 3;
+ strcpy(buf, "this is tcp");
+ buf_len = strlen("this is tcp");
+
+ while((ch = getopt(argc, argv, "t:s:b:d:h")) != -1)
+ {
+ switch(ch)
+ {
+ case 't':
+ thread_sum = atoi(optarg);
+ if (thread_sum > MAX_THREAD_NUM)
+ {
+ printf("MAX_THREAD_NUM is %d\n",MAX_THREAD_NUM);
+ thread_sum = MAX_THREAD_NUM;
+ }
+ break;
+ case 's':
+ buf_len = MIN(1024, strlen(optarg));
+ strncpy(buf, optarg, buf_len);
+ buf[buf_len] = '\0';
+ break;
+ case 'b':
+ buf_len = MIN(1024, strlen(optarg));
+ for (i = 0; i < buf_len; i++)
+ {
+ if ((optarg[i] != '0') && (optarg[i] != '1'))
+ {
+ printf("error: input wrong\n");
+ return -1;
+ }
+ buf[i] = optarg[i] - '0';
+ }
+ break;
+ case 'd':
+ buf_len = MIN(1024, strlen(optarg));
+ for (i = 0; i < buf_len; i++)
+ {
+ if ((optarg[i] < '0') && (optarg[i] > '9'))
+ {
+ printf("error: input wrong\n");
+ return -1;
+ }
+ buf[i] = optarg[i] - '0';
+ }
+ break;
+ case 'h':
+ default:
+ printf("usage: multithread [-t set thread num] [-s input string] [-b input bin] [-d input integer] [-h show help info]\n");
+ return -1;
+ break;
+ }
+ }
+
+ for (thread_num = 0; thread_num < thread_sum; thread_num++)
+ {
+ userdata[thread_num].thread_id = thread_num;
+ data = &userdata[thread_num].data;
+ memcpy(data->data, buf, buf_len);
+ data->data_len = buf_len;
+ data->data[buf_len] = thread_num;
+ data->data_len++;
+ pthread_create(&thread[thread_num], NULL, lua_function, (void *)&userdata[thread_num]);
+ }
+
+ for (thread_num = 0; thread_num < thread_sum; thread_num++)
+ {
+ pthread_join(thread[thread_num], (void **)&retval);
+ printf("[C][thread_id:%d]: %s\n", thread_num, retval);
+ }
+
+ return 0;
+}
diff --git a/example/script/count_1.lua b/example/script/count_1.lua
new file mode 100644
index 0000000..21e5091
--- /dev/null
+++ b/example/script/count_1.lua
@@ -0,0 +1,16 @@
+local str = tsg.data
+local len = string.len(str)
+local thread_id = string.byte(str, len)
+local str = string.format("[lua][thread_id:%d][count_1.lua]:str:%s, len:%d", thread_id, str, len - 1)
+print(str)
+local cnt = 0
+local i = 0
+for i = 0, len - 1 do
+ --print(i, string.byte(str, i), cnt)
+ if string.byte(str, i) == 1 then
+ cnt = cnt + 1
+ end
+end
+str = string.format("[lua][thread_id:%d][count_1.lua]:return %d, %s", thread_id, 8, cnt)
+print(str)
+return 8, cnt
diff --git a/example/script/find_1.lua b/example/script/find_1.lua
new file mode 100644
index 0000000..2c6e865
--- /dev/null
+++ b/example/script/find_1.lua
@@ -0,0 +1,13 @@
+local data = tsg.data
+local data_len = string.len(data)
+local str = string.format("[lua]:data:%s len:%d", data, data_len)
+print(str)
+for i = 1, data_len do
+ if string.byte(data, i) == 1 then
+ str = string.format("[lua]:return %d, %d", 8, i)
+ print(str);
+ return 8, i
+ end
+end
+return 1, true
+
diff --git a/example/script/find_1.luajit b/example/script/find_1.luajit
new file mode 100644
index 0000000..b558ed1
--- /dev/null
+++ b/example/script/find_1.luajit
Binary files differ
diff --git a/example/script/find_1_b.lua b/example/script/find_1_b.lua
new file mode 100644
index 0000000..d04801f
--- /dev/null
+++ b/example/script/find_1_b.lua
Binary files differ
diff --git a/example/script/find_hello.lua b/example/script/find_hello.lua
new file mode 100644
index 0000000..89037c0
--- /dev/null
+++ b/example/script/find_hello.lua
@@ -0,0 +1,8 @@
+local ss = tsg.data
+print("[lua]:the parameter of lua function is '"..ss.."'")
+print("[lua]:start find 'hello'...")
+local index_s, index_e = string.find(ss, 'hello')
+local str = 'find!'
+print("[lua]:result, start at", index_s, ", end at",index_e)
+print("[lua]: return ", string.len(str), str)
+return string.len(str), str
diff --git a/example/script/find_hello.luajit b/example/script/find_hello.luajit
new file mode 100644
index 0000000..ba644ec
--- /dev/null
+++ b/example/script/find_hello.luajit
Binary files differ
diff --git a/example/script/match_12345.lua b/example/script/match_12345.lua
new file mode 100644
index 0000000..c795bd3
--- /dev/null
+++ b/example/script/match_12345.lua
@@ -0,0 +1,24 @@
+local str = tsg.data
+local len = string.len(str)
+local thread_id = string.byte(str, len)
+local str = string.format("[lua][thread_id:%d][match_12345.lua]:str:%s, len:%d", thread_id, str, len - 1)
+print(str)
+local i = 0
+for i = 1, string.len(str) do
+ if string.byte(str, i) == 1 then
+ if string.byte(str, i + 1) == 2 then
+ if string.byte(str, i + 2) == 3 then
+ if string.byte(str, i + 3) == 4 then
+ if string.byte(str, i + 4) == 5 then
+ local str = string.format("[lua][thread_id:%d][match_12345.lua]:return %d, %s", thread_id, 1, "true")
+ print(str)
+ return 1, true
+ end
+ end
+ end
+ end
+ end
+end
+local str = string.format("[lua][thread_id:%d][match_12345.lua]:return %d, %s", thread_id, 1, "false")
+print(str)
+return 1, false
diff --git a/example/script/print_hello.lua b/example/script/print_hello.lua
new file mode 100644
index 0000000..ee823e7
--- /dev/null
+++ b/example/script/print_hello.lua
@@ -0,0 +1,5 @@
+local str = tsg.data
+print("-----------")
+print("str")
+print("-----------")
+return string.len(str), str
diff --git a/example/script/print_hello.luajit b/example/script/print_hello.luajit
new file mode 100644
index 0000000..c9eb05b
--- /dev/null
+++ b/example/script/print_hello.luajit
Binary files differ
diff --git a/example/script/protocol_recognition.lua b/example/script/protocol_recognition.lua
new file mode 100644
index 0000000..0987232
--- /dev/null
+++ b/example/script/protocol_recognition.lua
@@ -0,0 +1,79 @@
+local str = tsg.data;
+local len = string.len(str)
+local thread_id = string.byte(str, -1)
+local info = string.format("[lua][thread_id:%d][protocol_recognition.lua]:str:%s, str_len:%d", thread_id, str, len - 1)
+print(info)
+local ret = "unrecognition."
+local index, _ = string.find(str, "tcp")
+if index then
+ ret = "tcp"
+ info = string.format("[lua][thread_id:%d][protocol_recognition.lua]:return str_len:%d, str:%s", thread_id, string.len(ret), ret)
+ print(info)
+ return string.len(ret), ret
+end
+index, _ = string.find(str, "udp")
+if index then
+ ret = "udp"
+ info = string.format("[lua][thread_id:%d][protocol_recognition.lua]:return str_len:%d, str:%s", thread_id, string.len(ret), ret)
+ print(info)
+ return string.len(ret), ret
+end
+index, _ = string.find(str, "ssh")
+if index then
+ ret = "ssh"
+ info = string.format("[lua][thread_id:%d][protocol_recognition.lua]:return str_len:%d, str:%s", thread_id, string.len(ret), ret)
+ print(info)
+ return string.len(ret), ret
+end
+index, _ = string.find(str, "vnc")
+if index then
+ ret = "vnc"
+ info = string.format("[lua][thread_id:%d][protocol_recognition.lua]:return str_len:%d, str:%s", thread_id, string.len(ret), ret)
+ print(info)
+ return string.len(ret), ret
+end
+index, _ = string.find(str, "sock")
+if index then
+ ret = "sock"
+ info = string.format("[lua][thread_id:%d][protocol_recognition.lua]:return str_len:%d, str:%s", thread_id, string.len(ret), ret)
+ print(info)
+ return string.len(ret), ret
+end
+index, _ = string.find(str, "quic")
+if index then
+ ret = "quic"
+ info = string.format("[lua][thread_id:%d][protocol_recognition.lua]:return str_len:%d, str:%s", thread_id, string.len(ret), ret)
+ print(info)
+ return string.len(ret), ret
+end
+index, _ = string.find(str, "pop3")
+if index then
+ ret = "pop3"
+ info = string.format("[lua][thread_id:%d][protocol_recognition.lua]:return str_len:%d, str:%s", thread_id, string.len(ret), ret)
+ print(info)
+ return string.len(ret), ret
+end
+index, _ = string.find(str, "smpt")
+if index then
+ ret = "smpt"
+ info = string.format("[lua][thread_id:%d][protocol_recognition.lua]:return str_len:%d, str:%s", thread_id, string.len(ret), ret)
+ print(info)
+ return string.len(ret), ret
+end
+index, _ = string.find(str, "imap")
+if index then
+ ret = "imap"
+ info = string.format("[lua][thread_id:%d][protocol_recognition.lua]:return str_len:%d, str:%s", thread_id, string.len(ret), ret)
+ print(info)
+ return string.len(ret), ret
+end
+index, _ = string.find(str, "http")
+if index then
+ ret = "http"
+ info = string.format("[lua][thread_id:%d][protocol_recognition.lua]:return str_len:%d, str:%s", thread_id, string.len(ret), ret)
+ print(info)
+ return string.len(ret), ret
+end
+info = string.format("[lua][thread_id:%d][protocol_recognition.lua]:return str_len:%d, str:%s", thread_id, string.len(ret), ret)
+print(info)
+return string.len(ret), ret
diff --git a/example/single_thread b/example/single_thread
new file mode 100755
index 0000000..c460291
--- /dev/null
+++ b/example/single_thread
Binary files differ
diff --git a/example/single_thread.cpp b/example/single_thread.cpp
new file mode 100644
index 0000000..b4efcc4
--- /dev/null
+++ b/example/single_thread.cpp
@@ -0,0 +1,344 @@
+/*************************************************************************
+ > File Name: main.c
+ > Author: pxz
+ > Created Time: Thu 09 Jul 2020 07:08:40 AM CST
+ ************************************************************************/
+extern "C"
+{
+ #include<stdio.h>
+ #include<string.h>
+}
+#include"../include/tsg_lua_interface.h"
+char *content0 = (char *)"HanMeimei said \"hello\" to LiLei";
+char content1[255];
+
+char *contents[] ={content0, content1};
+
+
+int main()
+{
+ const char *script = "./script/find_hello.lua";
+ const char *script1 = "./script/find_1.luajit";
+ const char *script2 = "local str = tsg.data print(str) return string.len(str), str";
+ const char *script3 = "\x1B\x4C\x4A\x02\x0A\x75\x02\x00"\
+ "\x04\x00\x07\x00\x11\x36\x00\x00"\
+ "\x00\x39\x00\x01\x00\x36\x01\x02"\
+ "\x00\x27\x03\x03\x00\x42\x01\x02"\
+ "\x01\x36\x01\x02\x00\x27\x03\x04"\
+ "\x00\x42\x01\x02\x01\x36\x01\x02"\
+ "\x00\x27\x03\x03\x00\x42\x01\x02"\
+ "\x01\x36\x01\x05\x00\x39\x01\x06"\
+ "\x01\x12\x03\x00\x00\x42\x01\x02"\
+ "\x02\x12\x02\x00\x00\x4A\x01\x03"\
+ "\x00\x08\x6C\x65\x6E\x0B\x73\x74"\
+ "\x72\x69\x6E\x67\x08\x73\x74\x72"\
+ "\x10\x2D\x2D\x2D\x2D\x2D\x2D\x2D"\
+ "\x2D\x2D\x2D\x2D\x0A\x70\x72\x69"\
+ "\x6E\x74\x09\x64\x61\x74\x61\x08"\
+ "\x74\x73\x67\x00";
+ tsg_lua_handle L = NULL;
+ content1[128] = 1;
+ //memset(content1, 1, sizeof(content1));
+ /* 初始化1个虚拟机 */
+ printf("\n*********************tsg_lua_vm_create************************\n");
+ printf("[C]:call tsg_lua_vm_create...\n");
+ L = tsg_lua_vm_create();
+ if (L == NULL)
+ {
+ printf("[C]:call tsg_lua_vm_create failed.\n");
+ return -1;
+ }
+ printf("[C]:call tsg_lua_vm_create success.\t lua:%p\n", L);
+
+ char out[255];
+ memset(out, 0, sizeof(out));
+ size_t out_len;
+ size_t out_type;
+ printf("\n=============================file==================================\n");
+ printf("\n*********************tsg_lua_exec_file************************\n");
+ printf("[C]:call tsg_lua_exec_file, exec %s ...\n", script);
+ int ret = tsg_lua_exec_file(L, script, content0, strlen(content0), out, &out_len, &out_type);
+ if (ret < 0)
+ {
+ printf("[C]:call tsg_lua_exec_file failed.\n");
+ return -1;
+ }
+ printf("[C]:call tsg_lua_exec_file success.\n");
+ printf("[C]:out_len:%ld\n", out_len);
+ printf("[C]:out_type:%ld\n", out_type);
+ switch(out_type)
+ {
+ case STRING:
+ printf("[C]:out_data:%s\n", out);
+ break;
+ case INTEGER:
+ printf("[C]:out_data:%ld\n", *(long int *)out);
+ break;
+ case BOOLEAN:
+ printf("[C]:out_data:%d\n", out[0]);
+ break;
+ }
+
+ printf("\n*********************tsg_lua_exec_file************************\n");
+ printf("[C]:call tsg_lua_exec_file, exec %s ...\n", script1);
+ ret = tsg_lua_exec_file(L, script1, content0, strlen(content0), out, &out_len, &out_type);
+ if (ret < 0)
+ {
+ printf("[C]:call tsg_lua_exec_file failed.\n");
+ return -1;
+ }
+ printf("[C]:call tsg_lua_exec_file success.\n");
+ printf("[C]:out_len:%ld\n", out_len);
+ printf("[C]:out_type:%ld\n", out_type);
+ switch(out_type)
+ {
+ case STRING:
+ printf("[C]:out_data:%s\n", out);
+ break;
+ case INTEGER:
+ printf("[C]:out_data:%ld\n", *(long int *)out);
+ break;
+ case BOOLEAN:
+ printf("[C]:out_data:%d\n", out[0]);
+ break;
+ }
+
+ /* lua 缓存脚本, 再运行 */
+ memset(out, 0, sizeof(out));
+ printf("\n*********************tsg_lua_cache_script_file************************\n");
+ printf("[C]: call tsg_lua_cache_script_file, script:%s ...\n", script);
+ int script_id = tsg_lua_cache_script_file(L, script);
+ if (script_id < 0)
+ {
+ printf("[C]: call tsg_lua_cache_script_file failed.\n");
+ return -1;
+ }
+ printf("[C]: call tsg_lua_cache_script_file success.\t script_id:%d\n", script_id);
+
+ printf("\n*********************tsg_lua_cache_exec************************\n");
+ printf("[C]: call tsg_lua_cache_exec ...\n");
+ ret = tsg_lua_cache_exec(L, script_id, content1, 255, out, &out_len, &out_type);
+ if (ret < 0)
+ {
+ printf("[C]: call tsg_lua_cache_exec failed.\n");
+ return -1;
+ }
+ printf("[C]: call tsg_lua_cache_exec success\n");
+ printf("[C]:out_len:%ld\n", out_len);
+ printf("[C]:out_type:%ld\n", out_type);
+ switch(out_type)
+ {
+ case STRING:
+ printf("[C]:out_data:%s\n", out);
+ break;
+ case BOOLEAN:
+ printf("[C]:out_data:%d\n", out[0]);
+ break;
+ case INTEGER:
+ printf("[C]:out_data:%ld\n", *(long int *)out);
+ break;
+ }
+
+ memset(out, 0, sizeof(out));
+ printf("\n*********************tsg_lua_cache_script_file************************\n");
+ printf("[C]: call tsg_lua_cache_script_file, script:%s ...\n", script1);
+ int script_id1 = tsg_lua_cache_script_file(L, script1);
+ if (script_id1 < 0)
+ {
+ printf("[C]: call tsg_lua_cache_script_file failed.\n");
+ return -1;
+ }
+ printf("[C]: call tsg_lua_cache_script_file success.\t script_id:%d\n", script_id1);
+
+ printf("\n*********************tsg_lua_cache_exec************************\n");
+ printf("[C]: call tsg_lua_cache_exec ...\n");
+ ret = tsg_lua_cache_exec(L, script_id1, content1, 255, out, &out_len, &out_type);
+ if (ret < 0)
+ {
+ printf("[C]: call tsg_lua_cache_exec failed.\n");
+ return -1;
+ }
+ printf("[C]: call tsg_lua_cache_exec success\n");
+ printf("[C]:out_len:%ld\n", out_len);
+ printf("[C]:out_type:%ld\n", out_type);
+ switch(out_type)
+ {
+ case STRING:
+ printf("[C]:out_data:%s\n", out);
+ break;
+ case BOOLEAN:
+ printf("[C]:out_data:%d\n", out[0]);
+ break;
+ case INTEGER:
+ printf("[C]:out_data:%ld\n", *(long int *)out);
+ break;
+ }
+
+ /****************************************************************************************/
+ printf("\n=============================string==================================\n");
+ memset(out, 0, sizeof(out));
+ printf("\n*********************tsg_lua_exec************************\n");
+ printf("[C]: call tsg_lua_exec, text-script ...\n");
+ ret = tsg_lua_exec(L, script2, strlen(script2), "hello wrold", 11, out, &out_len, &out_type);
+ if (ret < 0)
+ {
+ printf("[C]: call tsg_lua_exec failed ...\n");
+ return -1;
+ }
+ printf("[C]: call tsg_lua_exec success ...\n");
+ printf("[C]:out_len:%ld\n", out_len);
+ printf("[C]:out_type:%ld\n", out_type);
+ switch(out_type)
+ {
+ case STRING:
+ printf("[C]:out_data:%s\n", out);
+ break;
+ case BOOLEAN:
+ printf("[C]:out_data:%d\n", out[0]);
+ break;
+ case INTEGER:
+ printf("[C]:out_data:%ld\n", *(long int *)out);
+ break;
+ }
+
+ memset(out, 0, sizeof(out));
+ printf("\n*********************tsg_lua_exec************************\n");
+ printf("[C]: call tsg_lua_exec, bytecode-script ...\n");
+ ret = tsg_lua_exec(L, script3, 124, "hello wrold", 11, out, &out_len, &out_type);
+ if (ret < 0)
+ {
+ printf("[C]: call tsg_lua_exec failed ...\n");
+ return -1;
+ }
+ printf("[C]: call tsg_lua_exec success ...\n");
+ printf("[C]:out_len:%ld\n", out_len);
+ printf("[C]:out_type:%ld\n", out_type);
+ switch(out_type)
+ {
+ case STRING:
+ printf("[C]:out_data:%s\n", out);
+ break;
+ case BOOLEAN:
+ printf("[C]:out_data:%d\n", out[0]);
+ break;
+ case INTEGER:
+ printf("[C]:out_data:%ld\n", *(long int *)out);
+ break;
+ }
+ memset(out, 0, sizeof(out));
+ printf("\n*********************tsg_lua_cache_script************************\n");
+ printf("[C]: call tsg_lua_cache_script, text-script ...\n");
+ int script_id2 = tsg_lua_cache_script(L, script2, strlen(script2));
+ if (script_id2 < 0)
+ {
+ printf("[C]: call tsg_lua_cache_script failed.\n");
+ return -1;
+ }
+ printf("[C]: call tsg_lua_cache_script success.\t script_id:%d\n", script_id2);
+
+ printf("\n*********************tsg_lua_cache_exec************************\n");
+ printf("[C]: call tsg_lua_cache_exec ...\n");
+ ret = tsg_lua_cache_exec(L, script_id2, "hello wrold", 11, out, &out_len, &out_type);
+ if (ret < 0)
+ {
+ printf("[C]: call tsg_lua_cache_exec failed.\n");
+ return -1;
+ }
+ printf("[C]: call tsg_lua_cache_exec success\n");
+ printf("[C]:out_len:%ld\n", out_len);
+ printf("[C]:out_type:%ld\n", out_type);
+ switch(out_type)
+ {
+ case STRING:
+ printf("[C]:out_data:%s\n", out);
+ break;
+ case BOOLEAN:
+ printf("[C]:out_data:%d\n", out[0]);
+ break;
+ case INTEGER:
+ printf("[C]:out_data:%ld\n", *(long int *)out);
+ break;
+ }
+ memset(out, 0, sizeof(out));
+ printf("\n*********************tsg_lua_cache_script************************\n");
+ printf("[C]: call tsg_lua_cache_script, text-script ...\n");
+ int script_id3 = tsg_lua_cache_script(L, script3, 124);
+ if (script_id3 < 0)
+ {
+ printf("[C]: call tsg_lua_cache_script failed.\n");
+ return -1;
+ }
+ printf("[C]: call tsg_lua_cache_script success.\t script_id:%d\n", script_id3);
+
+ printf("\n*********************tsg_lua_cache_exec************************\n");
+ printf("[C]: call tsg_lua_cache_exec ...\n");
+ ret = tsg_lua_cache_exec(L, script_id3, "hello world", 11, out, &out_len, &out_type);
+ if (ret < 0)
+ {
+ printf("[C]: call tsg_lua_cache_exec failed.\n");
+ return -1;
+ }
+ printf("[C]: call tsg_lua_cache_exec success\n");
+ printf("[C]:out_len:%ld\n", out_len);
+ printf("[C]:out_type:%ld\n", out_type);
+ switch(out_type)
+ {
+ case STRING:
+ printf("[C]:out_data:%s\n", out);
+ break;
+ case BOOLEAN:
+ printf("[C]:out_data:%d\n", out[0]);
+ break;
+ case INTEGER:
+ printf("[C]:out_data:%ld\n", *(long int *)out);
+ break;
+ }
+ /* lua 注销脚本 */
+ memset(out, 0, sizeof(out));
+ printf("\n*********************tsg_lua_uncache_script************************\n");
+ printf("[C]: call tsg_lua_uncache_script, script_id:%d ...\n", script_id);
+ ret = tsg_lua_uncache_script(L, script_id);
+ if (ret < 0)
+ {
+ printf("[C]: call tsg_lua_uncache_script failed.\n");
+ return -1;
+ }
+ printf("[C]: call tsg_lua_uncache_script success\n");
+ printf("\n*********************tsg_lua_uncache_script************************\n");
+ printf("[C]: call tsg_lua_uncache_script, script_id:%d ...\n", script_id1);
+ ret = tsg_lua_uncache_script(L, script_id1);
+ if (ret < 0)
+ {
+ printf("[C]: call tsg_lua_uncache_script failed.\n");
+ return -1;
+ }
+ printf("[C]: call tsg_lua_uncache_script success\n");
+ printf("\n*********************tsg_lua_uncache_script************************\n");
+ printf("[C]: call tsg_lua_uncache_script, script_id:%d ...\n", script_id2);
+ ret = tsg_lua_uncache_script(L, script_id2);
+ if (ret < 0)
+ {
+ printf("[C]: call tsg_lua_uncache_script failed.\n");
+ return -1;
+ }
+ printf("[C]: call tsg_lua_uncache_script success\n");
+ printf("\n*********************tsg_lua_uncache_script************************\n");
+ printf("[C]: call tsg_lua_uncache_script, script_id:%d ...\n", script_id3);
+ ret = tsg_lua_uncache_script(L, script_id3);
+ if (ret < 0)
+ {
+ printf("[C]: call tsg_lua_uncache_script failed.\n");
+ return -1;
+ }
+ printf("[C]: call tsg_lua_uncache_script success\n");
+
+ tsg_lua_cache_exec(L, script_id, content1, 255, out, &out_len, &out_type);
+
+
+ /* 关闭lua */
+ tsg_destory_lua(L);
+ printf("[C]:Every day is good day!\n");
+
+ return 0;
+}
diff --git a/gtest/CMakeLists.txt b/gtest/CMakeLists.txt
new file mode 100644
index 0000000..111f465
--- /dev/null
+++ b/gtest/CMakeLists.txt
@@ -0,0 +1,13 @@
+cmake_minimum_required(VERSION 2.6)
+project(gtest_tsg_lua)
+aux_source_directory(. SRCS)
+
+include_directories("../include")
+link_directories("/root/workspace/tsg_lua_0.99/lib")
+link_libraries(tsglua gtest gtest_main pthread)
+
+add_definitions(-g -W -Wall)
+#add_executable(gtest_tsg_lua gtest_tsg_lua_vm_create.cpp gtest_tsg_lua_exec.cpp gtest_tsg_lua_cache_script.cpp gtest_tsg_cache_exec.cpp gtest_tsg_lua_uncache_script.cpp gtest_tsg_destory_lua.cpp)
+add_executable(../gtest_tsg_lua ${SRCS})
+target_link_libraries(../gtest_tsg_lua tsglua gtest gtest_main pthread)
+
diff --git a/gtest/gtest_tsg_destory_lua.cpp b/gtest/gtest_tsg_destory_lua.cpp
new file mode 100644
index 0000000..8ea164c
--- /dev/null
+++ b/gtest/gtest_tsg_destory_lua.cpp
@@ -0,0 +1,27 @@
+/*************************************************************************
+ > File Name: gtest_tsg_lua_vm_create.cpp
+ > Author: pxz
+ > Created Time: Sun 19 Jul 2020 01:27:13 PM CST
+ ************************************************************************/
+#include <gtest/gtest.h>
+#include "tsg_lua_interface.h"
+
+/* tsg_destory_lua */
+TEST(tsg_destory_lua, normal)
+{
+ tsg_lua_handle L = NULL;
+ L = tsg_lua_vm_create();
+ int ret = tsg_destory_lua(L);
+
+ EXPECT_EQ(0, ret);
+}
+
+TEST(tsg_destory_lua, lua_vm_isnull)
+{
+ tsg_lua_handle L = NULL;
+
+ int ret = tsg_destory_lua(L);
+
+ EXPECT_EQ(ERR_LUAVM_ISNULL, ret);
+}
diff --git a/gtest/gtest_tsg_lua b/gtest/gtest_tsg_lua
new file mode 100755
index 0000000..2731bca
--- /dev/null
+++ b/gtest/gtest_tsg_lua
Binary files differ
diff --git a/gtest/gtest_tsg_lua_cache_exec.cpp b/gtest/gtest_tsg_lua_cache_exec.cpp
new file mode 100644
index 0000000..bd30490
--- /dev/null
+++ b/gtest/gtest_tsg_lua_cache_exec.cpp
@@ -0,0 +1,309 @@
+/*************************************************************************
+ > File Name: gtest_tsg_lua_cache_exec.cpp
+ > Author: pxz
+ > Created Time: Sun 19 Jul 2020 01:28:20 PM CST
+ ************************************************************************/
+#include <gtest/gtest.h>
+#include "tsg_lua_interface.h"
+static const char *data = "hello world";
+
+/* tsg_lua_cache_exec */
+TEST(tsg_lua_cache_exec, normal_return_string)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_string_normal.lua";
+ memset(out, 0, 255);
+ int script_id = tsg_lua_cache_script_file(L, script);
+ int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(0, ret);
+ EXPECT_EQ(11, out_len);
+ EXPECT_EQ(STRING, out_type);
+ EXPECT_STREQ("hello world", out);
+}
+
+TEST(tsg_lua_cache_exec, normal_return_boolean)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_boolean_normal.lua";
+ memset(out, 0, 255);
+ int script_id = tsg_lua_cache_script_file(L, script);
+ int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(0, ret);
+ EXPECT_EQ(1, out_len);
+ EXPECT_EQ(BOOLEAN, out_type);
+ EXPECT_EQ(true, out[0]);
+}
+
+TEST(tsg_lua_cache_exec, normal_return_integer)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_integer_normal.lua";
+ memset(out, 0, 255);
+ int script_id = tsg_lua_cache_script_file(L, script);
+ int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(0, ret);
+ EXPECT_EQ(8, out_len);
+ EXPECT_EQ(INTEGER, out_type);
+ EXPECT_EQ(7, *(long int *)out);
+}
+
+TEST(tsg_lua_cache_exec, lua_vm_isnull)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_string_normal.lua";
+ memset(out, 0, sizeof(out));
+ int script_id = tsg_lua_cache_script_file(L, script);
+ L = NULL;
+ int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_LUAVM_ISNULL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_cache_exec, script_id_invaild)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+ L = tsg_lua_vm_create();
+ memset(out, 0, 255);
+ int script_id = 0;
+ int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_ID_INVAILD, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_cache_exec, input_isnull)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+ char *input = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_string_normal.lua";
+ memset(out, 0, 255);
+ int script_id = tsg_lua_cache_script_file(L, script);
+ int ret = tsg_lua_cache_exec(L, script_id, input, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_INPUT_ISNULL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_cache_exec, in_len_invaild)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_string_normal.lua";
+ memset(out, 0, 255);
+ int script_id = tsg_lua_cache_script_file(L, script);
+ int ret = tsg_lua_cache_exec(L, script_id, data, 0, out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_IN_LEN_INVAILD, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_cache_exec, string_expected_but_nil)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/string_expected_but_nil.lua";
+ memset(out, 0, 255);
+ int script_id = tsg_lua_cache_script_file(L, script);
+ int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_NIL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_cache_exec, string_expected_but_boolean)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/string_expected_but_boolean.lua";
+ memset(out, 0, 255);
+ int script_id = tsg_lua_cache_script_file(L, script);
+ int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_BOOL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_cache_exec, call_global_but_nil)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/call_global_but_nil.lua";
+ memset(out, 0, 255);
+ int script_id = tsg_lua_cache_script_file(L, script);
+ int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_CALL_GLOBAL_BUT_NIL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+
+TEST(tsg_lua_cache_exec, return_too_few)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_too_few.lua";
+ memset(out, 0, 255);
+ int script_id = tsg_lua_cache_script_file(L, script);
+ int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RETURN_TOO_FEW, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_cache_exec, return_too_much)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_too_much.lua";
+ memset(out, 0, 255);
+ int script_id = tsg_lua_cache_script_file(L, script);
+ int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RETURN_TOO_MUCH, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_cache_exec, return_type_invaild)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_type_invaild.lua";
+ memset(out, 0, 255);
+ int script_id = tsg_lua_cache_script_file(L, script);
+ int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RETURN_TYPE_INVAILD, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_cache_exec, return_length_iszero)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_length_iszero.lua";
+ memset(out, 0, 255);
+ int script_id = tsg_lua_cache_script_file(L, script);
+ int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RETURN_LEN_INVAILD, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_cache_exec, string_expected_but_table)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/string_expected_but_table.lua";
+ memset(out, 0, 255);
+ int script_id = tsg_lua_cache_script_file(L, script);
+ int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_TABLE, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
diff --git a/gtest/gtest_tsg_lua_cache_script.cpp b/gtest/gtest_tsg_lua_cache_script.cpp
new file mode 100644
index 0000000..3a2863f
--- /dev/null
+++ b/gtest/gtest_tsg_lua_cache_script.cpp
@@ -0,0 +1,168 @@
+/*************************************************************************
+ > File Name: gtest_tsg_lua_cache_script.cpp
+ > Author: pxz
+ > Created Time: Sun 19 Jul 2020 01:28:20 PM CST
+ ************************************************************************/
+#include <gtest/gtest.h>
+#include "tsg_lua_interface.h"
+
+static size_t script_len;
+static char buffer[4096];
+static char *get_script_buffer(const char *script)
+{
+ FILE *fp = fopen(script, "r");
+ if (fp)
+ {
+ int num = fread(buffer, 1, 4096, fp);
+ if (num != 0)
+ {
+ buffer[num] = 0;
+ script_len = num - 1;
+ return buffer;
+ }
+ }
+ return NULL;
+}
+/* tsg_lua_cache_script */
+TEST(tsg_lua_cache_script, normal)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/return_string_normal.lua");
+ int script_id = tsg_lua_cache_script(L, script, script_len);
+
+ /* check */
+ EXPECT_EQ(1, script_id);
+}
+
+TEST(tsg_lua_cache_script, lua_vm_isnull)
+{
+ tsg_lua_handle L = NULL;
+
+ const char *script = get_script_buffer("./script/return_string_normal.lua");
+ int script_id = tsg_lua_cache_script(L, script, script_len);
+
+ /* check */
+ EXPECT_EQ(ERR_LUAVM_ISNULL, script_id);
+}
+
+TEST(tsg_lua_cache_script, script_isnull)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = NULL;
+ int script_id = tsg_lua_cache_script(L, script, script_len);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_ISNULL, script_id);
+}
+TEST(tsg_lua_cache_script, do_expected)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/do_expected.lua");
+ int script_id = tsg_lua_cache_script(L, script, script_len);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_DO_EXPECTED, script_id);
+}
+
+TEST(tsg_lua_cache_script, then_expected)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/then_expected.lua");
+ int script_id = tsg_lua_cache_script(L, script, script_len);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_THEN_EXPECTED, script_id);
+}
+
+TEST(tsg_lua_cache_script, end_expected)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/end_expected.lua");
+ int script_id = tsg_lua_cache_script(L, script, script_len);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_END_EXPECTED, script_id);
+}
+
+TEST(tsg_lua_cache_script, eof_expected)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/eof_expected.lua");
+ int script_id = tsg_lua_cache_script(L, script, script_len);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_EOF_EXPECTED, script_id);
+}
+
+TEST(tsg_lua_cache_script, equal_in_expected)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/equal_in_expected.lua");
+ int script_id = tsg_lua_cache_script(L, script, script_len);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_EQUAL_IN_EXPECTED, script_id);
+}
+
+TEST(tsg_lua_cache_script, unexpected_symbol)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/unexpected_symbol.lua");
+ int script_id = tsg_lua_cache_script(L, script, script_len);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_UNEXPECTED_SYMBOL, script_id);
+}
+
+TEST(tsg_lua_cache_script, name_expected)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/name_expected.lua");
+ int ret = tsg_lua_cache_script(L, script, script_len);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_NAME_EXPECTED, ret);
+}
+
+TEST(tsg_lua_cache_script, right_curves_bracket_expected)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/right_curves_bracket_expected.lua");
+ int ret = tsg_lua_cache_script(L, script, script_len);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RIGHT_CURVES_BRACKET_EXPECTED, ret);
+}
+
+TEST(tsg_lua_cache_script, right_curly_bracket_expected)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/right_curly_bracket_expected.lua");
+ int ret = tsg_lua_cache_script(L, script, script_len);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RIGHT_CURLY_BRACKET_EXPECTED, ret);
+}
diff --git a/gtest/gtest_tsg_lua_cache_script_bytecode_file.cpp b/gtest/gtest_tsg_lua_cache_script_bytecode_file.cpp
new file mode 100644
index 0000000..2c63cb6
--- /dev/null
+++ b/gtest/gtest_tsg_lua_cache_script_bytecode_file.cpp
@@ -0,0 +1,44 @@
+/*************************************************************************
+ > File Name: gtest_tsg_lua_cache_script_file.cpp
+ > Author: pxz
+ > Created Time: Sun 19 Jul 2020 01:28:20 PM CST
+ ************************************************************************/
+#include <gtest/gtest.h>
+#include "tsg_lua_interface.h"
+
+/* tsg_lua_cache_script_file */
+TEST(tsg_lua_cache_script_bytecode_file, normal)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_string_normal.lua";
+ int script_id = tsg_lua_cache_script_file(L, script);
+
+ /* check */
+ EXPECT_EQ(1, script_id);
+}
+
+TEST(tsg_lua_cache_script_bytecode_file, lua_vm_isnull)
+{
+ tsg_lua_handle L = NULL;
+
+ const char *script = "./script/return_string_normal.lua";
+ int script_id = tsg_lua_cache_script_file(L, script);
+
+ /* check */
+ EXPECT_EQ(ERR_LUAVM_ISNULL, script_id);
+}
+
+TEST(tsg_lua_cache_script_bytecode_file, script_isnull)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = NULL;
+ int script_id = tsg_lua_cache_script_file(L, script);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_ISNULL, script_id);
+}
diff --git a/gtest/gtest_tsg_lua_cache_script_file.cpp b/gtest/gtest_tsg_lua_cache_script_file.cpp
new file mode 100644
index 0000000..78dbec0
--- /dev/null
+++ b/gtest/gtest_tsg_lua_cache_script_file.cpp
@@ -0,0 +1,164 @@
+/*************************************************************************
+ > File Name: gtest_tsg_lua_cache_script_file.cpp
+ > Author: pxz
+ > Created Time: Sun 19 Jul 2020 01:28:20 PM CST
+ ************************************************************************/
+#include <gtest/gtest.h>
+#include "tsg_lua_interface.h"
+
+/* tsg_lua_cache_script_file */
+TEST(tsg_lua_cache_script_file, normal)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_string_normal.lua";
+ int script_id = tsg_lua_cache_script_file(L, script);
+
+ /* check */
+ EXPECT_EQ(1, script_id);
+}
+
+TEST(tsg_lua_cache_script_file, lua_vm_isnull)
+{
+ tsg_lua_handle L = NULL;
+
+ const char *script = "./script/return_string_normal.lua";
+ int script_id = tsg_lua_cache_script_file(L, script);
+
+ /* check */
+ EXPECT_EQ(ERR_LUAVM_ISNULL, script_id);
+}
+
+TEST(tsg_lua_cache_script_file, script_isnull)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = NULL;
+ int script_id = tsg_lua_cache_script_file(L, script);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_ISNULL, script_id);
+}
+#if 0
+TEST(tsg_lua_cache_script_file, function_invaild)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/function_invaild.lua";
+ int script_id = tsg_lua_cache_script_file(L, script);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_FUNCTION_INVAILD, script_id);
+}
+#endif
+TEST(tsg_lua_cache_script_file, do_expected)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/do_expected.lua";
+ int script_id = tsg_lua_cache_script_file(L, script);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_DO_EXPECTED, script_id);
+}
+
+TEST(tsg_lua_cache_script_file, then_expected)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/then_expected.lua";
+ int script_id = tsg_lua_cache_script_file(L, script);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_THEN_EXPECTED, script_id);
+}
+
+TEST(tsg_lua_cache_script_file, end_expected)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/end_expected.lua";
+ int script_id = tsg_lua_cache_script_file(L, script);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_END_EXPECTED, script_id);
+}
+
+TEST(tsg_lua_cache_script_file, eof_expected)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/eof_expected.lua";
+ int script_id = tsg_lua_cache_script_file(L, script);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_EOF_EXPECTED, script_id);
+}
+
+TEST(tsg_lua_cache_script_file, equal_in_expected)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/equal_in_expected.lua";
+ int script_id = tsg_lua_cache_script_file(L, script);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_EQUAL_IN_EXPECTED, script_id);
+}
+
+TEST(tsg_lua_cache_script_file, unexpected_symbol)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/unexpected_symbol.lua";
+ int script_id = tsg_lua_cache_script_file(L, script);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_UNEXPECTED_SYMBOL, script_id);
+}
+
+TEST(tsg_lua_cache_script_file, name_expected)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/name_expected.lua";
+ int ret = tsg_lua_cache_script_file(L, script);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_NAME_EXPECTED, ret);
+}
+
+TEST(tsg_lua_cache_script_file, right_curves_bracket_expected)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/right_curves_bracket_expected.lua";
+ int ret = tsg_lua_cache_script_file(L, script);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RIGHT_CURVES_BRACKET_EXPECTED, ret);
+}
+
+TEST(tsg_lua_cache_script_file, right_curly_bracket_expected)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/right_curly_bracket_expected.lua";
+ int ret = tsg_lua_cache_script_file(L, script);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RIGHT_CURLY_BRACKET_EXPECTED, ret);
+}
diff --git a/gtest/gtest_tsg_lua_exec.cpp b/gtest/gtest_tsg_lua_exec.cpp
new file mode 100644
index 0000000..c0be485
--- /dev/null
+++ b/gtest/gtest_tsg_lua_exec.cpp
@@ -0,0 +1,500 @@
+/*************************************************************************
+ > File Name: gtest_tsg_lua_exec.cpp
+ > Author: pxz
+ > Created Time: Sun 19 Jul 2020 01:28:20 PM CST
+ ************************************************************************/
+#include <gtest/gtest.h>
+#include "tsg_lua_interface.h"
+static const char *data = "hello world";
+
+static char buffer[4096];
+static char *get_script_buffer(const char *script)
+{
+ FILE *fp = fopen(script, "r");
+ if (fp)
+ {
+ int num = fread(buffer, 1, 4096, fp);
+ if (num != 0)
+ {
+ buffer[num] = 0;
+ return buffer;
+ }
+ }
+ return NULL;
+}
+
+/* tsg_lua_exec */
+TEST(tsg_lua_exec, normal_return_string)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ memset(out, 0, 255);
+ const char *script = get_script_buffer("./script/return_string_normal.lua");
+ int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(0, ret);
+ EXPECT_EQ(11, out_len);
+ EXPECT_EQ(STRING, out_type);
+ EXPECT_STREQ("hello world", out);
+}
+
+TEST(tsg_lua_exec, normal_return_boolean)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/return_boolean_normal.lua");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(0, ret);
+ EXPECT_EQ(1, out_len);
+ EXPECT_EQ(BOOLEAN, out_type);
+ EXPECT_EQ(true, out[0]);
+}
+
+TEST(tsg_lua_exec, normal_return_integer)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/return_integer_normal.lua");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(0, ret);
+ EXPECT_EQ(8, out_len);
+ EXPECT_EQ(INTEGER, out_type);
+ EXPECT_EQ(7, *(long int *)out);
+}
+
+TEST(tsg_lua_exec, lua_vm_isnull)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ const char *script = get_script_buffer("./script/return_string_normal.lua");
+ memset(out, 0, sizeof(out));
+ int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_LUAVM_ISNULL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec, script_isnull)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+ L = tsg_lua_vm_create();
+ const char *script = NULL;
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, 0, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_ISNULL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec, input_isnull)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+ char *input = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/return_string_normal.lua");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, strlen(script), input, 0, out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_INPUT_ISNULL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec, in_len_invaild)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/return_string_normal.lua");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, strlen(script), data, 0, out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_IN_LEN_INVAILD, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec, end_expected)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/end_expected.lua");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_END_EXPECTED, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec, then_expected)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/then_expected.lua");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_THEN_EXPECTED, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec, do_expected)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/do_expected.lua");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_DO_EXPECTED, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec, eof_expected)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/eof_expected.lua");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_EOF_EXPECTED, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec, equal_in_expected)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/equal_in_expected.lua");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_EQUAL_IN_EXPECTED, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec, unexpected_symbol)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/unexpected_symbol.lua");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_UNEXPECTED_SYMBOL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec, name_expected)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/name_expected.lua");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_NAME_EXPECTED, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec, right_curves_bracket_expected)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/right_curves_bracket_expected.lua");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RIGHT_CURVES_BRACKET_EXPECTED, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec, right_curly_bracket_expected)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/right_curly_bracket_expected.lua");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RIGHT_CURLY_BRACKET_EXPECTED, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec, string_expected_but_nil)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/string_expected_but_nil.lua");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_NIL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec, string_expected_but_boolean)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/string_expected_but_boolean.lua");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_BOOL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec, string_expected_but_table)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/string_expected_but_table.lua");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_TABLE, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec, call_global_but_nil)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/call_global_but_nil.lua");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_CALL_GLOBAL_BUT_NIL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+
+TEST(tsg_lua_exec, return_too_few)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/return_too_few.lua");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RETURN_TOO_FEW, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec, return_too_much)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/return_too_much.lua");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RETURN_TOO_MUCH, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec, return_type_invaild)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/return_type_invaild.lua");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RETURN_TYPE_INVAILD, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec, return_length_iszero)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/return_length_iszero.lua");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RETURN_LEN_INVAILD, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+#if 0
+TEST(tsg_lua_exec, function_invaild)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/function_invaild.lua");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_FUNCTION_INVAILD, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+#endif
diff --git a/gtest/gtest_tsg_lua_exec_bytecode.cpp b/gtest/gtest_tsg_lua_exec_bytecode.cpp
new file mode 100644
index 0000000..d2d6976
--- /dev/null
+++ b/gtest/gtest_tsg_lua_exec_bytecode.cpp
@@ -0,0 +1,311 @@
+/*************************************************************************
+ > File Name: gtest_tsg_lua_exec.cpp
+ > Author: pxz
+ > Created Time: Sun 19 Jul 2020 01:28:20 PM CST
+ ************************************************************************/
+#include <gtest/gtest.h>
+#include "tsg_lua_interface.h"
+
+static const char *data = "hello world";
+static size_t script_len;
+static char buffer[4096];
+static char *get_script_buffer(const char *script)
+{
+ FILE *fp = fopen(script, "r");
+ if (fp)
+ {
+ int num = fread(buffer, 1, 4096, fp);
+ if (num != 0)
+ {
+ buffer[num] = 0;
+ script_len = num;
+ return buffer;
+ }
+ }
+ return NULL;
+}
+
+/* tsg_lua_exec */
+TEST(tsg_lua_exec_bytecode, normal_return_string)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ memset(out, 0, 255);
+ const char *script = get_script_buffer("./script/return_string_normal.luajit");
+ int ret = tsg_lua_exec(L, script, script_len, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(0, ret);
+ EXPECT_EQ(11, out_len);
+ EXPECT_EQ(STRING, out_type);
+ EXPECT_STREQ("hello world", out);
+}
+
+TEST(tsg_lua_exec_bytecode, normal_return_boolean)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/return_boolean_normal.luajit");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, script_len, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(0, ret);
+ EXPECT_EQ(1, out_len);
+ EXPECT_EQ(BOOLEAN, out_type);
+ EXPECT_EQ(true, out[0]);
+}
+
+TEST(tsg_lua_exec_bytecode, normal_return_integer)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/return_integer_normal.luajit");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, script_len, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(0, ret);
+ EXPECT_EQ(8, out_len);
+ EXPECT_EQ(INTEGER, out_type);
+ EXPECT_EQ(7, *(long int *)out);
+}
+
+TEST(tsg_lua_exec_bytecode, lua_vm_isnull)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ const char *script = get_script_buffer("./script/return_string_normal.luajit");
+ memset(out, 0, sizeof(out));
+ int ret = tsg_lua_exec(L, script, script_len, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_LUAVM_ISNULL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_bytecode, script_isnull)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+ L = tsg_lua_vm_create();
+ const char *script = NULL;
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, 0, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_ISNULL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_bytecode, input_isnull)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+ char *input = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/return_string_normal.luajit");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, script_len, input, 0, out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_INPUT_ISNULL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_bytecode, in_len_invaild)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/return_string_normal.luajit");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, script_len, data, 0, out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_IN_LEN_INVAILD, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_bytecode, string_expected_but_nil)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/string_expected_but_nil.luajit");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, script_len, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_NIL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_bytecode, string_expected_but_boolean)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/string_expected_but_boolean.luajit");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, script_len, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_BOOL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_bytecode, string_expected_but_table)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/string_expected_but_table.luajit");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, script_len, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_TABLE, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_bytecode, call_global_but_nil)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/call_global_but_nil.luajit");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, script_len, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_CALL_GLOBAL_BUT_NIL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+
+TEST(tsg_lua_exec_bytecode, return_too_few)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/return_too_few.luajit");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, script_len, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RETURN_TOO_FEW, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_bytecode, return_too_much)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/return_too_much.luajit");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, script_len, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RETURN_TOO_MUCH, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_bytecode, return_type_invaild)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/return_type_invaild.luajit");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, script_len, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RETURN_TYPE_INVAILD, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_bytecode, return_length_iszero)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = get_script_buffer("./script/return_length_iszero.luajit");
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec(L, script, script_len, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RETURN_LEN_INVAILD, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
diff --git a/gtest/gtest_tsg_lua_exec_bytecode_file.cpp b/gtest/gtest_tsg_lua_exec_bytecode_file.cpp
new file mode 100644
index 0000000..6fd7552
--- /dev/null
+++ b/gtest/gtest_tsg_lua_exec_bytecode_file.cpp
@@ -0,0 +1,293 @@
+/*************************************************************************
+ > File Name: gtest_tsg_lua_exec_file.cpp
+ > Author: pxz
+ > Created Time: Sun 19 Jul 2020 01:28:20 PM CST
+ ************************************************************************/
+#include <gtest/gtest.h>
+#include "tsg_lua_interface.h"
+static const char *data = "hello world";
+
+/* tsg_lua_exec_file */
+TEST(tsg_lua_exec_bytecode_file, normal_return_string)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_string_normal.luajit";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(0, ret);
+ EXPECT_EQ(11, out_len);
+ EXPECT_EQ(STRING, out_type);
+ EXPECT_STREQ("hello world", out);
+}
+
+TEST(tsg_lua_exec_bytecode_file, normal_return_boolean)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_boolean_normal.luajit";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(0, ret);
+ EXPECT_EQ(1, out_len);
+ EXPECT_EQ(BOOLEAN, out_type);
+ EXPECT_EQ(true, out[0]);
+}
+
+TEST(tsg_lua_exec_bytecode_file, normal_return_integer)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_integer_normal.luajit";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(0, ret);
+ EXPECT_EQ(8, out_len);
+ EXPECT_EQ(INTEGER, out_type);
+ EXPECT_EQ(7, *(long int *)out);
+}
+
+TEST(tsg_lua_exec_bytecode_file, lua_vm_isnull)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ const char *script = "./script/return_string_normal.luajit";
+ memset(out, 0, sizeof(out));
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_LUAVM_ISNULL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_bytecode_file, script_isnull)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+ L = tsg_lua_vm_create();
+ const char *script = NULL;
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_ISNULL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_bytecode_file, input_isnull)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+ char *input = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_string_normal.luajit";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, input, 0, out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_INPUT_ISNULL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_bytecode_file, in_len_invaild)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_string_normal.luajit";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, 0, out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_IN_LEN_INVAILD, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_bytecode_file, string_expected_but_nil)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/string_expected_but_nil.luajit";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_NIL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_bytecode_file, string_expected_but_boolean)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/string_expected_but_boolean.luajit";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_BOOL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_bytecode_file, string_expected_but_table)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/string_expected_but_table.luajit";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_TABLE, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_bytecode_file, call_global_but_nil)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/call_global_but_nil.luajit";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_CALL_GLOBAL_BUT_NIL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+
+TEST(tsg_lua_exec_bytecode_file, return_too_few)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_too_few.luajit";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RETURN_TOO_FEW, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_bytecode_file, return_too_much)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_too_much.luajit";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RETURN_TOO_MUCH, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_bytecode_file, return_type_invaild)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_type_invaild.luajit";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RETURN_TYPE_INVAILD, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_bytecode_file, return_length_iszero)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_length_iszero.luajit";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RETURN_LEN_INVAILD, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
diff --git a/gtest/gtest_tsg_lua_exec_file.cpp b/gtest/gtest_tsg_lua_exec_file.cpp
new file mode 100644
index 0000000..3b63bec
--- /dev/null
+++ b/gtest/gtest_tsg_lua_exec_file.cpp
@@ -0,0 +1,485 @@
+/*************************************************************************
+ > File Name: gtest_tsg_lua_exec_file.cpp
+ > Author: pxz
+ > Created Time: Sun 19 Jul 2020 01:28:20 PM CST
+ ************************************************************************/
+#include <gtest/gtest.h>
+#include "tsg_lua_interface.h"
+
+static const char *data = "hello world";
+
+/* tsg_lua_exec_file */
+TEST(tsg_lua_exec_file, normal_return_string)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_string_normal.lua";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(0, ret);
+ EXPECT_EQ(11, out_len);
+ EXPECT_EQ(STRING, out_type);
+ EXPECT_STREQ("hello world", out);
+}
+
+TEST(tsg_lua_exec_file, normal_return_boolean)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_boolean_normal.lua";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(0, ret);
+ EXPECT_EQ(1, out_len);
+ EXPECT_EQ(BOOLEAN, out_type);
+ EXPECT_EQ(true, out[0]);
+}
+
+TEST(tsg_lua_exec_file, normal_return_integer)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_integer_normal.lua";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(0, ret);
+ EXPECT_EQ(8, out_len);
+ EXPECT_EQ(INTEGER, out_type);
+ EXPECT_EQ(7, *(long int *)out);
+}
+
+TEST(tsg_lua_exec_file, lua_vm_isnull)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ const char *script = "./script/return_string_normal.lua";
+ memset(out, 0, sizeof(out));
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_LUAVM_ISNULL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_file, script_isnull)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+ L = tsg_lua_vm_create();
+ const char *script = NULL;
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_ISNULL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_file, input_isnull)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+ char *input = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_string_normal.lua";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, input, 0, out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_INPUT_ISNULL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_file, in_len_invaild)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_string_normal.lua";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, 0, out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_IN_LEN_INVAILD, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_file, end_expected)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/end_expected.lua";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_END_EXPECTED, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_file, then_expected)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/then_expected.lua";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_THEN_EXPECTED, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_file, do_expected)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/do_expected.lua";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_DO_EXPECTED, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_file, eof_expected)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/eof_expected.lua";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_EOF_EXPECTED, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_file, equal_in_expected)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/equal_in_expected.lua";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_EQUAL_IN_EXPECTED, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_file, unexpected_symbol)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/unexpected_symbol.lua";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_UNEXPECTED_SYMBOL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_file, name_expected)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/name_expected.lua";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_NAME_EXPECTED, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_file, right_curves_bracket_expected)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/right_curves_bracket_expected.lua";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RIGHT_CURVES_BRACKET_EXPECTED, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_file, right_curly_bracket_expected)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/right_curly_bracket_expected.lua";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RIGHT_CURLY_BRACKET_EXPECTED, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_file, string_expected_but_nil)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/string_expected_but_nil.lua";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_NIL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_file, string_expected_but_boolean)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/string_expected_but_boolean.lua";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_BOOL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_file, string_expected_but_table)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/string_expected_but_table.lua";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_TABLE, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_file, call_global_but_nil)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/call_global_but_nil.lua";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_CALL_GLOBAL_BUT_NIL, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+
+TEST(tsg_lua_exec_file, return_too_few)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_too_few.lua";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RETURN_TOO_FEW, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_file, return_too_much)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_too_much.lua";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RETURN_TOO_MUCH, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_file, return_type_invaild)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_type_invaild.lua";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RETURN_TYPE_INVAILD, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+
+TEST(tsg_lua_exec_file, return_length_iszero)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_length_iszero.lua";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_RETURN_LEN_INVAILD, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+#if 0
+TEST(tsg_lua_exec_file, function_invaild)
+{
+ tsg_lua_handle L = NULL;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/function_invaild.lua";
+ memset(out, 0, 255);
+ int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type);
+
+ /* check */
+ EXPECT_EQ(ERR_SCRIPT_FUNCTION_INVAILD, ret);
+ EXPECT_EQ(0, out_len);
+ EXPECT_EQ(0, out_type);
+ EXPECT_STREQ("", out);
+}
+#endif
diff --git a/gtest/gtest_tsg_lua_uncache_script.cpp b/gtest/gtest_tsg_lua_uncache_script.cpp
new file mode 100644
index 0000000..cf17a87
--- /dev/null
+++ b/gtest/gtest_tsg_lua_uncache_script.cpp
@@ -0,0 +1,37 @@
+/*************************************************************************
+ > File Name: gtest_tsg_lua_cache_script_file.cpp
+ > Author: pxz
+ > Created Time: Sun 19 Jul 2020 01:28:20 PM CST
+ ************************************************************************/
+#include <gtest/gtest.h>
+#include "tsg_lua_interface.h"
+
+/* tsg_lua_uncache_script */
+TEST(tsg_lua_uncache_script, normal)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_string_normal.lua";
+ int script_id = tsg_lua_cache_script_file(L, script);
+ int ret = tsg_lua_uncache_script(L, script_id);
+
+ /* check */
+ EXPECT_EQ(0, ret);
+}
+
+TEST(tsg_lua_uncache_script, lua_vm_isnull)
+{
+ tsg_lua_handle L = NULL;
+
+ L = tsg_lua_vm_create();
+ const char *script = "./script/return_string_normal.lua";
+ int script_id = tsg_lua_cache_script_file(L, script);
+ L = NULL;
+ int ret = tsg_lua_uncache_script(L, script_id);
+
+ /* check */
+ EXPECT_EQ(ERR_LUAVM_ISNULL, ret);
+}
+
diff --git a/gtest/gtest_tsg_lua_vm_create.cpp b/gtest/gtest_tsg_lua_vm_create.cpp
new file mode 100644
index 0000000..91a3c03
--- /dev/null
+++ b/gtest/gtest_tsg_lua_vm_create.cpp
@@ -0,0 +1,16 @@
+/*************************************************************************
+ > File Name: gtest_tsg_lua_vm_create.cpp
+ > Author: pxz
+ > Created Time: Sun 19 Jul 2020 01:27:13 PM CST
+ ************************************************************************/
+#include <gtest/gtest.h>
+#include "tsg_lua_interface.h"
+
+/* tsg_lua_vm_create */
+TEST(tsg_lua_vm_create, create_normal)
+{
+ tsg_lua_handle L = NULL;
+ L = tsg_lua_vm_create();
+ EXPECT_NE((void *)NULL, L);
+}
diff --git a/gtest/script/call_global_but_nil.lua b/gtest/script/call_global_but_nil.lua
new file mode 100644
index 0000000..d4d73f6
--- /dev/null
+++ b/gtest/script/call_global_but_nil.lua
@@ -0,0 +1,2 @@
+str = tablefunc()
+return string.len(str), str
diff --git a/gtest/script/call_global_but_nil.luajit b/gtest/script/call_global_but_nil.luajit
new file mode 100644
index 0000000..b5d19cb
--- /dev/null
+++ b/gtest/script/call_global_but_nil.luajit
Binary files differ
diff --git a/gtest/script/do_expected.lua b/gtest/script/do_expected.lua
new file mode 100644
index 0000000..b6d9afb
--- /dev/null
+++ b/gtest/script/do_expected.lua
@@ -0,0 +1,3 @@
+local str = tsg.data
+for i = 0, 10
+ return string.len(str), str
diff --git a/gtest/script/end_expected.lua b/gtest/script/end_expected.lua
new file mode 100644
index 0000000..fb1dfcb
--- /dev/null
+++ b/gtest/script/end_expected.lua
@@ -0,0 +1,3 @@
+local str = tsg.data
+if str then
+return string.len(str), str
diff --git a/gtest/script/eof_expected.lua b/gtest/script/eof_expected.lua
new file mode 100644
index 0000000..580dcab
--- /dev/null
+++ b/gtest/script/eof_expected.lua
@@ -0,0 +1,4 @@
+local str = tsg.data
+str = string.format('%s', str)
+ return string.len(str), str
+end
diff --git a/gtest/script/equal_in_expected.lua b/gtest/script/equal_in_expected.lua
new file mode 100644
index 0000000..846dd7c
--- /dev/null
+++ b/gtest/script/equal_in_expected.lua
@@ -0,0 +1,4 @@
+local str = tsg.data
+for i
+ return string.len(str), str
+end
diff --git a/gtest/script/name_expected.lua b/gtest/script/name_expected.lua
new file mode 100644
index 0000000..0d0bd7a
--- /dev/null
+++ b/gtest/script/name_expected.lua
@@ -0,0 +1,5 @@
+local str = tsg.data
+for do
+ print(str)
+end
+return string.len(str), str
diff --git a/gtest/script/return_boolean_normal.lua b/gtest/script/return_boolean_normal.lua
new file mode 100644
index 0000000..5ec3497
--- /dev/null
+++ b/gtest/script/return_boolean_normal.lua
@@ -0,0 +1,6 @@
+local str = tsg.data
+local s_index, e_index = string.find(str, 'hello')
+if s_index then
+ return 1, true
+else return 1, false
+end
diff --git a/gtest/script/return_boolean_normal.luajit b/gtest/script/return_boolean_normal.luajit
new file mode 100644
index 0000000..d76eab6
--- /dev/null
+++ b/gtest/script/return_boolean_normal.luajit
Binary files differ
diff --git a/gtest/script/return_integer_normal.lua b/gtest/script/return_integer_normal.lua
new file mode 100644
index 0000000..d3c08a7
--- /dev/null
+++ b/gtest/script/return_integer_normal.lua
@@ -0,0 +1,7 @@
+local str = tsg.data
+local s_index, e_index = string.find(str, 'world')
+if s_index then
+ return 8, s_index
+else
+ return 1, false
+end
diff --git a/gtest/script/return_integer_normal.luajit b/gtest/script/return_integer_normal.luajit
new file mode 100644
index 0000000..6c72798
--- /dev/null
+++ b/gtest/script/return_integer_normal.luajit
Binary files differ
diff --git a/gtest/script/return_length_iszero.lua b/gtest/script/return_length_iszero.lua
new file mode 100644
index 0000000..e67b392
--- /dev/null
+++ b/gtest/script/return_length_iszero.lua
@@ -0,0 +1,2 @@
+local str = "hello"
+return 0, str
diff --git a/gtest/script/return_length_iszero.luajit b/gtest/script/return_length_iszero.luajit
new file mode 100644
index 0000000..fcb961c
--- /dev/null
+++ b/gtest/script/return_length_iszero.luajit
Binary files differ
diff --git a/gtest/script/return_string_normal.lua b/gtest/script/return_string_normal.lua
new file mode 100644
index 0000000..0f1c592
--- /dev/null
+++ b/gtest/script/return_string_normal.lua
@@ -0,0 +1,2 @@
+local str = tsg.data
+return string.len(str), str
diff --git a/gtest/script/return_string_normal.luajit b/gtest/script/return_string_normal.luajit
new file mode 100644
index 0000000..27764b3
--- /dev/null
+++ b/gtest/script/return_string_normal.luajit
Binary files differ
diff --git a/gtest/script/return_too_few.lua b/gtest/script/return_too_few.lua
new file mode 100644
index 0000000..f850e87
--- /dev/null
+++ b/gtest/script/return_too_few.lua
@@ -0,0 +1,2 @@
+local str = "hello"
+return string.len(str)
diff --git a/gtest/script/return_too_few.luajit b/gtest/script/return_too_few.luajit
new file mode 100644
index 0000000..c2bc81e
--- /dev/null
+++ b/gtest/script/return_too_few.luajit
Binary files differ
diff --git a/gtest/script/return_too_much.lua b/gtest/script/return_too_much.lua
new file mode 100644
index 0000000..683f6a0
--- /dev/null
+++ b/gtest/script/return_too_much.lua
@@ -0,0 +1,2 @@
+local str = "hello"
+return string.len(str), str, 1
diff --git a/gtest/script/return_too_much.luajit b/gtest/script/return_too_much.luajit
new file mode 100644
index 0000000..881e698
--- /dev/null
+++ b/gtest/script/return_too_much.luajit
Binary files differ
diff --git a/gtest/script/return_type_invaild.lua b/gtest/script/return_type_invaild.lua
new file mode 100644
index 0000000..2d4e33e
--- /dev/null
+++ b/gtest/script/return_type_invaild.lua
@@ -0,0 +1,2 @@
+local str = "hello"
+return string.len(str), nil
diff --git a/gtest/script/return_type_invaild.luajit b/gtest/script/return_type_invaild.luajit
new file mode 100644
index 0000000..a267b1f
--- /dev/null
+++ b/gtest/script/return_type_invaild.luajit
Binary files differ
diff --git a/gtest/script/right_curly_bracket_expected.lua b/gtest/script/right_curly_bracket_expected.lua
new file mode 100644
index 0000000..194864b
--- /dev/null
+++ b/gtest/script/right_curly_bracket_expected.lua
@@ -0,0 +1,4 @@
+local str = string.format ('%s', tsg.data)
+local table = {}
+setmetatable(table, {__index = _G)
+return string.len(str), str
diff --git a/gtest/script/right_curves_bracket_expected.lua b/gtest/script/right_curves_bracket_expected.lua
new file mode 100644
index 0000000..b901a50
--- /dev/null
+++ b/gtest/script/right_curves_bracket_expected.lua
@@ -0,0 +1,2 @@
+local str = string.format('%s', tsg.data
+return string.len(str), str
diff --git a/gtest/script/string_expected_but_boolean.lua b/gtest/script/string_expected_but_boolean.lua
new file mode 100644
index 0000000..388636f
--- /dev/null
+++ b/gtest/script/string_expected_but_boolean.lua
@@ -0,0 +1,3 @@
+local str = "hello"
+return string.len(true), str
+
diff --git a/gtest/script/string_expected_but_boolean.luajit b/gtest/script/string_expected_but_boolean.luajit
new file mode 100644
index 0000000..2c555b4
--- /dev/null
+++ b/gtest/script/string_expected_but_boolean.luajit
Binary files differ
diff --git a/gtest/script/string_expected_but_nil.lua b/gtest/script/string_expected_but_nil.lua
new file mode 100644
index 0000000..d0979ec
--- /dev/null
+++ b/gtest/script/string_expected_but_nil.lua
@@ -0,0 +1 @@
+return string.len(str), str
diff --git a/gtest/script/string_expected_but_nil.luajit b/gtest/script/string_expected_but_nil.luajit
new file mode 100644
index 0000000..92796df
--- /dev/null
+++ b/gtest/script/string_expected_but_nil.luajit
Binary files differ
diff --git a/gtest/script/string_expected_but_table.lua b/gtest/script/string_expected_but_table.lua
new file mode 100644
index 0000000..417d8ed
--- /dev/null
+++ b/gtest/script/string_expected_but_table.lua
@@ -0,0 +1,2 @@
+local str = {1, 2, 4}
+return string.len(str), str
diff --git a/gtest/script/string_expected_but_table.luajit b/gtest/script/string_expected_but_table.luajit
new file mode 100644
index 0000000..d237308
--- /dev/null
+++ b/gtest/script/string_expected_but_table.luajit
Binary files differ
diff --git a/gtest/script/then_expected.lua b/gtest/script/then_expected.lua
new file mode 100644
index 0000000..8a94370
--- /dev/null
+++ b/gtest/script/then_expected.lua
@@ -0,0 +1,4 @@
+if not nil
+ str = tsg.data
+ return string.len(str), str
+end
diff --git a/gtest/script/unexpected_symbol.lua b/gtest/script/unexpected_symbol.lua
new file mode 100644
index 0000000..a51eb44
--- /dev/null
+++ b/gtest/script/unexpected_symbol.lua
@@ -0,0 +1,3 @@
+-=*
+local str = string.format('%s', tsg.data)
+return string.len(str), str
diff --git a/include/tsg_lua_interface.h b/include/tsg_lua_interface.h
new file mode 100644
index 0000000..ae417e0
--- /dev/null
+++ b/include/tsg_lua_interface.h
@@ -0,0 +1,126 @@
+/*************************************************************************
+ > File Name: tsg_lua_interface.h
+ > Author: pxz
+ > Created Time: Wed 08 Jul 2020 02:50:42 PM CST
+ ************************************************************************/
+#ifndef __TSG_LUA_INTERFACE__
+#define __TSG_LUA_INTERFACE__
+
+enum type
+{
+ STRING = 1,
+ INTEGER,
+ BOOLEAN,
+};
+
+enum err_value
+{
+ ERR_LUAVM_ISNULL = -1, /* 输入虚拟机参数为空 */
+ ERR_SCRIPT_ISNULL = -2, /* 输入脚本为空 */
+ ERR_INPUT_ISNULL = -3, /* 输入数据为空 */
+ ERR_IN_LEN_INVAILD = -4, /* 输入数据长度小于1 */
+ ERR_SCRIPT_FUNCTION_INVAILD = -5, /* 脚本函数名无效 */
+ ERR_SCRIPT_RETURN_LEN_INVAILD = -6, /* 脚本返回值长度为0 */
+ ERR_SCRIPT_RETURN_TOO_MUCH = -7, /* 脚本返回值太多 */
+ ERR_SCRIPT_RETURN_TOO_FEW = -8, /* 脚本返回值太少 */
+ ERR_SCRIPT_RETURN_TYPE_INVAILD = -9, /* 脚本返回值类型错误 */
+ ERR_SCRIPT_SYNTAX_ERROR = -10, /* 脚本语法错误 */
+ ERR_SCRIPT_END_EXPECTED = -11, /* 脚本缺少end */
+ ERR_SCRIPT_THEN_EXPECTED = -12, /* 脚本缺少then */
+ ERR_SCRIPT_DO_EXPECTED = -13, /* 脚本缺少do */
+ ERR_SCRIPT_EOF_EXPECTED = -14, /* 脚本缺少eof */
+ ERR_SCRIPT_EQUAL_IN_EXPECTED = -15, /* 脚本缺少‘=’或者‘in’ */
+ ERR_SCRIPT_UNEXPECTED_SYMBOL = -16, /* 脚本中出现不可预期的错误符号 */
+ ERR_SCRIPT_NAME_EXPECTED = -17, /* 脚本中for后面没有表达式 */
+ ERR_SCRIPT_RIGHT_CURVES_BRACKET_EXPECTED = -18, /* 脚本中缺少')' */
+ ERR_SCRIPT_RIGHT_CURLY_BRACKET_EXPECTED = -19, /* 脚本中缺少'}' */
+ ERR_SCRIPT_EXEC_ERROR = -20, /* 脚本运行错误 */
+ ERR_SCRIPT_STRING_EXPECTED_BUT_NIL = -21, /* 脚本参数错误,尝试访问string类型变量,但该变量是nil类型 */
+ ERR_SCRIPT_STRING_EXPECTED_BUT_BOOL = -22, /* 脚本参数错误,尝试访问string类型变量,但该变量是bool类型 */
+ ERR_SCRIPT_STRING_EXPECTED_BUT_TABLE = -23, /* 脚本参数错误,尝试访问string类型变量,但该变量是table类型 */
+ ERR_SCRIPT_CALL_GLOBAL_BUT_NIL = -24, /* 脚本尝试访问一个不存在的变量 */
+ ERR_SCRIPT_NOT_EXIT = -25, /* 脚本不存在 */
+ ERR_SCRIPT_BYTECODE_NO_HEADER = -26, /* 字节码脚本没有header */
+ ERR_SCRIPT_BYTECODE_BAD_HEADER = -27, /* 字节码脚本header错误 */
+ ERR_SCRIPT_BYTECODE_VERSION_UNSUPPORTED = -28, /* 字节码脚本的版本不支持 */
+ ERR_SCRIPT_BYTECODE_ONLY_SUPPORT_LUAJIT = -29, /* 只支持luajit的字节码脚本 */
+ ERR_SCRIPT_BYTECODE_NOT_SUPPORT_BIG_ENDIAN = -30, /* 不支持字节码脚本大端模式 */
+ ERR_SCRIPT_BYTECODE_NOT_SUPPORT_DEBUG = -31, /* 不支持字节码脚本debug模式 */
+ ERR_SCRIPT_IS_BAD = -32, /* 脚本错误 */
+ ERR_SCRIPT_ID_INVAILD = -33, /* 脚本ID无效 */
+ ERR_LUA_CACHE_FAILED = -34, /* 脚本缓存失败 */
+ ERR_MEM_NOT_ENOUGH = -35, /* 空间不足 */
+ ERR_UNKNOWN = -36, /* 未知错误 */
+};
+
+typedef void* tsg_lua_handle;
+
+/* 函数名:tsg_lua_vm_create
+ * 返回值:tsg_lua_handle 成功,返回一个虚拟机,
+ * 失败,返回NULL */
+tsg_lua_handle tsg_lua_vm_create();
+
+/* 函数名: tsg_lua_exec
+ * 输入参数: tsg_lua_handle L 指定虚拟机
+ * char *script 待执行的lua脚本
+ * size_t *script_len 待执行的lua脚本大小
+ * char *in 输入待处理的数据
+ * size_t in_len 输入待处理的数据的长度
+ * 输出参数:
+ * char *out 输出结果
+ * size_t *out_len 输出结果的长度
+ * size_t *out_type 输出结果的类型
+ * 返回值: int 成功,返回0;失败返回错误值err_value */
+int tsg_lua_exec(tsg_lua_handle L, const char *script, size_t script_len, const char *in, size_t in_len, char *out, size_t *out_len, size_t *out_type);
+
+/* 函数名: tsg_lua_exec_script
+ * 输入参数: tsg_lua_handle L 指定虚拟机
+ * char *script 待执行的lua脚本
+ * char *in 输入待处理的数据
+ * size_t in_len 输入待处理的数据的长度
+ * 输出参数:
+ * char *out 输出结果
+ * size_t *out_len 输出结果的长度
+ * size_t *out_type 输出结果的类型
+ * 返回值: int 成功,返回0;失败返回错误值err_value */
+int tsg_lua_exec_file(tsg_lua_handle L, const char *script, const char *in, size_t in_len, char *out, size_t *out_len, size_t *out_type);
+
+/* 函数名: tsg_lua_cache_script
+ * 输入参数: tsg_lua_handle L 指定虚拟机
+ * char *script 待缓存的lua脚本
+ * size_t *script_len 待缓存的lua脚本大小
+ *
+ * 返回值: int 成功,返回一个大于1的值,是脚本在当前虚拟机的唯一标识;失败,返回错误值err_value */
+int tsg_lua_cache_script(tsg_lua_handle L, const char *script, size_t script_len);
+
+/* 函数名: tsg_lua_cache_script_file
+ * 输入参数: tsg_lua_handle L 指定虚拟机
+ * char *script 待缓存的lua脚本路径名
+ *
+ * 返回值: int 成功,返回一个大于1的值,是脚本在当前虚拟机的唯一标识;失败,返回错误值err_value */
+int tsg_lua_cache_script_file(tsg_lua_handle L, const char *script);
+
+/* 函数名: tsg_unchache_script
+ * 输入参数: tsg_lua_handle L 指定虚拟机
+ * size_t script_id 当前虚拟机内指定脚本的唯一标识
+ * 返回值: int 成功,返回0;失败,返回错误码err_value */
+int tsg_lua_uncache_script(tsg_lua_handle L, size_t script_id);
+
+/* 函数名: tsg_cache_exec
+ * 输入参数: tsg_lua_handle L 指定虚拟机
+ * size_t script_id 当前虚拟机内指定脚本的唯一标识
+ * char *in 输入待处理的数据
+ * size_t in_len 输入待处理的数据的长度
+ * 输出参数: char *out 输出结果
+ * size_t *out_len 输出结果的长度
+ * size_t *out_type 输出结果的类型
+ * 返回值: int 成功,返回0;失败,返回错误值err_value */
+int tsg_lua_cache_exec(tsg_lua_handle L, size_t script_id, const char *in, size_t in_len, char *out, size_t *out_len, size_t *out_type);
+
+/* 函数名: tsg_destory_lua
+ * 输入参数: tsg_lua_handle L 指定虚拟机
+ * 返回值: int 成功,返回0;失败返回错误值err_value */
+int tsg_destory_lua(tsg_lua_handle L);
+
+#endif
diff --git a/lib/libtsglua.a b/lib/libtsglua.a
new file mode 100644
index 0000000..d799972
--- /dev/null
+++ b/lib/libtsglua.a
Binary files differ
diff --git a/lib/libtsglua.so b/lib/libtsglua.so
new file mode 100755
index 0000000..e0025c0
--- /dev/null
+++ b/lib/libtsglua.so
Binary files differ
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644
index 0000000..e98e04d
--- /dev/null
+++ b/src/CMakeLists.txt
@@ -0,0 +1,14 @@
+cmake_minimum_required(VERSION 3.5)
+SET(CMAKE_CXX_COMPILER /usr/bin/g++)
+aux_source_directory(. DIR_LIB_SRCS)
+include_directories("/usr/local/include/luajit-2.1/")
+link_directories("/usr/local/lib")
+link_libraries("libluajit-5.1.a")
+
+add_definitions(-g -W -Wall -O0 -DTSG_LUA_DEBUG)
+SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -shared -fPIC")
+add_library(tsglua_static ${DIR_LIB_SRCS})
+add_library(tsglua SHARED ${DIR_LIB_SRCS})
+set_target_properties(tsglua_static PROPERTIES OUTPUT_NAME "tsglua")
+target_link_libraries(tsglua libluajit-5.1.a dl)
+
diff --git a/src/tsg_lua_func.cpp b/src/tsg_lua_func.cpp
new file mode 100644
index 0000000..b9e0403
--- /dev/null
+++ b/src/tsg_lua_func.cpp
@@ -0,0 +1,1329 @@
+/*************************************************************************
+ > File Name: tsg_lua_func.c
+ > Author: pxz
+ > Created Time: Wed 08 Jul 2020 03:45:55 PM CST
+ ************************************************************************/
+extern "C"
+{
+#include<stdio.h>
+#include<stdlib.h>
+#include<string.h>
+#include<setjmp.h>
+#include "lualib.h"
+#include "luajit.h"
+#include "lauxlib.h"
+}
+#include<tcmalloc.h>
+#include"../include/tsg_lua_interface.h"
+
+#ifndef MIN
+#define MIN(a,b) (((a) < (b))?(a):(b))
+#endif
+
+#ifndef TSG_MAX_LUA_ID
+#define TSG_MAX_LUA_ID 256
+#endif
+
+#define MAX_BEGIN_CODE_SIZE 23
+#define MAX_END_CODE_SIZE 22
+
+#define TEXT_BEGIN_CODE "return function()"
+#define TEXT_BEGIN_SIZE (sizeof(TEXT_BEGIN_CODE) - 1)
+#define TEXT_INIT_CODE "\nlocal newglobaltable = {}\nsetmetatable(newglobaltable, {__index = _G})\nsetfenv(1, newglobaltable)"
+#define TEXT_INIT_SIZE (sizeof(TEXT_INIT_CODE) - 1)
+#define TEXT_END_CODE "\nend"
+#define TEXT_END_SIZE (sizeof(TEXT_END_CODE) - 1)
+
+/* bytecode for luajit 2.0 */
+#define LJ20_BYTECODE_END_STRIPPED \
+ "\x14\x03\x00\x01\x00\x01\x00\x03" \
+ "\x31\x00\x00\x00\x30\x00\x00\x80\x48\x00\x02\x00" \
+ "\x00\x00"
+#define LJ20_BYTECODE_END_SIZE (sizeof(LJ20_BYTECODE_END_STRIPPED) - 1)
+
+/* bytecode for luajit 2.1 */
+#define LJ21_BYTECODE_END_STRIPPED \
+ "\x14\x03\x00\x01\x00\x01\x00\x03" \
+ "\x33\x00\x00\x00\x32\x00\x00\x80\x4c\x00\x02\x00" \
+ "\x00\x00"
+
+#define LJ21_BYTECODE_END_SIZE (sizeof(LJ21_BYTECODE_END_STRIPPED) - 1)
+
+/* bytecode for both */
+#define LJ_BYTECODE_LEN_STRIPPED 22
+#define LJ_HEADERSIZE 5
+#define LJ_BCDUMP_F_BE 0x01
+#define LJ_BCDUMP_F_STRIP 0x02
+#define LJ21_BCDUMP_VERSION 2
+#define LJ20_BCDUMP_VERSION 1
+#define LJ_SIGNATURE "\x1b\x4c\x4a"
+
+#define EXEC_ERROR_INFO_NUM ((int)(sizeof(exec_error) / sizeof(exec_error_massage_t)))
+#define SYNTAX_ERROR_INFO_NUM ((int)(sizeof(syntax_error) / sizeof(char *)))
+
+
+typedef struct{
+ const char *err_info1;
+ const char *err_info2;
+}exec_error_massage_t;
+
+enum{
+ TSG_LUA_READER_BUFFSIZE = 4096
+};
+
+typedef enum{
+ TSG_LUA_TEXT_FILE,
+ TSG_LUA_BC_LUA,
+ TSG_LUA_BC_LJ
+}tsg_lua_clfactory_file_type_t;
+
+typedef struct{
+ const char *s;
+ tsg_lua_clfactory_file_type_t file_type;
+ int sent_begin;
+ int sent_end;
+ int size;
+
+ size_t begin_code_len;
+ size_t end_code_len;
+ size_t rest_len;
+ const char *begin_code_ptr;
+ const char *end_code_ptr;
+}tsg_lua_clfactory_buffer_t;
+
+typedef struct{
+ FILE *f;
+ tsg_lua_clfactory_file_type_t file_type;
+ int extraline;
+ int sent_begin;
+ int sent_end;
+
+ size_t begin_code_len;
+ size_t end_code_len;
+ size_t rest_len;
+ union{
+ const char *ptr;
+ char str[MAX_BEGIN_CODE_SIZE];
+ }begin_code;
+ const char *end_code_ptr;
+
+ char buff[TSG_LUA_READER_BUFFSIZE];
+}tsg_lua_clfactory_file_t;
+
+static jmp_buf lua_exception[TSG_MAX_LUA_ID];
+
+static const char *syntax_error[] =
+{
+ "'end' expected", /* ERR_SCRIPT_END_EXPECTED */
+ "'then' expected", /* ERR_SCRIPT_THEN_EXPECTED */
+ "'do' expected", /* ERR_SCRIPT_DO_EXPECTED */
+ "'<eof>' expected", /* ERR_SCRIPT_EOF_EXPECTED */
+ "'=' or 'in' expected", /* ERR_SCRIPT_EQUAL_IN_EXPECTED */
+ "unexpected symbol", /* ERR_SCRIPT_UNEXPECTED_SYMBOL */
+ "'<name>' expected", /* ERR_SCRIPT_NAME_EXPECT */
+ "')' expected", /* ERR_SCRIPT_RIGHT_CURVES_BRACKET */
+ "'}' expected", /* ERR_SCRIPT_RIGHT_CURLY_BRACKET */
+};
+
+static exec_error_massage_t exec_error[] =
+{
+ {"bad argument", "(string expected, got nil)"}, /* ERR_SCRIPT_STRING_EXPECTED_BUT_NIL */
+ {"bad argument", "(string expected, got boolean)"}, /* ERR_SCRIPT_STRING_EXPECTED_BUT_BOOL */
+ {"bad argument", "(string expected, got table)"}, /* ERR_SCRIPT_STRING_EXPECTED_BUT_TABLE */
+ {"attempt to call global", "(a nil value)"}, /* ERR_SCRIPT_CALL_GLOBAL_BUT_NIL */
+};
+
+static void debuginfo(const char *info, const char *file, size_t line)
+{
+#ifdef TSG_LUA_DEBUG
+ printf("error: [%s:%ld]%s\n", file, line, info);
+#else
+ (void)info;
+ (void)file;
+ (void)line;
+#endif
+ return ;
+}
+
+static long tsg_lua_clfactory_file_size(FILE *f)
+{
+ long cur_pos, len;
+ cur_pos = ftell(f);
+ if (cur_pos == -1)
+ {
+ return -1;
+ }
+
+ if (fseek(f, 0, SEEK_END) != 0)
+ {
+ return -1;
+ }
+
+ len = ftell(f);
+ if (len == -1)
+ {
+ return -1;
+ }
+
+ if (fseek(f, cur_pos, SEEK_SET) != 0)
+ {
+ return -1;
+ }
+
+ return len;
+}
+
+static void tsg_lua_clfactory_file_text_prepare(tsg_lua_clfactory_file_t *lf)
+{
+ lf->begin_code.ptr = TEXT_BEGIN_CODE;
+ lf->begin_code_len = TEXT_BEGIN_SIZE;
+ lf->end_code_ptr = TEXT_END_CODE;
+ lf->end_code_len = TEXT_END_SIZE;
+}
+
+static int tsg_lua_clfactory_bytecode_buffer_prepare(tsg_lua_clfactory_buffer_t *ls)
+{
+ int little_endian, version, stripped;
+
+ if (ls->file_type == TSG_LUA_BC_LJ)
+ {
+ /* get bytecode header */
+ if (ls->size <= LJ_HEADERSIZE)
+ {
+ debuginfo("script is bad", __FILE__, __LINE__);
+ return ERR_SCRIPT_IS_BAD;
+ }
+
+ ls->size--;
+ /* get bytecode version */
+ version = (int)(ls->s[3]);
+
+ /* compare bytecode header */
+ if (strncmp(ls->s, LJ_SIGNATURE, sizeof(LJ_SIGNATURE) - 1))
+ {
+ debuginfo("bad byte-code header", __FILE__, __LINE__);
+ return ERR_SCRIPT_BYTECODE_BAD_HEADER;
+ }
+
+ /* little endian or big little endian */
+ little_endian = !((ls->s[4]) & LJ_BCDUMP_F_BE);
+ if (little_endian == 0)
+ {
+ debuginfo("not support byte-code coding by big-endian", __FILE__, __LINE__);
+ return ERR_SCRIPT_BYTECODE_NOT_SUPPORT_BIG_ENDIAN;
+ }
+
+ /* stripped or debug */
+ stripped = (ls->s[4]) & LJ_BCDUMP_F_STRIP;
+ if (!stripped)
+ {
+ debuginfo("not support byte-code include debug-info", __FILE__, __LINE__);
+ return ERR_SCRIPT_BYTECODE_NOT_SUPPORT_DEBUG;
+ }
+
+ ls->end_code_len = LJ_BYTECODE_LEN_STRIPPED;
+ if (version == LJ21_BCDUMP_VERSION)
+ {
+ ls->end_code_ptr = LJ21_BYTECODE_END_STRIPPED;
+ }
+#if 0
+ else if (version == LJ20_BCDUMP_VERSION)
+ {
+ ls->end_code_ptr = LJ20_BYTECODE_END_STRIPPED;
+ }
+#endif
+ else
+ {
+ debuginfo("bytecode format version unsupported", __FILE__, __LINE__);
+ return ERR_SCRIPT_BYTECODE_VERSION_UNSUPPORTED;
+ }
+ }
+ return 0;
+}
+
+static int tsg_lua_clfactory_bytecode_file_prepare(tsg_lua_clfactory_file_t *lf)
+{
+ int little_endian, version, stripped;
+ size_t size;
+ long fsize;
+
+ *lf->begin_code.str = LUA_SIGNATURE[0];
+ if (lf->file_type == TSG_LUA_BC_LJ)
+ {
+ /* get bytecode header */
+ size = fread(lf->begin_code.str + 1, 1, LJ_HEADERSIZE - 1, lf->f);
+ if (size != LJ_HEADERSIZE - 1)
+ {
+ debuginfo("can not read header", __FILE__, __LINE__);
+ return ERR_SCRIPT_BYTECODE_NO_HEADER;
+ }
+
+ /* get bytecode version */
+ version = *(lf->begin_code.str + 3);
+
+ /* compare bytecode header */
+ if (strncmp(lf->begin_code.str, LJ_SIGNATURE, sizeof(LJ_SIGNATURE) - 1))
+ {
+ debuginfo("bad byte-code header", __FILE__, __LINE__);
+ return ERR_SCRIPT_BYTECODE_BAD_HEADER;
+ }
+
+ lf->begin_code_len = LJ_HEADERSIZE;
+
+ /* little endian or big little endian */
+ little_endian = !((*(lf->begin_code.str + 4)) & LJ_BCDUMP_F_BE);
+ if (little_endian == 0)
+ {
+ debuginfo("not support byte-code coding by big-endian", __FILE__, __LINE__);
+ return ERR_SCRIPT_BYTECODE_NOT_SUPPORT_BIG_ENDIAN;
+ }
+
+ /* stripped or debug */
+ stripped = (*(lf->begin_code.str + 4)) & LJ_BCDUMP_F_STRIP;
+ if (!stripped)
+ {
+ debuginfo("not support byte-code include debug-info", __FILE__, __LINE__);
+ return ERR_SCRIPT_BYTECODE_NOT_SUPPORT_DEBUG;
+ }
+
+ if (version == LJ21_BCDUMP_VERSION)
+ {
+ lf->end_code_ptr = LJ21_BYTECODE_END_STRIPPED;
+ lf->end_code_len = LJ_BYTECODE_LEN_STRIPPED;
+ }else if (version == LJ20_BCDUMP_VERSION)
+ {
+ lf->end_code_ptr = LJ20_BYTECODE_END_STRIPPED;
+ lf->end_code_len = LJ_BYTECODE_LEN_STRIPPED;
+ }else
+ {
+ debuginfo("bytecode format version unsupported", __FILE__, __LINE__);
+ return ERR_SCRIPT_BYTECODE_VERSION_UNSUPPORTED;
+ }
+ fsize = tsg_lua_clfactory_file_size(lf->f);
+ if (fsize < 0)
+ {
+ return ERR_SCRIPT_IS_BAD;
+ }
+ lf->rest_len = fsize - LJ_HEADERSIZE;
+ }
+ return 0;
+}
+
+static const char * tsg_lua_gets(lua_State *L, void *ud, size_t *size)
+{
+ (void)L;
+ tsg_lua_clfactory_buffer_t *ls = (tsg_lua_clfactory_buffer_t *)ud;
+ if (ls->file_type == TSG_LUA_TEXT_FILE)
+ {
+ if (ls->sent_begin == 0)
+ {
+ ls->sent_begin = 1;
+ *size = ls->begin_code_len;
+ return ls->begin_code_ptr;
+ }
+ }
+ if (ls->size == 0)
+ {
+ if (ls->sent_end == 0)
+ {
+ ls->sent_end = 1;
+ *size = ls->end_code_len;
+ return ls->end_code_ptr;
+ }
+ return NULL;
+ }
+
+ if (ls->file_type == TSG_LUA_BC_LJ)
+ {
+#if 0
+ lf->rest_len -= ls->size;
+ if (lf->rest_len == 0)
+ {
+ if (--ls->size == 0 && lf->sent_end == 0)
+ {
+ lf->sent_end = 1;
+ *size = lf->end_code_len;
+
+ return lf->end_code_ptr;
+ }
+ }
+#endif
+ }
+
+ *size = ls->size;
+ ls->size = 0;
+
+ return ls->s;
+}
+
+static const char * tsg_lua_getf(lua_State *L, void *ud, size_t *size)
+{
+ (void)L;
+ tsg_lua_clfactory_file_t *lf = (tsg_lua_clfactory_file_t *)ud;
+ if (lf->extraline == 1)
+ {
+ lf->extraline = 0;
+ *size = 1;
+ return "\n";
+ }
+
+ if (lf->sent_begin == 0)
+ {
+ lf->sent_begin = 1;
+ *size = lf->begin_code_len;
+ if (lf->file_type == TSG_LUA_TEXT_FILE)
+ {
+ return lf->begin_code.ptr;
+ }else
+ {
+ return lf->begin_code.str;
+ }
+ }
+ size_t num = fread(lf->buff, 1, sizeof(lf->buff), lf->f);
+ if (num == 0)
+ {
+ if (lf->sent_end == 0)
+ {
+ lf->sent_end = 1;
+ *size = lf->end_code_len;
+ return lf->end_code_ptr;
+ }
+ return NULL;
+ }
+
+ if (lf->file_type == TSG_LUA_BC_LJ)
+ {
+ lf->rest_len -= num;
+ if (lf->rest_len == 0)
+ {
+ if (--num == 0 && lf->sent_end == 0)
+ {
+ lf->sent_end = 1;
+ *size = lf->end_code_len;
+
+ return lf->end_code_ptr;
+ }
+ }
+ }
+ *size = num;
+ return lf->buff;
+}
+
+static int c_lua_atpanic(lua_State *L)
+{
+ char *s = NULL;
+ char err[255];
+ size_t len = 0;
+ int *lua_id;
+
+ lua_id = (int *)lua_getexdata(L);
+ if (lua_type(L, -1) == LUA_TSTRING)
+ {
+ s = (char *)lua_tolstring(L, -1, &len);
+ }
+
+ if (s == NULL)
+ {
+ s = (char *)"unknow reason";
+ len = sizeof(s);
+ }
+ sprintf(err, "lua atpanic:lua VM creashed, reason:%*s\n", (int)len, s);
+ debuginfo(err, __FILE__, __LINE__);
+ longjmp(lua_exception[*lua_id], 1);
+}
+#if 0
+int tsg_lua_memmem(lua_State *L)
+{
+ const char *src;
+ const char *dest;
+ size_t src_len, dest_len;
+ const char *ret;
+ int start, end;
+ int parameter_num = lua_gettop(L);
+ if (parameter_num != 4)
+ {
+ return 0;
+ }
+
+ src = lua_tostring(L, -4);
+ src_len = lua_tointeger(L, -3);
+ dest = lua_tostring(L, -2);
+ dest_len = lua_tointeger(L, -1);
+
+ if (!src || !dest || !src_len || !dest_len)
+ {
+ return 0;
+ }
+
+ ret = (const char *)memmem(src, src_len, dest, dest_len);
+ if (ret == NULL)
+ {
+ return 0;
+ }
+ start = ret - src;
+ end = start + dest_len;
+ lua_pushinteger(L, start);
+ lua_pushinteger(L, end);
+
+ return 2;
+}
+
+static void *mem_alloc(void *ud, void *ptr, size_t osize, size_t nsize)
+{
+ (void)ud;
+ (void)osize;
+ if (nsize == 0) {
+ tc_free(ptr);
+ return NULL;
+ } else {
+ return tc_realloc(ptr, nsize);
+ }
+}
+#endif
+tsg_lua_handle tsg_lua_vm_create()
+{
+ lua_State *L;
+ //const char *err;
+
+ L = luaL_newstate();
+ //L = lua_newstate(mem_alloc, NULL);
+ if (L == NULL)
+ return NULL;
+ lua_atpanic(L, c_lua_atpanic);
+ luaL_openlibs(L);
+ lua_createtable(L, 0, 2);
+ //lua_pushcfunction(L, tsg_lua_memmem);
+ //lua_setfield(L, -2, "memmem");
+ lua_setglobal(L, "tsg");
+#if 0
+ const char *code = "local ffi = require(\"ffi\")\n"\
+ "ffi.cdef[[char *memmem(const char *haystack, size_t haystacklen, const char *needle, size_t needlelen);]]\n"\
+ "tsg.ffi = ffi\n"\
+ "tsg.C = ffi.C";
+ if (luaL_dostring(L, code))
+ {
+ err = lua_tostring(L, -1);
+ debuginfo(err, __FILE__, __LINE__);
+ lua_close(L);
+ return NULL;
+ }
+#endif
+ return L;
+}
+
+int tsg_lua_exec_file(tsg_lua_handle lua, const char *script, const char *in, size_t in_len, char *out, size_t *out_len, size_t *out_type)
+{
+ lua_State *L = (lua_State *)lua;
+ const char *err = NULL;
+ char err_buf[255];
+ int ret = 0;
+ int i = 0;
+ int sharp = 0;
+ tsg_lua_clfactory_file_t lf;
+ int *lua_id;
+
+ if (L == NULL)
+ {
+ debuginfo("lua VM is null.", __FILE__, __LINE__);
+ return ERR_LUAVM_ISNULL;
+ }
+ if (script == NULL)
+ {
+ debuginfo("script is null.", __FILE__, __LINE__);
+ return ERR_SCRIPT_ISNULL;
+ }
+
+ if (in == NULL)
+ {
+ debuginfo("input is null.", __FILE__, __LINE__);
+ return ERR_INPUT_ISNULL;
+ }
+
+ if (in_len < 1)
+ {
+ debuginfo("in_len is invailed", __FILE__, __LINE__);
+ return ERR_IN_LEN_INVAILD;
+ }
+
+ lua_id = (int *)lua_getexdata(L);
+
+ lf.extraline = 0;
+ lf.sent_begin = 0;
+ lf.sent_end = 0;
+ lf.file_type = TSG_LUA_TEXT_FILE;
+
+ lf.f = fopen(script, "r");
+ if (lf.f == NULL)
+ {
+ return ERR_SCRIPT_NOT_EXIT;
+ }
+ int c = getc(lf.f);
+ if (c == '#')
+ {
+ lf.extraline = 1;
+ while ((c = getc(lf.f)) != EOF && c != '\n')
+ {
+ /* skip first line */
+ }
+ if (c == '\n')
+ {
+ c = getc(lf.f);
+ }
+ sharp = 1;
+ }
+
+ if (c == LUA_SIGNATURE[0] && script)
+ {
+ lf.f = freopen(script, "rb", lf.f);
+ if (lf.f == NULL)
+ {
+ return ERR_SCRIPT_NOT_EXIT;
+ }
+
+ lf.file_type = TSG_LUA_BC_LJ;
+ if (sharp)
+ {
+ /* 出于对安全的考虑,禁用字节码文件首行不是lua代码的文件
+ * 这是因为,字节码文件首行不是lua代码会规避掉一些常规字节码检查 */
+ fclose(lf.f);
+ return ERR_SCRIPT_IS_BAD;
+ }
+
+ while((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0])
+ {
+ /* skip eventual "#! ..." */
+ }
+ int status = tsg_lua_clfactory_bytecode_file_prepare(&lf);
+ if(status != 0)
+ {
+ fclose(lf.f);
+ return status;
+ }
+ lf.extraline = 0;
+ }else
+ {
+ tsg_lua_clfactory_file_text_prepare(&lf);
+ ungetc(c, lf.f);
+ }
+ lua_settop(L, 0);
+ ret = lua_load(L, tsg_lua_getf, &lf, script);
+ fclose(lf.f);
+ if (ret != 0)
+ {
+ if (ret == LUA_ERRMEM)
+ {
+ return ERR_MEM_NOT_ENOUGH;
+ }
+ else if (lua_isstring(L, -1))
+ {
+ err = lua_tostring(L, -1);
+ debuginfo(err, __FILE__, __LINE__);
+ for (i = 0; i < SYNTAX_ERROR_INFO_NUM; i++)
+ {
+ if (strstr(err, syntax_error[i]))
+ {
+ return ERR_SCRIPT_SYNTAX_ERROR - (i + 1);
+ }
+ }
+ return ERR_SCRIPT_SYNTAX_ERROR;
+ }
+ else
+ {
+ return ERR_UNKNOWN;
+ }
+ }
+ /* set new globaltable */
+ lua_createtable(L, 0, 1);
+ lua_pushvalue(L, -1);
+ lua_pushvalue(L, LUA_GLOBALSINDEX);
+ lua_setfield(L, -2, "__index");
+ lua_setmetatable(L, -2);
+ lua_setfenv(L, -2);
+
+ if (lua_pcall(L, 0, LUA_MULTRET, 0))
+ {
+ err = lua_tostring(L, -1);
+ debuginfo(err, __FILE__, __LINE__);
+ for (i = 0; i < SYNTAX_ERROR_INFO_NUM; i++)
+ {
+ if (strstr(err, syntax_error[i]))
+ {
+ return ERR_SCRIPT_SYNTAX_ERROR - (i + 1);
+ }
+ }
+ return ERR_SCRIPT_SYNTAX_ERROR;
+ }
+
+ /* 输入待处理数据 */
+ lua_getglobal(L, "tsg");
+ lua_pushlstring(L, in, in_len);
+ lua_setfield(L, -2, "data");
+ lua_settop(L, 1);
+
+ if (setjmp(lua_exception[*lua_id]) == 0)
+ {
+ if (lua_pcall(L, 0, LUA_MULTRET, 0))
+ {
+ err = lua_tostring(L, -1);
+ debuginfo(err, __FILE__, __LINE__);
+ for (i = 0; i < EXEC_ERROR_INFO_NUM; i++)
+ {
+ if ((strstr(err, exec_error[i].err_info1)) && (strstr(err, exec_error[i].err_info2)))
+ return ERR_SCRIPT_EXEC_ERROR - (i + 1);
+ }
+ return ERR_SCRIPT_EXEC_ERROR;
+ }
+ int num = lua_gettop(L);
+ if (num < 2)
+ {
+ sprintf((char *)err_buf,"num:%d", num);
+ debuginfo(err_buf, __FILE__, __LINE__);
+ return ERR_SCRIPT_RETURN_TOO_FEW;
+ }
+ if (num > 2)
+ {
+ sprintf((char *)err_buf,"num:%d", num);
+ debuginfo(err_buf, __FILE__, __LINE__);
+ return ERR_SCRIPT_RETURN_TOO_MUCH;
+ }
+ *out_len = lua_tonumber(L, -2);
+ if (*out_len < 1)
+ {
+ debuginfo("script out_len is 0", __FILE__, __LINE__);
+ return ERR_SCRIPT_RETURN_LEN_INVAILD;
+ }
+ switch(lua_type(L, -1))
+ {
+ case LUA_TSTRING:
+ memcpy(out, lua_tostring(L, -1), *out_len);
+ *out_type = STRING;
+ break;
+ case LUA_TBOOLEAN:
+ out[0] = lua_toboolean(L, -1);
+ //*out_len = 1;
+ *out_type = BOOLEAN;
+ break;
+ case LUA_TNUMBER:
+ *(long size_t *)out = lua_tointeger(L, -1);
+ //*out_len = 8;
+ *out_type = INTEGER;
+ break;
+ default:
+ sprintf((char *)err_buf,"out_type:%d", (lua_type(L, -1)));
+ debuginfo(err_buf, __FILE__, __LINE__);
+ *out_len = 0;
+ return ERR_SCRIPT_RETURN_TYPE_INVAILD;
+ }
+ }else
+ {
+ return ERR_SCRIPT_EXEC_ERROR;
+ }
+
+ return 0;
+}
+
+
+int tsg_lua_exec(tsg_lua_handle lua, const char *script, size_t script_len, const char *in, size_t in_len, char *out, size_t *out_len, size_t *out_type)
+{
+ lua_State *L = (lua_State *)lua;
+ const char *err = NULL;
+ char err_buf[255];
+ int ret = 0;
+ int i = 0;
+ int sharp = 0;
+ int status;
+ tsg_lua_clfactory_buffer_t ls;
+ int *lua_id;
+
+ if (L == NULL)
+ {
+ debuginfo("lua VM is null.", __FILE__, __LINE__);
+ return ERR_LUAVM_ISNULL;
+ }
+ if (script == NULL)
+ {
+ debuginfo("script is null.", __FILE__, __LINE__);
+ return ERR_SCRIPT_ISNULL;
+ }
+
+ if (in == NULL)
+ {
+ debuginfo("input is null.", __FILE__, __LINE__);
+ return ERR_INPUT_ISNULL;
+ }
+
+ if (in_len < 1)
+ {
+ debuginfo("in_len is invailed", __FILE__, __LINE__);
+ return ERR_IN_LEN_INVAILD;
+ }
+
+ lua_id = (int *)lua_getexdata(L);
+
+ ls.s = script;
+ ls.size = script_len;
+ ls.sent_begin = 0;
+ ls.sent_end = 0;
+
+ if (script[0] == '#')
+ {
+ for (i = 0; i < ls.size; i++)
+ {
+ if (script[i] == '\n')
+ {
+ /* skip extra line */
+ ls.s = &script[i];
+ ls.size = script_len - i;
+ break;
+ }
+ }
+ if (i == ls.size)
+ {
+ return ERR_SCRIPT_SYNTAX_ERROR;
+ }
+ sharp = 1;
+ }
+ if (script[i] == LUA_SIGNATURE[0])
+ {
+ /* 不会使用lua虚拟机, 使用的是luajit虚拟机 */
+ ls.file_type = TSG_LUA_BC_LJ;
+ if (sharp)
+ {
+ return ERR_SCRIPT_IS_BAD;
+ }
+ status = tsg_lua_clfactory_bytecode_buffer_prepare(&ls);
+ if (status != 0)
+ {
+ return status;
+ }
+
+ }else
+ {
+ ls.file_type = TSG_LUA_TEXT_FILE;
+ ls.begin_code_ptr = TEXT_BEGIN_CODE;
+ ls.begin_code_len = TEXT_BEGIN_SIZE;
+ ls.end_code_ptr = TEXT_END_CODE;
+ ls.end_code_len = TEXT_END_SIZE;
+ }
+ lua_settop(L, 0);
+ ret = lua_load(L, tsg_lua_gets, &ls, "main");
+ if (ret != 0)
+ {
+ if (ret == LUA_ERRMEM)
+ {
+ return ERR_MEM_NOT_ENOUGH;
+ }
+ else if (lua_isstring(L, -1))
+ {
+ err = lua_tostring(L, -1);
+ debuginfo(err, __FILE__, __LINE__);
+ for (i = 0; i < SYNTAX_ERROR_INFO_NUM; i++)
+ {
+ if (strstr(err, syntax_error[i]))
+ {
+ return ERR_SCRIPT_SYNTAX_ERROR - (i + 1);
+ }
+ }
+ return ERR_SCRIPT_SYNTAX_ERROR;
+ }
+ else
+ {
+ return ERR_UNKNOWN;
+ }
+ }
+ /* set new globaltable */
+ lua_createtable(L, 0, 1);
+ lua_pushvalue(L, -1);
+ lua_pushvalue(L, LUA_GLOBALSINDEX);
+ lua_setfield(L, -2, "__index");
+ lua_setmetatable(L, -2);
+ lua_setfenv(L, -2);
+ if (lua_pcall(L, 0, LUA_MULTRET, 0))
+ {
+ err = lua_tostring(L, -1);
+ debuginfo(err, __FILE__, __LINE__);
+ for (i = 0; i < SYNTAX_ERROR_INFO_NUM; i++)
+ {
+ if (strstr(err, syntax_error[i]))
+ {
+ return ERR_SCRIPT_SYNTAX_ERROR - (i + 1);
+ }
+ }
+ return ERR_SCRIPT_SYNTAX_ERROR;
+ }
+
+ /* 输入待处理数据 */
+ lua_getglobal(L, "tsg");
+ lua_pushlstring(L, in, in_len);
+ lua_setfield(L, -2, "data");
+ lua_settop(L, 1);
+ if (setjmp(lua_exception[*lua_id]) == 0)
+ {
+ if (lua_pcall(L, 0, LUA_MULTRET, 0))
+ {
+ err = lua_tostring(L, -1);
+ debuginfo(err, __FILE__, __LINE__);
+ for (i = 0; i < EXEC_ERROR_INFO_NUM; i++)
+ {
+ if ((strstr(err, exec_error[i].err_info1)) && (strstr(err, exec_error[i].err_info2)))
+ return ERR_SCRIPT_EXEC_ERROR - (i + 1);
+ }
+ return ERR_SCRIPT_EXEC_ERROR;
+ }
+ int num = lua_gettop(L);
+ if (num < 2)
+ {
+ sprintf((char *)err_buf,"num:%d", num);
+ debuginfo(err_buf, __FILE__, __LINE__);
+ return ERR_SCRIPT_RETURN_TOO_FEW;
+ }
+ if (num > 2)
+ {
+ sprintf((char *)err_buf,"num:%d", num);
+ debuginfo(err_buf, __FILE__, __LINE__);
+ return ERR_SCRIPT_RETURN_TOO_MUCH;
+ }
+ *out_len = lua_tonumber(L, -2);
+ if (*out_len < 1)
+ {
+ debuginfo("script out_len is 0", __FILE__, __LINE__);
+ return ERR_SCRIPT_RETURN_LEN_INVAILD;
+ }
+ switch(lua_type(L, -1))
+ {
+ case LUA_TSTRING:
+ memcpy(out, lua_tostring(L, -1), *out_len);
+ *out_type = STRING;
+ break;
+ case LUA_TBOOLEAN:
+ out[0] = lua_toboolean(L, -1);
+ //*out_len = 1;
+ *out_type = BOOLEAN;
+ break;
+ case LUA_TNUMBER:
+ *(long size_t *)out = lua_tointeger(L, -1);
+ //*out_len = 8;
+ *out_type = INTEGER;
+ break;
+ default:
+ sprintf((char *)err_buf,"out_type:%d", (lua_type(L, -1)));
+ debuginfo(err_buf, __FILE__, __LINE__);
+ *out_len = 0;
+ return ERR_SCRIPT_RETURN_TYPE_INVAILD;
+ }
+ }else
+ {
+ return ERR_SCRIPT_EXEC_ERROR;
+ }
+
+ return 0;
+}
+
+int tsg_lua_cache_script(tsg_lua_handle lua, const char *script, size_t script_len)
+{
+ size_t script_id = 0;
+ const char *err = NULL;
+ int ret = 0;
+ int i = 0;
+ int sharp = 0, status = 0;
+ lua_State *L = (lua_State *)lua;
+
+ if (L == NULL)
+ {
+ debuginfo("lua VM is null.", __FILE__, __LINE__);
+ return ERR_LUAVM_ISNULL;
+ }
+ if (script == NULL)
+ {
+ debuginfo("script is null.", __FILE__, __LINE__);
+ return ERR_SCRIPT_ISNULL;
+ }
+
+ tsg_lua_clfactory_buffer_t ls;
+ ls.s = script;
+ ls.size = script_len;
+ ls.sent_begin = 0;
+ ls.sent_end = 0;
+
+ if (script[0] == '#')
+ {
+ for (i = 0; i < ls.size; i++)
+ {
+ if (script[i] == '\n')
+ {
+ /* skip extra line */
+ ls.s = &script[i];
+ ls.size = script_len - i;
+ break;
+ }
+ }
+ if (i == ls.size)
+ {
+ return ERR_SCRIPT_SYNTAX_ERROR;
+ }
+ sharp = 1;
+ }
+ if (script[i] == LUA_SIGNATURE[0])
+ {
+ /* 不会使用lua虚拟机, 使用的是luajit虚拟机 */
+ ls.file_type = TSG_LUA_BC_LJ;
+ if (sharp)
+ {
+ return ERR_SCRIPT_IS_BAD;
+ }
+
+ status = tsg_lua_clfactory_bytecode_buffer_prepare(&ls);
+ if (status != 0)
+ {
+ return status;
+ }
+
+ }else
+ {
+ ls.file_type = TSG_LUA_TEXT_FILE;
+ ls.begin_code_ptr = TEXT_BEGIN_CODE;
+ ls.begin_code_len = TEXT_BEGIN_SIZE;
+ ls.end_code_ptr = TEXT_END_CODE;
+ ls.end_code_len = TEXT_END_SIZE;
+ }
+
+ lua_settop(L, 0);
+ ret = lua_load(L, tsg_lua_gets, &ls, "string");
+ if (ret != 0)
+ {
+ if (ret == LUA_ERRMEM)
+ {
+ return ERR_MEM_NOT_ENOUGH;
+ }
+ else if (lua_isstring(L, -1))
+ {
+ err = lua_tostring(L, -1);
+ debuginfo(err, __FILE__, __LINE__);
+ for (i = 0; i < SYNTAX_ERROR_INFO_NUM; i++)
+ {
+ if (strstr(err, syntax_error[i]))
+ {
+ return ERR_SCRIPT_SYNTAX_ERROR - (i + 1);
+ }
+ }
+ return ERR_SCRIPT_SYNTAX_ERROR;
+ }
+ else
+ {
+ return ERR_UNKNOWN;
+ }
+ }
+ if (lua_pcall(L, 0, LUA_MULTRET, 0))
+ {
+ err = lua_tostring(L, -1);
+ debuginfo(err, __FILE__, __LINE__);
+ for (i = 0; i < SYNTAX_ERROR_INFO_NUM; i++)
+ {
+ if (strstr(err, syntax_error[i]))
+ {
+ return ERR_SCRIPT_SYNTAX_ERROR - (i + 1);
+ }
+ }
+ return ERR_SCRIPT_SYNTAX_ERROR;
+ }
+
+ script_id = luaL_ref(L, LUA_REGISTRYINDEX);
+ if ((script_id == (size_t)LUA_REFNIL) || (script_id == (size_t)LUA_NOREF))
+ {
+ debuginfo("lua cache failed.", __FILE__, __LINE__);
+ return ERR_LUA_CACHE_FAILED;
+ }
+
+ return script_id;
+}
+
+int tsg_lua_cache_script_file(tsg_lua_handle lua, const char *script)
+{
+ size_t script_id;
+ const char *err = NULL;
+ int ret = 0;
+ int i = 0;
+ int sharp = 0;
+ tsg_lua_clfactory_file_t lf;
+ lua_State *L = (lua_State *)lua;
+
+
+ if (L == NULL)
+ {
+ debuginfo("lua VM is null.", __FILE__, __LINE__);
+ return ERR_LUAVM_ISNULL;
+ }
+ if (script == NULL)
+ {
+ debuginfo("script is null.", __FILE__, __LINE__);
+ return ERR_SCRIPT_ISNULL;
+ }
+ lf.extraline = 0;
+ lf.sent_begin = 0;
+ lf.sent_end = 0;
+ lf.file_type = TSG_LUA_TEXT_FILE;
+
+ lf.f = fopen(script, "r");
+ if (lf.f == NULL)
+ {
+ return ERR_SCRIPT_NOT_EXIT;
+ }
+ int c = getc(lf.f);
+ if (c == '#')
+ {
+ lf.extraline = 1;
+ while ((c = getc(lf.f)) != EOF && c != '\n')
+ {
+ /* skip first line */
+ }
+ if (c == '\n')
+ {
+ c = getc(lf.f);
+ }
+ sharp = 1;
+ }
+
+ if (c == LUA_SIGNATURE[0] && script)
+ {
+ lf.f = freopen(script, "rb", lf.f);
+ if (lf.f == NULL)
+ {
+ return ERR_SCRIPT_NOT_EXIT;
+ }
+ lf.file_type = TSG_LUA_BC_LJ;
+ if (sharp)
+ {
+ /* 出于对安全的考虑,禁用字节码文件首行不是lua代码的文件
+ * 这是因为,字节码文件首行不是lua代码会规避掉一些常规字节码检查 */
+ if(script)
+ {
+ fclose(lf.f);
+ }
+
+ return ERR_SCRIPT_IS_BAD;
+ }
+
+ while((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0])
+ {
+ /* skip eventual "#! ..." */
+ }
+ int status = tsg_lua_clfactory_bytecode_file_prepare(&lf);
+ if(status != 0)
+ {
+ return status;
+ }
+ lf.extraline = 0;
+ }else
+ {
+ tsg_lua_clfactory_file_text_prepare(&lf);
+ ungetc(c, lf.f);
+ }
+ lua_settop(L, 0);
+ ret = lua_load(L, tsg_lua_getf, &lf, script);
+ fclose(lf.f);
+ if (ret != 0)
+ {
+ if (ret == LUA_ERRMEM)
+ {
+ return ERR_MEM_NOT_ENOUGH;
+ }
+ else if (lua_isstring(L, -1))
+ {
+ err = lua_tostring(L, -1);
+ debuginfo(err, __FILE__, __LINE__);
+ for (i = 0; i < SYNTAX_ERROR_INFO_NUM; i++)
+ {
+ if (strstr(err, syntax_error[i]))
+ {
+ return ERR_SCRIPT_SYNTAX_ERROR - (i + 1);
+ }
+ }
+ return ERR_SCRIPT_SYNTAX_ERROR;
+ }
+ else
+ {
+ return ERR_UNKNOWN;
+ }
+ }
+ /* set new globaltable */
+ lua_createtable(L, 0, 1);
+ lua_pushvalue(L, -1);
+ lua_pushvalue(L, LUA_GLOBALSINDEX);
+ lua_setfield(L, -2, "__index");
+ lua_setmetatable(L, -2);
+ lua_setfenv(L, -2);
+
+ if (lua_pcall(L, 0, LUA_MULTRET, 0))
+ {
+ err = lua_tostring(L, -1);
+ debuginfo(err, __FILE__, __LINE__);
+ for (i = 0; i < SYNTAX_ERROR_INFO_NUM; i++)
+ {
+ if (strstr(err, syntax_error[i]))
+ {
+ return ERR_SCRIPT_SYNTAX_ERROR - (i + 1);
+ }
+ }
+ return ERR_SCRIPT_SYNTAX_ERROR;
+ }
+
+ /* cache script */
+ script_id = luaL_ref(L, LUA_REGISTRYINDEX);
+ if ((script_id == (size_t)LUA_REFNIL) || (script_id == (size_t)LUA_NOREF))
+ {
+ debuginfo("lua cache failed.", __FILE__, __LINE__);
+ return ERR_LUA_CACHE_FAILED;
+ }
+
+ return script_id;
+}
+
+int tsg_lua_uncache_script(tsg_lua_handle lua, size_t script_id)
+{
+ lua_State *L = (lua_State *)lua;
+
+ if (L == NULL)
+ {
+ debuginfo("lua VM is null.", __FILE__, __LINE__);
+ return ERR_LUAVM_ISNULL;
+ }
+
+ luaL_unref(L, LUA_REGISTRYINDEX, script_id);
+
+ return 0;
+}
+
+int tsg_lua_cache_exec(tsg_lua_handle lua, size_t script_id, const char *in, size_t in_len, char *out, size_t *out_len, size_t *out_type)
+{
+ lua_State *L = (lua_State *)lua;
+ const char *err;
+ char err_buf[255];
+ int i = 0;
+ int num = 0;
+ int *lua_id;
+
+ if (L == NULL)
+ {
+ debuginfo("lua VM is null.", __FILE__, __LINE__);
+ return ERR_LUAVM_ISNULL;
+ }
+ if (script_id < 1)
+ {
+ debuginfo("script_id is invaild.", __FILE__, __LINE__);
+ return ERR_SCRIPT_ID_INVAILD;
+ }
+ if (in == NULL)
+ {
+ debuginfo("input is null.", __FILE__, __LINE__);
+ return ERR_INPUT_ISNULL;
+ }
+ if (in_len < 1)
+ {
+ debuginfo("in_len is invailed", __FILE__, __LINE__);
+ return ERR_IN_LEN_INVAILD;
+ }
+
+ lua_settop(L, 0);
+ lua_id = (int *)lua_getexdata(L);
+
+ lua_rawgeti(L, LUA_REGISTRYINDEX, script_id);
+ lua_getglobal(L, "tsg");
+ lua_pushlstring(L, in, in_len);
+ lua_setfield(L, -2, "data");
+ lua_settop(L, 1);
+
+ if (setjmp(lua_exception[*lua_id]) == 0)
+ {
+ if (lua_pcall(L, 0, LUA_MULTRET, 0))
+ {
+ err = lua_tostring(L, -1);
+ debuginfo(err, __FILE__, __LINE__);
+ for (i = 0; i < EXEC_ERROR_INFO_NUM; i++)
+ {
+ if ((strstr(err, exec_error[i].err_info1)) && (strstr(err, exec_error[i].err_info2)))
+ return ERR_SCRIPT_EXEC_ERROR - (i + 1);
+ }
+ return ERR_SCRIPT_EXEC_ERROR;
+ }
+ num = lua_gettop(L);
+ if (num < 2)
+ {
+ sprintf((char *)err_buf,"num:%d", num);
+ debuginfo(err_buf, __FILE__, __LINE__);
+ return ERR_SCRIPT_RETURN_TOO_FEW;
+ }
+ if (num > 2)
+ {
+ sprintf((char *)err_buf,"num:%d", num);
+ debuginfo(err_buf, __FILE__, __LINE__);
+ return ERR_SCRIPT_RETURN_TOO_MUCH;
+ }
+
+ *out_len = lua_tonumber(L, -2);
+ if (*out_len < 1)
+ {
+ debuginfo("script out_len is 0", __FILE__, __LINE__);
+ return ERR_SCRIPT_RETURN_LEN_INVAILD;
+ }
+ switch(lua_type(L, -1))
+ {
+ case LUA_TSTRING:
+ memcpy(out, lua_tostring(L, -1), *out_len);
+ *out_type = STRING;
+ break;
+ case LUA_TBOOLEAN:
+ out[0] = lua_toboolean(L, -1);
+ //*out_len = 1;
+ *out_type = BOOLEAN;
+ break;
+ case LUA_TNUMBER:
+ *(size_t *)out = lua_tointeger(L, -1);
+ //*out_len = 8;
+ *out_type = INTEGER;
+ break;
+ default:
+ sprintf((char *)err_buf,"out_type:%d", lua_type(L, -1));
+ debuginfo(err_buf, __FILE__, __LINE__);
+ *out_len = 0;
+ return ERR_SCRIPT_RETURN_TYPE_INVAILD;
+ }
+ }else
+ {
+ return ERR_SCRIPT_EXEC_ERROR;
+ }
+
+ return 0;
+}
+
+int tsg_destory_lua(tsg_lua_handle lua)
+{
+ lua_State *L = (lua_State *)lua;
+
+ if (L == NULL)
+ {
+ debuginfo("lua VM is null.", __FILE__, __LINE__);
+ return ERR_LUAVM_ISNULL;
+ }
+
+ lua_close(L);
+ return 0;
+}
+
+int tsg_lua_identify(tsg_lua_handle lua, size_t *id)
+{
+ lua_State *L = (lua_State *)lua;
+ if (L == NULL)
+ {
+ debuginfo("lua VM is null.", __FILE__, __LINE__);
+ return ERR_LUAVM_ISNULL;
+ }
+ if (*id > TSG_MAX_LUA_ID)
+ {
+ return ERR_LUA_ID;
+ }
+
+ lua_setexdata(L, id);
+
+ return 0;
+}
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
new file mode 100644
index 0000000..7992f24
--- /dev/null
+++ b/test/CMakeLists.txt
@@ -0,0 +1,9 @@
+cmake_minimum_required(VERSION 2.8)
+#include_directories("/usr/local/openresty/luajit/include/luajit-2.1/")
+include_directories("../include")
+link_directories("/root/workspace/tsg_lua_0.99/lib")
+link_libraries("libtsglua.so")
+add_definitions(-g -W -Wall -O0)
+add_executable(../singlethread_test test.cpp)
+add_executable(../multithread_test multithread_test.cpp)
+target_link_libraries(../multithread_test tsglua pthread)
diff --git a/test/cache_bytecode_G b/test/cache_bytecode_G
new file mode 100755
index 0000000..a3c1282
--- /dev/null
+++ b/test/cache_bytecode_G
Binary files differ
diff --git a/test/multithread_test b/test/multithread_test
new file mode 100755
index 0000000..46e4fa3
--- /dev/null
+++ b/test/multithread_test
Binary files differ
diff --git a/test/multithread_test.cpp b/test/multithread_test.cpp
new file mode 100644
index 0000000..1f4293b
--- /dev/null
+++ b/test/multithread_test.cpp
@@ -0,0 +1,384 @@
+/*************************************************************************
+ > File Name: multithread_test.cpp
+ > Author: pxz
+ > Created Time: Sat 01 Aug 2020 11:53:47 AM CST
+ ************************************************************************/
+extern "C"
+{
+ #include<stdio.h>
+ #include<string.h>
+ #include<time.h>
+ #include<unistd.h>
+ #include<pthread.h>
+ #include"tsg_lua_interface.h"
+}
+#define calc_time(__start, __end) \
+ (((__end).tv_sec * 1000 * 1000 * 1000 + (__end).tv_nsec) -\
+ ((__start).tv_sec * 1000 * 1000 * 1000 + (__start).tv_nsec))
+
+#ifndef THREAD_NUM
+#define THREAD_NUM 4
+#endif
+
+char script[4096];
+size_t script_len;
+const char *content = "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA\
+ TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT\
+ AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG\
+ GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG\
+ CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGT\
+ GGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCA\
+ GGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAA\
+ TTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAG\
+ AATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCA\
+ GCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGT\
+ AATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACC\
+ AGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTG\
+ GTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACC\
+ CGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAG\
+ AGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTT\
+ TGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACA\
+ TGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCT\
+ GTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGG\
+ TTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGT\
+ CTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGG\
+ CGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCG\
+ TCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTA\
+ CTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCG\
+ AGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCG\
+ GGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACC\
+ TGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAA\
+ TACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGA\
+ GGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACT\
+ GCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTC\
+ ACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGT\
+ TCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGC\
+ CGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCG\
+ CTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTG\
+ GGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCC\
+ CAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCT\
+ GGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGC\
+ GCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGA\
+ GGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGA\
+ GACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGA\
+ GGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTG\
+ AAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAAT\
+ CCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCA\
+ GTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAA\
+ AAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGC\
+ GGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCT\
+ ACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGG\
+ GAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATC\
+ GCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGC\
+ GGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG\
+ TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAA\
+ AAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAG\
+ GAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACT\
+ CCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCC\
+ TGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAG\
+ ACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGC\
+ GTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGA\
+ ACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGA\
+ CAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCA\
+ CTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCA\
+ ACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCG\
+ CCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGG\
+ AGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTC\
+ CGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCG\
+ AGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACC\
+ CCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAG\
+ CTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAG\
+ CCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGG\
+ CCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATC\
+ ACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAA\
+ AAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGC\
+ TGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCC\
+ ACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGG\
+ CTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGG\
+ AGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATT\
+ AGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA\
+ TCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGC\
+ CTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAA\
+ TCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAG\
+ CCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGT\
+ GGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCG\
+ GGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAG\
+ CGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTG\
+ GGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATG\
+ GTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGT\
+ AATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTT\
+ GCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCT\
+ CAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCG\
+ GGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTC\
+ TCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACT\
+ CGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAG\
+ ATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGG\
+ CGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTG\
+ AGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATA\
+ CAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGG\
+ CAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGC\
+ ACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCAC\
+ GCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTC\
+ GAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCG\
+ GGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCT\
+ TGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGG\
+ CGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCA\
+ GCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGG\
+ CCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGC\
+ GCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGG\
+ CGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGA\
+ CTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGG\
+ CCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAA\
+ ACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCC\
+ CAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGT\
+ GAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAA\
+ AGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGG\
+ ATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTAC\
+ TAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGA\
+ GGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGC\
+ GCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGG\
+ TGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTC\
+ AGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAA\
+ ATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGA\
+ GAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC\
+ AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTG\
+ TAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGAC\
+ CAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGT\
+ GGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAAC\
+ CCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACA\
+ GAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACT\
+ TTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAAC\
+ ATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCC\
+ TGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAG\
+ GTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCG\
+ TCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAG\
+ GCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCC\
+ GTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCT\
+ ACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCC\
+ GAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCC\
+ GGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCAC\
+ CTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAA\
+ ATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTG\
+ AGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCAC\
+ TGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCT\
+ CACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAG\
+ TTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAG\
+ CCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATC\
+ GCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCT\
+ GGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATC\
+ CCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCC\
+ TGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGG\
+ CGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG\
+ AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCG\
+ AGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGG\
+ AGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGT\
+ GAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAA\
+ TCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGC\
+ AGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCA\
+ AAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGG\
+ CGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTC\
+ TACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCG\
+ GGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGAT\
+ CGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCG\
+ CGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAG\
+ GTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACA\
+ AAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCA\
+ GGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCAC\
+ TCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGC\
+ CTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGA\
+ GACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG\
+ CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTG\
+ AACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCG\
+ ACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGC\
+ ACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCC\
+ AACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGC\
+ GCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA";
+size_t content_len;
+
+static char *get_script_buffer(const char *file)
+{
+ FILE *fp = fopen(file, "r");
+ if (fp)
+ {
+ int num = fread(script, 1, 4096, fp);
+ if (num != 0)
+ {
+ script[num] = 0;
+ script_len = num;
+ return script;
+ }
+ }
+ return NULL;
+}
+
+static void *test_tsg_lua_exec(void *ptr)
+{
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+ memset(out, 0, sizeof(out));
+ tsg_lua_handle L = (tsg_lua_handle)ptr;
+ int i = 0;
+
+ for (i = 0; i < 10000; i++)
+ {
+ tsg_lua_exec(L, script, script_len, content, content_len, out, &out_len, &out_type);
+ }
+ pthread_exit(NULL);
+}
+
+static void *test_tsg_cache_exec(void *ptr)
+{
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+ memset(out, 0, sizeof(out));
+ tsg_lua_handle L = (tsg_lua_handle)ptr;
+ int i = 0;
+
+ int script_id = tsg_lua_cache_script(L, script, script_len);
+ for (i = 0; i < 10000; i++)
+ {
+ tsg_cache_exec(L, script_id, content, content_len, out, &out_len, &out_type);
+ }
+ pthread_exit(NULL);
+}
+
+static void *test_c_func(void *ptr)
+{
+ (void)ptr;
+ int i = 0;
+
+ for (i = 0; i < 10000; i++)
+ {
+#if 1
+ if (strstr(content, "GGGGGGGGGG"))
+ {
+ printf("get GGGGGGGGGG\n");
+ return NULL;
+ }
+#else
+ size_t j = 0;
+ for (j = 0; j < content_len; j++)
+ {
+ if (content[j] == 'G')
+ {
+ if (strncmp(&content[j], "GGGGGGGGGG", 10) == 0)
+ {
+ printf("get GGGGGGGGGG\n");
+ return NULL;
+ }
+ }
+ }
+#endif
+ }
+ pthread_exit(NULL);
+}
+
+int main()
+{
+ int i = 0;
+ tsg_lua_handle lua[THREAD_NUM] = {0};
+ pthread_t thread[THREAD_NUM] = {0};
+ struct timespec time_start, time_end;
+ long time1 = 0, time2 = 0, time3 = 0, time4 = 0, time5 = 0;
+
+ content_len = strlen(content);
+
+ for (i = 0; i < THREAD_NUM; i++)
+ {
+ lua[i] = tsg_lua_vm_create();
+ if (lua[i] == NULL)
+ {
+ return -1;
+ }
+ }
+
+ /* tsg_lua_exec 运行luajit文本脚本 */
+ get_script_buffer("./multithread_test.lua");
+ clock_gettime(CLOCK_REALTIME, &time_start);
+ for (i = 0; i < THREAD_NUM; i++)
+ {
+ pthread_create(&thread[i], NULL, test_tsg_lua_exec, lua[i]);
+ }
+ for (i = 0; i < THREAD_NUM; i++)
+ {
+ pthread_join(thread[i], NULL);
+ }
+ clock_gettime(CLOCK_REALTIME, &time_end);
+ time1 = calc_time(time_start, time_end);
+ time1 /= 10000;
+ printf("text script buffer:%ld\n", time1);
+ sleep(1);
+
+ /* tsg_lua_exec 运行luajit 字节码脚本 */
+ get_script_buffer("./multithread_test.luajit");
+ clock_gettime(CLOCK_REALTIME, &time_start);
+ for (i = 0; i < THREAD_NUM; i++)
+ {
+ pthread_create(&thread[i], NULL, test_tsg_lua_exec, lua[i]);
+ }
+ for (i = 0; i < THREAD_NUM; i++)
+ {
+ pthread_join(thread[i], NULL);
+ }
+ clock_gettime(CLOCK_REALTIME, &time_end);
+ time2 = calc_time(time_start, time_end);
+ time2 /= 10000;
+ printf("bytecode script buffer:%ld\n", time2);
+ sleep(1);
+
+ /* tsg_cache_exec 运行lua文本脚本 */
+ get_script_buffer("./multithread_test.lua");
+ clock_gettime(CLOCK_REALTIME, &time_start);
+ for (i = 0; i < THREAD_NUM; i++)
+ {
+ pthread_create(&thread[i], NULL, test_tsg_cache_exec, lua[i]);
+ }
+ for (i = 0; i < THREAD_NUM; i++)
+ {
+ pthread_join(thread[i], NULL);
+ }
+ clock_gettime(CLOCK_REALTIME, &time_end);
+ time3 = calc_time(time_start, time_end);
+ time3 /= 10000;
+ printf("cache text script buffer:%ld\n", time3);
+ sleep(1);
+
+ /* tsg_lua_exec 运行lua文本脚本 */
+ get_script_buffer("./multithread_test.luajit");
+ clock_gettime(CLOCK_REALTIME, &time_start);
+ for (i = 0; i < THREAD_NUM; i++)
+ {
+ pthread_create(&thread[i], NULL, test_tsg_cache_exec, lua[i]);
+ }
+ for (i = 0; i < THREAD_NUM; i++)
+ {
+ pthread_join(thread[i], NULL);
+ }
+ clock_gettime(CLOCK_REALTIME, &time_end);
+ time4 = calc_time(time_start, time_end);
+ time4 /= 10000;
+ printf("cache bytecode script buffer:%ld\n", time4);
+ sleep(1);
+
+ clock_gettime(CLOCK_REALTIME, &time_start);
+ for (i = 0; i < THREAD_NUM; i++)
+ {
+ pthread_create(&thread[i], NULL, test_c_func, lua[i]);
+ }
+ for (i = 0; i < THREAD_NUM; i++)
+ {
+ pthread_join(thread[i], NULL);
+ }
+ clock_gettime(CLOCK_REALTIME, &time_end);
+ time5 = calc_time(time_start, time_end);
+ time5 /= 10000;
+ printf("C func:%ld\n", time5);
+
+ printf("text script buffer / C func:%lf%%\n", time1 * 100.00 / time5);
+ printf("bytecode script buffer / C func:%lf%%\n", time2 * 100.00 / time5);
+ printf("cache text script buffer / C func:%lf%%\n", time3 * 100.00 / time5);
+ printf("cache bytecode script buffer / C func:%lf%%\n", time4 * 100.00 / time5);
+ return 0;
+}
diff --git a/test/multithread_test.lua b/test/multithread_test.lua
new file mode 100644
index 0000000..7c4c2e8
--- /dev/null
+++ b/test/multithread_test.lua
@@ -0,0 +1,48 @@
+--[[
+--慢,原因是string.match不能转化成bytecode不能被jit
+local str = tsg.data
+if (string.match(str, "GGGGGGGGGG")) then
+ print("get GGGGGGGGGG")
+ return 1, true
+end
+return 1, false
+]]
+--[[
+local str = tsg.data
+local i, j
+local sub = "GGGGGGGGGG"
+local sub_len = string.len(sub)
+for i = 1, string.len(str) - sub_len do
+ if (string.byte(str, i) == "G") then
+ for j = 2, sub_len do
+ if string.byte(str, i + j - 1) ~= string.byte(sub, j) then
+ break;
+ end
+ if j == sub_len then
+ return 1, true
+ end
+ end
+ end
+end
+return 1, false
+]]
+
+--[[
+local str = tsg.data
+local i
+local sub = "GGGGGGGGGG"
+for i = 1, string.len(str) - 10 do
+ if string.byte(str, i) == 'G' then
+ if string.sub(str, i, i+9) == sub then
+ return 1, true
+ end
+ end
+end
+return 1, false
+]]
+local str = tsg.data
+if string.find(str, "GGGGGGGGG") then
+ return 1,true
+else
+ return 1, false
+end
diff --git a/test/multithread_test.luajit b/test/multithread_test.luajit
new file mode 100644
index 0000000..54fbb2e
--- /dev/null
+++ b/test/multithread_test.luajit
Binary files differ
diff --git a/test/singlethread_test b/test/singlethread_test
new file mode 100755
index 0000000..72a4bc9
--- /dev/null
+++ b/test/singlethread_test
Binary files differ
diff --git a/test/test.cpp b/test/test.cpp
new file mode 100644
index 0000000..dcbe900
--- /dev/null
+++ b/test/test.cpp
@@ -0,0 +1,316 @@
+/*************************************************************************
+ > File Name: main.c
+ > Author: pxz
+ > Created Time: Thu 09 Jul 2020 07:08:40 AM CST
+ ************************************************************************/
+extern "C"
+{
+ #include<stdio.h>
+ #include<string.h>
+ #include<time.h>
+ #include<unistd.h>
+ #include"tsg_lua_interface.h"
+}
+#define calc_time(__start, __end) \
+ (((__end).tv_sec * 1000 * 1000 * 1000 + (__end).tv_nsec) -\
+ ((__start).tv_sec * 1000 * 1000 * 1000 + (__start).tv_nsec))
+
+static size_t script_len;
+static char buffer[4096];
+const char *content = "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA\
+ TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT\
+ AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG\
+ GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG\
+ CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGT\
+ GGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCA\
+ GGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAA\
+ TTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAG\
+ AATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCA\
+ GCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGT\
+ AATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACC\
+ AGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTG\
+ GTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACC\
+ CGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAG\
+ AGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTT\
+ TGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACA\
+ TGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCT\
+ GTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGG\
+ TTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGT\
+ CTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGG\
+ CGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCG\
+ TCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTA\
+ CTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCG\
+ AGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCG\
+ GGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACC\
+ TGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAA\
+ TACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGA\
+ GGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACT\
+ GCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTC\
+ ACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGT\
+ TCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGC\
+ CGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCG\
+ CTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTG\
+ GGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCC\
+ CAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCT\
+ GGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGC\
+ GCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGA\
+ GGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGA\
+ GACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGA\
+ GGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTG\
+ AAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAAT\
+ CCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCA\
+ GTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAA\
+ AAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGC\
+ GGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCT\
+ ACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGG\
+ GAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATC\
+ GCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGC\
+ GGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG\
+ TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAA\
+ AAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAG\
+ GAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACT\
+ CCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCC\
+ TGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAG\
+ ACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGC\
+ GTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGA\
+ ACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGA\
+ CAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCA\
+ CTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCA\
+ ACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCG\
+ CCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGG\
+ AGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTC\
+ CGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCG\
+ AGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACC\
+ CCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAG\
+ CTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAG\
+ CCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGG\
+ CCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATC\
+ ACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAA\
+ AAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGC\
+ TGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCC\
+ ACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGG\
+ CTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGG\
+ AGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATT\
+ AGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA\
+ TCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGC\
+ CTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAA\
+ TCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAG\
+ CCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGT\
+ GGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCG\
+ GGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAG\
+ CGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTG\
+ GGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATG\
+ GTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGT\
+ AATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTT\
+ GCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCT\
+ CAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCG\
+ GGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTC\
+ TCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACT\
+ CGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAG\
+ ATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGG\
+ CGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTG\
+ AGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATA\
+ CAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGG\
+ CAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGC\
+ ACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCAC\
+ GCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTC\
+ GAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCG\
+ GGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCT\
+ TGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGG\
+ CGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCA\
+ GCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGG\
+ CCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGC\
+ GCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGG\
+ CGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGA\
+ CTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGG\
+ CCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAA\
+ ACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCC\
+ CAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGT\
+ GAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAA\
+ AGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGG\
+ ATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTAC\
+ TAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGA\
+ GGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGC\
+ GCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGG\
+ TGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTC\
+ AGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAA\
+ ATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGA\
+ GAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC\
+ AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTG\
+ TAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGAC\
+ CAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGT\
+ GGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAAC\
+ CCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACA\
+ GAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACT\
+ TTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAAC\
+ ATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCC\
+ TGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAG\
+ GTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCG\
+ TCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAG\
+ GCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCC\
+ GTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCT\
+ ACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCC\
+ GAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCC\
+ GGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCAC\
+ CTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAA\
+ ATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTG\
+ AGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCAC\
+ TGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCT\
+ CACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAG\
+ TTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAG\
+ CCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATC\
+ GCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCT\
+ GGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATC\
+ CCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCC\
+ TGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGG\
+ CGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG\
+ AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCG\
+ AGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGG\
+ AGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGT\
+ GAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAA\
+ TCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGC\
+ AGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCA\
+ AAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGG\
+ CGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTC\
+ TACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCG\
+ GGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGAT\
+ CGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCG\
+ CGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAG\
+ GTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACA\
+ AAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCA\
+ GGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCAC\
+ TCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGC\
+ CTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGA\
+ GACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG\
+ CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTG\
+ AACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCG\
+ ACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGC\
+ ACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCC\
+ AACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGC\
+ GCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA";
+size_t content_len;
+static char *get_script_buffer(const char *script)
+{
+ FILE *fp = fopen(script, "r");
+ if (fp)
+ {
+ int num = fread(buffer, 1, content_len, fp);
+ if (num != 0)
+ {
+ buffer[num] = 0;
+ script_len = num;
+ return buffer;
+ }
+ }
+ return NULL;
+}
+
+int main()
+{
+ struct timespec time_start, time_end;
+ int i = 0, j = 0;
+ long time1 = 0, time2 = 0, time3 = 0, time4 = 0, time5 = 0;
+ char out[255];
+ size_t out_len = 0;
+ size_t out_type = 0;
+ const char *bytecode_script_buffer;
+ int script_id;
+ /* 初始化1个虚拟机 */
+ tsg_lua_handle L = tsg_lua_vm_create();
+ content_len = strlen(content);
+#if 0
+ /* lua 运行字符串脚本 */
+ const char *text_script_buffer = get_script_buffer("./multithread_test.lua");
+ memset(out, 0, sizeof(out));
+ clock_gettime(CLOCK_REALTIME, &time_start);
+ for (i = 0; i < 10000; i++)
+ {
+ tsg_lua_exec(L, text_script_buffer, script_len - 1, content, content_len, out, &out_len, &out_type);
+ }
+ clock_gettime(CLOCK_REALTIME, &time_end);
+ time1 = calc_time(time_start, time_end);
+ time1 /= 10000;
+ printf("text script buffer:%ld\n", time1);
+ sleep(1);
+ /* lua 运行字符串字节码脚本 */
+ const char *bytecode_script_buffer = get_script_buffer("./multithread_test.luajit");
+ memset(out, 0, sizeof(out));
+ clock_gettime(CLOCK_REALTIME, &time_start);
+ for (i = 0; i < 10000; i++)
+ {
+ tsg_lua_exec(L, bytecode_script_buffer, script_len, content, content_len, out, &out_len, &out_type);
+ }
+ clock_gettime(CLOCK_REALTIME, &time_end);
+ time2 = calc_time(time_start, time_end);
+ time2 /= 10000;
+ printf("bytecode script buffer:%ld\n", time2);
+ sleep(1);
+
+ /* lua 缓存字符串脚本运行 */
+ text_script_buffer = get_script_buffer("./multithread_test.lua");
+ memset(out, 0, sizeof(out));
+ clock_gettime(CLOCK_REALTIME, &time_start);
+ int script_id = tsg_lua_cache_script(L, text_script_buffer, script_len - 1);
+ for (i = 0; i < 10000; i++)
+ {
+ tsg_cache_exec(L, script_id, content, content_len, out, &out_len, &out_type);
+ }
+ clock_gettime(CLOCK_REALTIME, &time_end);
+ time3 = calc_time(time_start, time_end);
+ time3 /= 10000;
+ printf("cache text script buffer:%ld\n", time3);
+ sleep(1);
+#endif
+ /* lua 缓存字符串字节码脚本运行 */
+ bytecode_script_buffer = get_script_buffer("./test.luajit");
+ memset(out, 0, sizeof(out));
+ clock_gettime(CLOCK_REALTIME, &time_start);
+ script_id = tsg_lua_cache_script(L, bytecode_script_buffer, script_len);
+ for (i = 0; i < 10000; i++)
+ {
+ tsg_cache_exec(L, script_id, content, content_len, out, &out_len, &out_type);
+ }
+ clock_gettime(CLOCK_REALTIME, &time_end);
+ time4 = calc_time(time_start, time_end);
+ time4 /= 10000;
+ printf("cache bytecode script buffer:%ld\n", time4);
+ /* 关闭lua */
+ tsg_destory_lua(L);
+#if 0
+ sleep(1);
+ /* C 处理 */
+ clock_gettime(CLOCK_REALTIME, &time_start);
+ for (i = 0; i < 10000; i++)
+ {
+#if 0
+ for (j = 0; j < (int)content_len; j++)
+ {
+ if (content[j] == 0)
+ {
+ printf("content[%d] == 0\n", j);
+ break;
+ }
+ }
+#else
+ if (strstr(content, "GGGGGGGGGG"))
+ {
+ printf("get GGGGGGGGGG\n");
+ return -1;
+ }
+#endif
+ }
+ clock_gettime(CLOCK_REALTIME, &time_end);
+ time5 = calc_time(time_start, time_end);
+ time5 /= 10000;
+ printf("time C:%ld\n", time5);
+
+ printf("text script buffer / C:%lf%%\n", time1 * 100.00 / time5);
+ printf("bytecode script buffer / C:%lf%%\n", time2 * 100.00 / time5);
+ printf("bytecode script buffer / test script buffer:%lf%%\n", time2 * 100.00 / time1);
+ printf("\ncache text script buffer / C:%lf%%\n", time3 * 100.00 / time5);
+ printf("cache bytecode script buffer / C:%lf%%\n", time4 * 100.00 / time5);
+ printf("cache bytecode script buffer / cache test script buffer:%lf%%\n", time4 * 100.00 / time3);
+#endif
+ return 0;
+}
diff --git a/test/test.lua b/test/test.lua
new file mode 100644
index 0000000..a5d4a54
--- /dev/null
+++ b/test/test.lua
@@ -0,0 +1,16 @@
+--[[
+local str = tsg.data
+for i = 0, string.len(str) do
+ if (string.byte(str, i) == 0) then
+ print("find 0\n")
+ end
+end
+return 1, true
+]]
+
+local str = tsg.data
+if string.find(str, "weixinnum") then
+ return 1, false
+else
+ return 1, true
+end
diff --git a/test/test.luajit b/test/test.luajit
new file mode 100644
index 0000000..aa345b8
--- /dev/null
+++ b/test/test.luajit
Binary files differ