diff --git a/cmake/luajit.cmake b/cmake/luajit.cmake index 24f57eb6b230f891229b63010b7dbb7c9ab614c4..06ac79d6a16d1737c3e259c8eceb6bb0e7052d87 100644 --- a/cmake/luajit.cmake +++ b/cmake/luajit.cmake @@ -178,7 +178,7 @@ macro(luajit_build) add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/third_party/luajit/src/libluajit.a WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/third_party/luajit COMMAND $(MAKE) ${luajit_buildoptions} clean - COMMAND $(MAKE) -C src ${luajit_buildoptions} libluajit.a + COMMAND $(MAKE) -C src ${luajit_buildoptions} DEPENDS ${CMAKE_SOURCE_DIR}/CMakeCache.txt ) else() @@ -189,7 +189,7 @@ macro(luajit_build) WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/third_party/luajit COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/third_party/luajit ${PROJECT_BINARY_DIR}/third_party/luajit COMMAND $(MAKE) ${luajit_buildoptions} clean - COMMAND $(MAKE) -C src ${luajit_buildoptions} libluajit.a + COMMAND $(MAKE) -C src ${luajit_buildoptions} DEPENDS ${PROJECT_BINARY_DIR}/CMakeCache.txt ${PROJECT_BINARY_DIR}/third_party/luajit ) endif() diff --git a/cmake/utils.cmake b/cmake/utils.cmake index d7cbc4a58d515ddded4971d937bf1c5f6fa81dda..3fee04483fe82f72c02ff35b75b92dafc69f0da8 100644 --- a/cmake/utils.cmake +++ b/cmake/utils.cmake @@ -56,7 +56,7 @@ function(lua_source varname filename) COMMAND ${ECHO} '\;' >> ${tmpfile} COMMAND ${CMAKE_COMMAND} -E copy_if_different ${tmpfile} ${dstfile} COMMAND ${CMAKE_COMMAND} -E remove ${tmpfile} - DEPENDS ${srcfile} txt2c) + DEPENDS ${srcfile} txt2c libluajit) set(var ${${varname}}) set(${varname} ${var} ${dstfile} PARENT_SCOPE) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ed9aa3d8e3a7d9e22c4a8717032f92148c609e11..fc7bb5b64ad39c7b26c7383218e485815d8115b8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -31,6 +31,19 @@ lua_source(lua_sources lua/tap.lua) lua_source(lua_sources lua/fio.lua) lua_source(lua_sources lua/strict.lua) lua_source(lua_sources ../third_party/luafun/fun.lua) +# LuaJIT jit.* library +lua_source(lua_sources ../third_party/luajit/src/jit/bc.lua) +lua_source(lua_sources ../third_party/luajit/src/jit/bcsave.lua) +lua_source(lua_sources ../third_party/luajit/src/jit/dis_x86.lua) +lua_source(lua_sources ../third_party/luajit/src/jit/dis_x64.lua) +lua_source(lua_sources ../third_party/luajit/src/jit/dump.lua) +lua_source(lua_sources ../third_party/luajit/src/jit/vmdef.lua) +lua_source(lua_sources ../third_party/luajit/src/jit/v.lua) +if (EXISTS ../third_party/luajit/src/jit/p.lua) + # Profiler LuaJIT 2.1+ + lua_source(lua_sources ../third_party/luajit/src/jit/p.lua) + lua_source(lua_sources ../third_party/luajit/src/jit/zone.lua) +endif() add_custom_target(generate_lua_sources WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/src/box diff --git a/src/lua/init.cc b/src/lua/init.cc index 00f3a9885208a13775d4098ef3b74fc23adf8622..230bf235ab3fad9e2f5025462ab0110ae1ddaa50 100644 --- a/src/lua/init.cc +++ b/src/lua/init.cc @@ -88,7 +88,18 @@ extern char strict_lua[], help_lua[], help_en_US_lua[], tap_lua[], - fio_lua[]; + fio_lua[], + /* jit.* library */ + vmdef_lua[], + bc_lua[], + bcsave_lua[], + dis_x86_lua[], + dis_x64_lua[], + dump_lua[], + v_lua[]; +#if LUAJIT_VERSION_NUM >= 20100 /* LuaJIT 2.1+ */ +extern char p_lua[], zone_lua[]; +#endif /* LuaJIT 2.1+ */ static const char *lua_modules[] = { /* Make it first to affect load of all other modules */ @@ -109,6 +120,19 @@ static const char *lua_modules[] = { "tap", tap_lua, "help.en_US", help_en_US_lua, "help", help_lua, + /* jit.* library */ + "jit.vmdef", vmdef_lua, + "jit.bc", bc_lua, + "jit.bcsave", bcsave_lua, + "jit.dis_x86", dis_x86_lua, + "jit.dis_x64", dis_x64_lua, + "jit.dump", dump_lua, + "jit.v", v_lua, +#if LUAJIT_VERSION_NUM >= 20100 /* LuaJIT 2.1+ */ + /* Profiler */ + "jit.p", p_lua, + "jit.zone", zone_lua, +#endif /* LuaJIT 2.1+ */ NULL }; @@ -366,8 +390,13 @@ tarantool_lua_init(const char *tarantool_bin, int argc, char **argv) if (luaL_loadbuffer(L, modsrc, strlen(modsrc), modfile)) panic("Error loading Lua module %s...: %s", modname, lua_tostring(L, -1)); - lua_call(L, 0, 1); - lua_setfield(L, -3, modname); /* package.loaded.modname = t */ + lua_pushstring(L, modname); + lua_call(L, 1, 1); + if (!lua_isnil(L, -1)) { + lua_setfield(L, -3, modname); /* package.loaded.modname = t */ + } else { + lua_pop(L, 1); /* nil */ + } lua_pop(L, 1); /* chunkname */ } lua_pop(L, 1); /* _LOADED */