5.2 中的沙箱嵌入式 Lua / 从 lua.file 设置函数环境

2024-06-22

假设我至少有两个 lua 脚本文件。

测试1.lua 测试2.lua

两者都定义了一个 init 函数和其他具有相似名称的函数。

我如何使用 Lua 5.2 将使用 c++/c 的每个脚本文件加载到单独的环境中,以便相同的函数名称不会冲突 - 我找到了 5.1 的示例代码,它对我不起作用(因为 setenv 消失了,而 lua_setuservalue 没有似乎有效)

样品在这里从 .lua 的 using 句柄调用 lua 函数? https://stackoverflow.com/questions/3432231/calling-lua-functions-from-luas-using-handles?answertab=active#tab-top

基本上,如果我用 setuservalue 替换 setenv - 我会遇到访问冲突。


The 非官方 Lua 常见问题解答 http://www.luafaq.org/#T1.32有一个关于 Lua 沙箱的条目。 我的猜测是,您可以轻松地将逻辑移植到 C/C++ 代码中。

也可以看看lua-users wiki 上的 LuaFiveTo http://lua-users.org/wiki/LuaFiveTwo.

更正

这确实不像看起来那么微不足道。但最后要点很简单:加载你的块,推送 _ENV 表,使用lua_setupvalue(L,-2,1)。重要的是该表应该位于堆栈的顶部。

举一个小例子,使用 2 个默认为 _G 的环境通过元表读取内容:

#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>

int main(void){
        lua_State *L = luaL_newstate();
        char *file1 = "file1.lua";
        char *file2 = "file2.lua";

        luaL_openlibs(L);

        luaL_loadfile(L,file2); // S: 1
        luaL_loadfile(L,file1); // S: 2
        lua_newtable(L); // ENV for file 1: S: 321
        lua_newtable(L); // ENV for file 2: S: 4321

        //lets have each function have its metatable, where missed lookups are
        //instead looked up in the global table _G

        lua_newtable(L); // metatable S: 54321
        lua_getglobal(L,"_G"); // pushes _G, which will be the __index metatable entry S: 654321

        lua_setfield(L,-2,"__index"); // metatable on top S: 54321
        lua_pushvalue(L,-1); // copy the metatable S: 554321
        lua_setmetatable(L,-3); // set the last copy for env2 S: 54321
        lua_setmetatable(L,-3); // set the original for env1  S: 4321
        // here we end up having 2 tables on the stack for 2 environments
        lua_setupvalue(L,1,1); // first upvalue == _ENV so set it. S: 321
        lua_setupvalue(L,2,1); // set _ENV for file S: 21
        // Remaining on the stack: 2 chunks with env set.
        lua_pcall(L,0,LUA_MULTRET,0);
        lua_pcall(L,0,LUA_MULTRET,0);
        lua_close(L);
        return 0;
}

对于 2 个 Lua 文件:

-- file1.lua
function init()
        A="foo"
        print("Hello from file1")
        print(A)
end
init()

-- file2.lua
-- this shows that stuff defined in file1 will not polute the environment for file2
print("init function is",tostring(init))
function init()
        A="bar"
        print("Hello from file2")
        print(A)
end
init()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

5.2 中的沙箱嵌入式 Lua / 从 lua.file 设置函数环境 的相关文章

  • 如何在aerospike中获取ttl为-1的记录集?

    我在aerospike中有很多记录 我想获取ttl为 1的记录 请提供解决方案 只是为了澄清 设置TTL 为 1 https github com aerospike aerospike client go blob master docs
  • 什么时候适合使用Lua这样的嵌入式脚本语言

    我玩 魔兽世界 大约有两年了 我对用来编写插件的 Lua 很好奇 由于到目前为止我读到的有关 Lua 的内容都是 快 轻 和 这太棒了 所以我想知道如何以及何时使用它 您需要在系统中嵌入像 Lua 这样的脚本语言的典型情况是什么 当您需要最
  • Kong - 验证上游 ssl(ssl_proxy 打开)

    我已经成功为 API 安装了 kong 网关 该 API 通过上游负载平衡到多个目标 应用程序服务器 现在 我有一个我的应用程序服务器的自签名证书 kong 和目标之间的 ssl 握手应该失败 我推断 kong 不验证上游证书 经过一些研究
  • Lua userdata:无法同时进行数组访问和方法

    我遇到了这个人的问题 Lua userdata数组访问及方法 https stackoverflow com questions 26970316 lua userdata array access and methods 其中 当我设置用
  • Lua :: 如何编写加载多个CPU的简单程序?

    我还无法用 Lua 编写一个可以加载多个 CPU 的程序 自从Lua通过协程支持这个概念 http www lua org pil 9 4 html 我相信这是可以实现的 我失败的原因可能是以下之一 这在Lua中是不可能的 我写不出来 an
  • VB6 - Lua 集成

    我想知道是否有人有任何集成 Lua 和 VB6 的技巧 我正在运行一个小型在线角色扮演游戏 添加一些脚本会很棒 嗯 这是可行的 我曾经为 Lua 5 0 2 做过 但找不到文件 在您拥有的选项中 您可以 将 Lua 封装在公开 Lua AP
  • 如何使用 srlua 制作可执行的 Lua 脚本?

    我的主要目标是使我的 lua 文件成为可执行文件或使其成为咬代码 最好是两者皆有 我正在尝试 srlua 但在自述文件中它告诉我要做的事情 对于Windows 您需要首先创建srlua exe和glue exe 然后为每个 你想把Lua程序
  • 如何在 emacs lua-mode 中配置缩进?

    完整的 emacs 新手在这里 我在 Ubuntu 上使用 emacs 23 1 1emacs 入门套件 https github com technomancy emacs starter kit 我主要在 lua 模式下工作 安装了pa
  • 如何让我的 add 命令找到第一个变量和第二个变量的值,然后将它们加在一起?

    vars values function open file lex file end function lex file local data io open file r for char in data lines do Print
  • 在 Awesome-wm 中为特定应用程序设置窗口布局

    如何配置很棒 以便它可以启动两个窗口对齐的新应用程序 如下所示 xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx 其中 x 是 pidgin 中的对话窗口 是好友列表窗口 一般来说 我想指定右窗口的宽度
  • Lua中有状态迭代器和无状态迭代器的区别

    Lua中无状态和有状态迭代器有什么区别 请详细解释一下 什么时候需要使用无状态 什么时候需要使用另一种 我需要例子来理解这个概念 首先让我们就一个定义达成一致 在 Lua 中 迭代器是function 类似对象 每次调用时都会返回序列中的下
  • gsub 的转义字符串

    我读了一个文件 local logfile io open log txt r data logfile read a print data output n w r 1 2 n t x re S 是的 日志文件看起来很糟糕 因为它充满了各
  • 表长度运算符的性能

    卢阿有 运算符来计算用作数组的表的 长度 在诸如 C 之类的语言中 计算出某个内容的长度后 通常不会再次计算它 例如int len strlen string 这在 Lua 中有什么不同吗 其中一个的效率是否比另一个低 显然这可能不会显示显
  • 在 Lua/LuaFileSystem 中创建一个新文件

    我已经查看了 Lua 和 LuaFileSystem 文档 但尚未找到创建新文件的方法 我也在这里四处寻找 但目的相同 请注意 我正在寻找的解决方案必须与操作系统无关 以确保可移植性 但我很高兴针对不同的系统获得不同的答案 示例 将 Hel
  • Linq 是如何工作的(在幕后)?

    我正在考虑为 Lua 制作类似 Linq 的东西 并且我大致了解 Linq 的工作原理 但想知道是否有一篇好文章 或者是否有人可以解释 C 如何使 Linq 成为可能 注意 我的意思是在幕后 比如它如何生成代码绑定等等 而不是最终用户语法
  • lua-socket:unix 域套接字?

    我使用的是 lua socket 3 0rc1 3 Ubuntu Trusty 附带的 和 lua 5 1 我正在尝试监听 unix 域套接字 我能找到的唯一示例代码是this http lua users org lists lua l
  • 在 Lua 中更改元表会破坏冒号运算符

    在学习Lua的过程中 我借用了一些代码here http lua users org wiki StringIndexing使用字符串索引 正是这样 getmetatable index function str i return stri
  • 如何在 Lua-C API 5.2 中创建类对象?

    我正在使用 Lua 封装 C 函数 使用 Lua 5 2 的 Lua C API include
  • 5.2 中的沙箱嵌入式 Lua / 从 lua.file 设置函数环境

    假设我至少有两个 lua 脚本文件 测试1 lua 测试2 lua 两者都定义了一个 init 函数和其他具有相似名称的函数 我如何使用 Lua 5 2 将使用 c c 的每个脚本文件加载到单独的环境中 以便相同的函数名称不会冲突 我找到了
  • Lua userdata数组访问及方法

    我正在用 C 编写一个用户数据类型 以便在 Lua 中使用 它有一些数组类型的属性和各种方法 现在如果你是这种类型 我使用u set k v resp u get k 访问数据 例如u sort 作为方法 为此我设置了 index到包含这些

随机推荐

  • 如何触发预定的 Spring Batch 作业?

    我希望能够使用 REST 控制器启动我的作业 然后当作业启动时 它应该按计划运行 直到我再次使用 REST 停止它 这是我的控制器 RestController public class LauncherController Autowir
  • Jms 消息仅确认,直到消息确认为止

    如何确保消息确认仅删除在 jms 代理中调用确认的消息之前的消息 目前我有一个系统 它从 jms 队列中消费并部分处理它 稍后 一批这些消息将由不同的线程保存 我现在需要确认消息 但问题是我必须停止使用消息 否则确认先前收到的消息也将确认收
  • ActiveX,安装不起作用

    我想创建并部署一个 ActiveX 插件 非常小的东西 我只想显示一个消息框 我为它创建了一个库项目并将其编译为 DLL 当我通过命令行注册 dll 时 该插件可以工作 regasm 在一台机器上 所以我现在需要创建一个安装程序 将其放入
  • iOS 自动释放池块

    当我开始阅读苹果关于内存管理的文档时自动释放池块有件事让我思考 Any object sent an autorelease message inside the autorelease pool block is released at
  • PHP 使用 Fsockopen 发布数据

    我正在尝试使用 fsockopen 发布数据 然后返回结果 这是我当前的代码
  • 猫和印刷有什么区别?

    cat and print两者似乎都在 R 中提供了 打印 功能 x lt Hello world n cat x Hello world print x 1 Hello world n 我的印象是cat最类似于典型的 打印 功能 我什么时
  • 通过另一个函数访问一个函数的返回值

    总的来说 我对编程还很陌生 刚刚开始真正接触Python 我正在做一个猜数字项目 import random def main main function print Welcome to the number guesser game r
  • 创建一个控件似乎打破了 JFX8 上的透明阶段

    上面的程序应该创建一个带有一些文本的透明舞台 但舞台看起来不透明 public class Test extends Application Override public void start Stage primaryStage new
  • 如何查找数组中存储的字符串中的数字之和

    我已经弄清楚如何从单个字符串计算数字的值 作为示例 var sum 13 2 10 7 3 split reduce function x y return parseInt x parseInt y Value of 35 我有兴趣找到数
  • 不区分大小写的列表

    我需要一个不区分大小写的列表或集合类型 字符串 创建一个最简单的方法是什么 您可以指定要在字典的键上获得的比较类型 但我找不到列表的类似内容 假设您使用的是 NET 3 5 您可以使用 var strings new HashSet
  • 如何向 CRichEditCtrl 添加 Unicode 支持?

    我的应用程序曾经使用 MFC CEdit 控件 并且我们对宽字符 Unicode 字符串没有任何问题 切换到CRichEditCtrl后 似乎不再支持Unicode 汉字变成了 等等 我读过 CRichEditCtrl 在底层使用 Rich
  • 如何在 PHP 客户端和 C 守护程序服务器之间进行 IPC?

    感谢您查看这个问题 的背景我有几台机器可以在很短的时间内连续生成多个 最多 300 个 PHP 控制台脚本 这些脚本运行速度很快 不到一秒 然后退出 所有这些脚本都需要对大型文件进行只读访问trie http en wikipedia or
  • Django manage.py runserver 优雅重载

    我正在开发一个 Django 项目 它集成了网络摄像头和 OpenCV 对于网络摄像头访问 我使用以下代码 如果我使用的话 网络摄像头可以被释放Ctrl C结束正在运行的服务器 但如果服务器在代码更改后重新加载 则网络摄像头无法正确释放 因
  • 如何在 Laravel 5 中设置基本路径

    I moved Laravel 公共文件夹 to the 根文件夹 然后我搬家了Laravel to 它自己的文件夹 所以我可以在共享主机上使用 Laravel 它看起来像这样 2015 08 04 18 13
  • 显示 jQuery 验证摘要和单独的错误消息

    我在 ASP net MVC 中使用 jQuery 验证 除了控件之外 我想显示验证摘要以及单独的错误消息 我一次可以做其中一个 因此 了解如何同时显示两者将非常有帮助 我假设您正在寻找仅 JQuery 的解决方案 我不知道 ASP net
  • 如何在 Java 字符串中用 \u 替换 \\u

    我有一个格式的字符串 aaa u2022bbb u2014ccc 我想显示这两个特殊字符 但为了能够做到这一点 我必须首先将字符串转换为以下格式 aaa u2022bbb u2014ccc 我尝试编写这个 但它给出了编译错误 String
  • 如何跨函数将函数参数粘合到 dplyr 中的 .names?

    我正在尝试命名一个的输出across使用两者的函数 col 和函数参数之一 library tidyverse mean by lt function data by var prefix avg data gt group by by g
  • 为什么包含 const 数据成员的类不存在默认构造函数

    为什么编译器没有为包含常量数据成员的类添加默认构造函数 请参阅下面的代码 因为我已经声明了常量数据成员 a 并且在尝试为类 ClassA 创建对象时 它说没有可用的适当的默认构造函数 请帮忙 include stdafx h include
  • vagrant 与 laravel homestead 共享

    我遇到了让 vagrant share 与 laravel homestead vagrant box 结合使用的问题 我的 homestead yaml 文件如下所示 ip 192 168 10 10 memory 2048 cpus 1
  • 5.2 中的沙箱嵌入式 Lua / 从 lua.file 设置函数环境

    假设我至少有两个 lua 脚本文件 测试1 lua 测试2 lua 两者都定义了一个 init 函数和其他具有相似名称的函数 我如何使用 Lua 5 2 将使用 c c 的每个脚本文件加载到单独的环境中 以便相同的函数名称不会冲突 我找到了