【发布时间】:2019-01-02 09:06:03
【问题描述】:
这个问题与@Henri_Menke 对此问题的回答有关:How to get preloaded module name in C++
我正在尝试用我自己的版本覆盖 require 函数,以便我可以在 Lua 脚本中获取预加载的模块名称。
这是我的代码:
#include "lua.hpp"
void main()
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
lua_settop(L, 0);
luaL_dostring(L, "local require_original = require\n"
"function require(name, ...)\n"
"current_module = name\n"
"require_original(name, ...)\n"
"current_module = nil\n"
"end\n"); //if I comment out this chunk, it works fine
luaL_dostring(L, "package.preload['test'] = function ()\n"
"local test = {}\n"
"print('While loading:', current_module)\n"
"function test.update() print('Updated!') end\n"
"return test\n"
"end\n");
lua_getglobal(L, "require");
lua_pushstring(L, "test");
if (lua_pcall(L, 1, LUA_MULTRET, 0))
{
std::cout << "Error: " << lua_tostring(L, -1) << std::endl;
lua_pop(L, 1);
}
int top = lua_gettop(L);
lua_getfield(L, -1, "update"); //crashes here
if (lua_isfunction(L, -1))
{
lua_pushnil(L);
if (lua_pcall(L, 1, LUA_MULTRET, 0))
{
std::cout << "Error: " << lua_tostring(L, -1) << std::endl;
lua_pop(L, 1);
}
}
lua_close(L);
}
但是,调用lua_getfield(L, -1, "update"); 时它会崩溃。
当我注释掉 Lua 脚本的第一块时,它不再崩溃(第一个 luaL_dostring)。
如果我使用自己的require 版本,我不明白为什么它会崩溃。
我该如何解决这个问题?
【问题讨论】:
-
你自定义的
require函数需要返回模块。