Lua,我可以禁用 C++ 中的部分语言吗?

Lua, can I disable parts of the language from C++?

假设我在 C++ 应用程序中嵌入了 Lua。这个问题听起来可能很奇怪,但我很感兴趣,是否有 标准 方法来禁用 C++ 端的 Lua 功能?

例如,除了一些已定义的变量外,我想禁用新变量的创建,如下所示:

local time = 10
local size = 20
function test()
  return time * size
end

如果我定义 timesizetest 函数以外的任何其他函数,我想让 Lua VM 失败。这可能不是破解 VM 本身吗?

或者例如我想禁用循环(forwhile 语句)。

一种选择是获取 Lua source code 并删除不需要的部分。它并不像听起来那么疯狂:代码非常可读。

不,没有任何用于禁用语言核心功能的标志。而且不可能以任何合理的方式为 "only allow X variables" 设置编译时标志。

修改 lua 以删除 forwhile 可能相当简单,但将其修改为不允许创建变量可能不会(我认为可能不会)非常简单简单。

我认为 metalua 这样的东西实际上会使这类事情变得更容易。

限制可以创建或访问的 global 变量的名称很容易:只需将脚本加载到具有 __index 和 [= 的适当元方法的环境中即可11=].

限制 local 变量的名称需要一些深入的黑客攻击,可能不值得,因为它们不会影响主机程序。

限制关键字不能立即完成,但可以通过一些简单的 hack 来完成:

要删除一些关键字,只需在llex.c中的luaX_tokens中的相关字符串中添加一个space即可。这些关键字将可用于变量名,相应的语法结构将不可访问并会引发错误。例如,要删除循环,请禁用 forwhilerepeat。你可以离开 inuntil,但他们不会做任何事情。如果您想动态执行此操作,请参阅 this lua-l message