Commit 3c43c4ff authored by tqcq's avatar tqcq
Browse files

feat add lua

parent 17619b44
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
cmake_minimum_required(VERSION 3.10)
project(
  minilua
  VERSION 5.4.6
  LANGUAGES C CXX)
add_library(minilua STATIC src/minilua.c)
target_include_directories(minilua PUBLIC src)
+2 −0
Original line number Diff line number Diff line
#define LUA_IMPL
#include "minilua.h"
+29240 −0

File added.

Preview size limit exceeded, changes collapsed.

+13 −13
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ target_include_directories(benchmark_main PUBLIC src/)

add_library(sled STATIC "")

add_subdirectory(3party/minilua EXCLUDE_FROM_ALL)
add_subdirectory(3party/gperftools EXCLUDE_FROM_ALL)
add_subdirectory(3party/asyncplusplus EXCLUDE_FROM_ALL)
# add_subdirectory(3party/cppuprofile EXCLUDE_FROM_ALL)
@@ -88,17 +89,16 @@ target_sources(
          src/sled/uri.cc)
# set(BUILD_RTTR_DYNAMIC OFF) set(BUILD_UNIT_TESTS OFF)
# set(BUILD_WITH_STATIC_RUNTIME_LIBS ON) set(BUILD_WITH_DOCUMENTATION OFF)
# add_subdirectory(3party/rttr EXCLUDE_FROM_ALL)
include(CheckCCompilerFlag)
check_c_compiler_flag("-Wl,--whole-archive" SUPPORT_COMPILE_WHOLE_ARCHIVE)
if(SUPPORT_COMPILE_WHOLE_ARCHIVE)
  set(WHOLE_ARCHIVE_WRAPPER_START "-Wl,--whole-archive")
  set(WHOLE_ARCHIVE_WRAPPER_END "-Wl,--no-whole-archive")
endif()
# add_subdirectory(3party/rttr EXCLUDE_FROM_ALL) include(CheckCCompilerFlag)
# check_c_compiler_flag("-Wl,--whole-archive" SUPPORT_COMPILE_WHOLE_ARCHIVE)
# if(SUPPORT_COMPILE_WHOLE_ARCHIVE) set(WHOLE_ARCHIVE_WRAPPER_START
# "-Wl,--whole-archive") set(WHOLE_ARCHIVE_WRAPPER_END "-Wl,--no-whole-archive")
# endif()

target_link_libraries(
  sled
  PUBLIC dl rpc_core fmt marl Async++
  PUBLIC rpc_core fmt marl Async++ minilua
  PRIVATE dl 
  # protobuf::libprotobuf ${WHOLE_ARCHIVE_WRAPPER_START}
  # tcmalloc_and_profiler_static
  # ${WHOLE_ARCHIVE_WRAPPER_END}
@@ -148,7 +148,7 @@ function(sled_add_test)
                                                     sled/testing/test.h)
  endif()
  target_include_directories(${SLED_TEST_NAME} PRIVATE ${SLED_TEST_INC_DIRS})
  target_link_libraries(${SLED_TEST_NAME} PRIVATE ${SLED_TEST_LIBS})
  target_link_libraries(${SLED_TEST_NAME} PRIVATE ${SLED_TEST_LIBS} sled)
  add_test(NAME ${SLED_TEST_NAME} COMMAND ${SLED_TEST_NAME})
endfunction()

@@ -178,11 +178,11 @@ if(SLED_BUILD_TESTS)
    src/sled/rx_test.cc
    src/sled/uri_test.cc
    LIBS
    sled
    test_main)

  sled_add_test(NAME sled_symbolize_test SRCS
                src/sled/debugging/symbolize_test.cc LIBS sled)
                src/sled/debugging/symbolize_test.cc)
    sled_add_test(NAME sled_lua_test SRCS tests/lua_test.cc LIBS test_main)
endif(SLED_BUILD_TESTS)

if(SLED_BUILD_FUZZ)

tests/lua_test.cc

0 → 100644
+73 −0
Original line number Diff line number Diff line
#include <minilua.h>
#include <sled/random.h>

TEST_SUITE("lua")
{
    TEST_CASE("Base Test")
    {
        lua_State *state = luaL_newstate();
        CHECK(state != nullptr);
        luaL_openlibs(state);
        REQUIRE_EQ(lua_gettop(state), 0);

        SUBCASE("add")
        {
            REQUIRE_EQ(LUA_OK, luaL_loadstring(state, "function add(a, b) return a+b end"));
            // load script
            REQUIRE_EQ(lua_pcall(state, 0, 0, 0), LUA_OK);
            // push function

            sled::Random rand(-1);
            for (int i = 0; i < 100; i++) {
                int a = rand.Rand(0, 100);
                int b = rand.Rand(0, 100);

                CHECK_EQ(LUA_TFUNCTION, lua_getglobal(state, "add"));
                CHECK(lua_isfunction(state, -1));

                REQUIRE_EQ(lua_gettop(state), 1);
                lua_pushnumber(state, a);
                lua_pushnumber(state, b);
                CHECK_EQ(lua_gettop(state), 3);

                CHECK_MESSAGE(lua_pcall(state, 2, 1, 0) == LUA_OK, "call add(a,b) error: ", lua_tostring(state, -1));
                CHECK(lua_isnumber(state, -1));
                CHECK_EQ(lua_tonumber(state, -1), a + b);
                lua_pop(state, 1);
                CHECK_EQ(lua_gettop(state), 0);
            }
        }

        SUBCASE("dump all function")
        {
            const char *dump_func
                = "    local seen={}\n"
                  "\n"
                  "    function dump(t,i)\n"
                  "        seen[t]=true\n"
                  "        local s={}\n"
                  "        local n=0\n"
                  "        for k in pairs(t) do\n"
                  "            n=n+1\n"
                  "            s[n]=k\n"
                  "        end\n"
                  "        table.sort(s)\n"
                  "        for k,v in ipairs(s) do\n"
                  "            -- print(i,v)\n"
                  "            v=t[v]\n"
                  "            if type(v)==\"table\" and not seen[v] then\n"
                  "                dump(v,i..\"\\t\")\n"
                  "            end\n"
                  "        end\n"
                  "    end\n"
                  "\n"
                  "dump(_G,\"\")";

            REQUIRE_EQ(LUA_OK, luaL_loadstring(state, dump_func));
            CHECK_EQ(lua_gettop(state), 1);
            CHECK_EQ(LUA_TFUNCTION, lua_type(state, -1));
            REQUIRE_EQ(LUA_OK, lua_pcall(state, 0, 0, 0));
        }
        lua_close(state);
    }
}