覆盖 require 后调用 lua_getfield() 时崩溃

2024-04-03

这个问题与 @Henri_Menke 在这个问题中的回答相关:如何在 C++ 中获取预加载模块名称 https://stackoverflow.com/questions/51510308/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功能。对于那个很抱歉。

#include <iostream>
#include "lua.hpp"

int 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"
                         "local val = table.pack(require_original(name, ...))\n"
                         "current_module = nil\n"
                         "return table.unpack(val,1,val.n)\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);
}
$ clang++ -Wall -Wextra -Wpedantic -I /usr/include/lua5.2 test.cpp -llua5.2
test.cpp:28:9: warning: unused variable 'top' [-Wunused-variable]
    int top = lua_gettop(L);
        ^
1 warning generated.
$ ./a.out 
While loading:  test
Updated!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

覆盖 require 后调用 lua_getfield() 时崩溃 的相关文章

  • Visual Studios 2015 中的“恢复 NuGet 包”没有执行任何操作

    我将解决方案从 SVN 拉入 Visual Studios 2015 代码中的一些 使用 引用出现错误 因此我尝试在右键单击 解决方案 中的解决方案时运行 恢复 NuGet 包 选项探索者 这没有任何作用 我必须手动进入 nuget 管理器
  • 如何在 ASP.NET MVC 中将 XML 文件发送到客户端

    在 ASP NET MVC 中 我有一个数据库表 我想在某个视图页面上有一个按钮 如果某个用户单击该按钮 我的应用程序将生成包含数据库中所有行的 XML 文件 然后 应将包含 XML 的文件发送到客户端 以便用户看到下载弹出窗口 同样 我希
  • 如何通过覆盖 MSBuild 目标来防止外语资源生成?

    我正在致力于减少大型 C ASP NET 解决方案的编译时间 我们的解决方案使用通常的 resx 文件方法翻译成大约十几种外语 这些资源文件的解析和编译极大地减慢了我们的编译时间 并且是日常的挫败感 我知道可以创建自定义资源提供程序并摆脱
  • Qt/c++ 随机字符串生成[重复]

    这个问题在这里已经有答案了 我正在创建一个应用程序 需要生成多个随机字符串 几乎就像一个由一定长度的 ASCII 字符组成的唯一 ID 这些字符混合有大写 小写 数字字符 有没有 Qt 库可以实现这一点 如果没有 在纯 C 中生成多个随机字
  • 头文件中实现的函数的静态与内联

    我想到的方式inline在 C 中用于链接 作用域 我把它放在同一个篮子里extern and static对于全局对象 通常 对于在头文件中实现的函数 我的首选解决方案是将其设为静态 In Foo h static void foo Do
  • C# 中类似图的实现

    所以我有一个对象 我们称之为 Head 它有一个对象列表 C C1 C2 C3 T T1 T2 和 M M1 M2 并且所有这些都是相互关联的 例如 Head gt C1 C2 C3 T1 T2 M1 M2 T1 gt C1 C2 T2 g
  • 如何通过 libwebsocket 发送异步数据?

    我正在将 Warmcat 的 libwebsocket C 库用于小型 Websocket 服务器 我已经启动并运行了这些示例 并且可以发送数据以响应从 websocket 接收数据 例如回显发送的反向字节 但是 我无法弄清楚如何在不使用
  • 选择initializer_list迭代器定义

    Why std initializer list
  • C# 中的抽象类和接口类有什么不同?

    C 中的抽象类和接口类有什么不同 An 接口不是类 它只是一个contract定义了public一个类的成员must实施 抽象类只是一个类 您从中可以cannot创建一个实例 通常您会使用它来定义一个基类 该基类定义了一些virtual方法
  • 为什么 BinaryFormatter 可以序列化 Action<> 但 Json.net 不能

    尝试序列化 反序列化 Action 尝试我的 1天真 JsonConvert SerializeObject myAction JsonConvert Deserialize
  • 列表到优先队列

    我有一个 C 大学编程项目 分为两个部分 在开始第二部分时应该使用priority queues hash tables and BST s 我 至少 在优先级队列方面遇到了麻烦 因为它迫使我自己重做第一部分中已经实现的许多代码 该项目是关
  • 查找方法不适用于 EF6.1 模拟

    我已经使用这些 msdn 指南设置了模拟 使用模拟框架进行测试 EF6 及以上 http msdn microsoft com en us data dn314429 var bsAc db BusAcnts FirstOrDefault
  • linq where 子句和 count 导致 null 异常

    除非 p School SchoolName 结果为 null 否则下面的代码将起作用 在这种情况下 它会导致 NullReferenceException if ExistingUsers Where p gt p StudentID i
  • 使用 dateTimePicker 在 DataGridView 中编辑日期

    我有一个DateTime我的 WinForms 中的专栏DataGridView 目前只能通过手动输入日期来编辑该字段 例如 2010 09 02 需要什么才能拥有一个DateTimePicker 或同等 用作编辑器 DataGridVie
  • 在 C# .NET 中对非 ASCII 字符进行编码

    我想向我的应用程序发送的电子邮件添加自定义标头 标头名称只能包含 ASCII 字符 但对于值和用户可能会输入 UTF 8 字符 我必须对它们进行 Base64 编码 此外 我还必须将它们解码回 UTF 8 以便在 UI 中向用户显示它们 最
  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • 展开 std::reference_wrapper 的成本

    Given include
  • 为什么 C++ 标准没有将 sizeof(bool) 定义为 1?

    Size of char signed char and unsigned char由 C 标准本身定义为 1 个字节 我想知道为什么它没有定义sizeof bool also C 03 标准 5 3 3 1 说 sizeof char s
  • 强制函数调用的顺序?

    假设我有一个抽象基类 并且我想要一个必须由派生类实现的纯虚方法 但我想确保派生方法以特定顺序调用函数 我可以做什么来强制执行它 I E base class virtual void doABC 0 virtual void A 0 vir
  • 创建进程默认浏览器

    我目前正在使用 ShellExecute 打开 在用户浏览器中打开 URL 但在 Win7 和 Vista 中遇到了一些麻烦 因为该程序作为服务运行提升 我想获取线程 id 因此 ShellExecute 无法获取线程 id 因此我开始使用

随机推荐

  • 由于 Windows 更新,Azure 云服务应用程序(Web 角色)偶尔会停机约 10 分钟?我该如何安排它们?

    它似乎每隔几个月左右就会发生一次 虽然它通常会在大约 10 分钟内自动恢复 但我仍然想了解如何更改 Windows 更新计划 因为它经常在工作时间发生 我们在各种 Azure 订阅中有多个 Web 应用程序 它们都以这种方式运行 一旦我们收
  • 并排 div

    如何并排放置两个 div 并在它们之间使用分离器 那就是我的意思 我假设 html 布局看起来像这样 div div div div div div div div or div div div div div div div div ht
  • 通过 HTTPS 以 JSON 格式发送密码是否安全?

    如果我通过 HTTPS 发送 JSON 格式的密码来执行身份验证 安全吗 有更好的方法吗 一般来说 将用户名和密码发送到服务器以执行身份验证的最佳方法是什么 一般来说 是的 这对于被动网络窃听者是安全的 这是人们在这种架构中担心的主要威胁
  • 预加载器继续加载并且在加载内容时不会消失

    好的 首先 这是我的代码 var loader document getElementById loader window addEventListener loader function loader style display none
  • 是否有与 C++ std::partial_sort 等效的 C# ?

    我正在尝试为可通过许多标准排序的数据集实现分页算法 不幸的是 虽然其中一些标准可以在数据库级别实现 但有些必须在应用程序级别完成 我们必须与另一个数据源集成 我们有分页 实际上是无限滚动 要求 并且正在寻找一种方法来最大程度地减少每次分页调
  • ASP.NET-Identity:如何限制用户名长度?

    我怎样才能限制长度UserName表中的字段AspNetUsers 这都不是 public class ApplicationUser IdentityUser Required MaxLength 15 public string Use
  • C# 7 基于元组的变量交换线程安全吗?

    在 C 7 的元组之前 交换两个变量的标准方法如下 var foo 5 var bar 10 var temp foo foo bar bar temp 但现在我们可以使用 foo bar bar foo 它在一条线上 而且更漂亮 但它是线
  • 绘图错误“您的浏览器不支持 WebGL”

    我正在尝试使用创建一些 3D 绘图plotly包裹 我使用的代码是他们的教程示例 library plotly volcano is a numeric matrix that ships with R fig lt plot ly z v
  • 使用 RC.EXE 或 BRCC32.EXE 构建 *.rc 文件时包含文件的行为有所不同

    我希望在我的 Delphi 项目的 RC 文件中使用点 作为资源条目 但是 Delphi 的 BRCC32 exe 不允许在资源命名中使用点 从Delphi 2010开始 我们可以在中指定 要使用的资源编译器 Project Option
  • 非常简单的 Firestore 事务失败

    我正在为一项超级简单的交易而苦苦挣扎 它总是失败并显示消息 事务所有重试均失败 但除此之外没有任何错误消息logcat 当我调试它时 我发现它被重试了几次 我真的不知道为什么 因为其他交易运行没有问题 我只想将一个文档从一个集合克隆到另一个
  • 使用 UIImagePickerController 时出现内存警告

    当我在 iPhone 上使用相机时收到内存警告 我也在使用 ARC 当您拍照并按相机视图控制器上的 使用照片 按钮时 我会收到内存警告 目的是一旦按下 使用照片 按钮 它就会更改 ImageView 的内容 我认为内存问题可能是由于捕获的图
  • 如何在 Sublime Text 中格式化 django 模板

    如何在 Sublime Text 中格式化 django 模板 我的模板包括 HTML django 模板语言与 variable and stuff javascript 有没有办法获得 PyCharm 提供的相同类型的格式 这个包应该可
  • 在 Blazor 中增加文本区域

    我需要一个随着行数增加而增长的文本区域 一旦行被删除 TextArea 就会再次缩小 在最好的情况下具有最大高度 它如何与 Javascript 一起工作我已经可以在这里阅读 根据内容长度调整文本区域大小 https stackoverfl
  • Spring中Bean创建异常

    我正在尝试自动装配在另一个项目中声明的类 但是在我收到运行时异常而不是编译时异常 如果我删除自动装配并使用新实例创建一个对象 它会完美运行 我收到以下错误 ErrorSEVERE StandardWrapper Throwable org
  • 如何通过Java程序调节扬声器音量?

    我运行的是 Win Vista 在窗口右下角的时钟旁边有一个扬声器图标 我可以单击它并调整音量 我想知道我的 Java 程序中是否有办法自动执行此操作 例如 当我的Java程序启动时 它将音量调至80 当程序退出时 它将音量调回原来的水平
  • Bouncy castle 中使用 SHA256 的 ECDSA 抛出无此类算法异常

    我正在尝试使用生成签名ECDSA with SHA256 in Bouncy Castle如下 我在开头添加了提供者 我已经构建了 ECPrivatekey Signature s oSignature Signature getInsta
  • 仅当存在查询字符串时才适用于图像文件请求的 RewriteRule

    由于我有限的正则表达式和 mod rewrite 能力 我正在尝试重写某些图像请求 以便我可以使用 php 脚本更改输出 这是我所拥有的 RewriteRule public uploads A Za z0 9 JPEG JPG GIF P
  • 检查是否使用 JQuery 设置了 URL 变量

    我想知道是否有一个 jQuery 函数可以检查 URL 中的变量是否已设置 类似于 PHP 中的 isset 函数 Thanks jQuery 没有获取 URL 参数的本机函数 但你可以编写自己的插件 extend getUrlVars f
  • Python 中方括号和括号括起来的列表有什么区别?

    gt gt gt x 1 2 gt gt gt x 1 2 gt gt gt x 1 2 gt gt gt x 1 2 它们都有效吗 是否因某种原因而受到青睐 方括号是lists http docs python org tutorial
  • 覆盖 require 后调用 lua_getfield() 时崩溃

    这个问题与 Henri Menke 在这个问题中的回答相关 如何在 C 中获取预加载模块名称 https stackoverflow com questions 51510308 how to get preloaded module na