<p>Mudlet 在可调容器上冻结调用 display()</p>

创建于 2021-01-10  ·  13评论  ·  资料来源: Mudlet/Mudlet

问题简要总结

输入错误命令后 Mudlet 会冻结几秒钟

重现问题的步骤

Discord 用户 chad 解释说:

  1. 所以如果我制作一个可调节的容器,称为 testContainer
    testContainer = Adjustable.Container:new({name = "ARS main window"})
  2. 我在我的 cmd 提示符下执行lua testContainer
  3. 它冻结了mudlet,然后给了我一个内存错误

错误输出

[ERROR:] Objekt:<run lua code> Funktion:<Alias4>
        <not enough memory>

额外信息,例如 Mudlet 版本、操作系统以及如何解决/实施的想法:

这不仅仅是在我的狗屎笔记本电脑上,或者只是 1 个配置文件。
这是在我的笔记本电脑和 PC 上(16gb 内存)
在新配置文件、旧配置文件上
Mudlet 4.10.1

bug high lua only

所有13条评论

这种行为听起来与Lua代码中发生的无限递归一致......

因为它的行为不佳而被标记为高,我们希望 Mudlet 在这里做得更好。

将此标记为可能是lua 唯一问题是否公平?

这种行为听起来与 _Lua_ 代码中发生的无限递归以某种方式一致......

是的,就是这个原因。 由于 Geyser 始终在容器 (myGeyserElement.container) 中保留父项的引用。
这是显示的一个已知问题,也是 Geyser 的创建者创建 Geyser.display 函数的原因(11 年前 :eyes: )。
https://github.com/Mudlet/Mudlet/blob/d84f0b5b171370feb96db2f1950a3fd6dac1709f/src/mudlet-lua/lua/geyser/GeyserUtil.lua#L35
因此,不使用 display 的解决方法是使用 Geyser.display。

如果给出一个间歇泉物体,我们可以识别它吗? 在这种情况下可以让display()自动调用该函数。

也许我们可以帮助 display 不再陷入这些无限循环?
例如,保留已显示的所有表的列表,并且不再显示一个完整的第二个版本。

经过一番挖掘,我发现prettywrite有一个针对无限循环的故障保护,但在某些情况下它对Geyser失败了(我不知道为什么)
例如:

test = {}
test[1] = test
display(test)

不会造成无限循环。

我试图注释掉https://github.com/Mudlet/Mudlet/blob/4042ac7600db8196b219b3ae43a977045d591fdd/src/mudlet-lua/lua/DebugTools.lua#L185这似乎有效,但我不确定这是否会导致问题以及为什么它首先存在。

这就是原因: https :

无关,看起来我们可以利用一致的键顺序有所改进: https :

进一步挖掘后,我注意到问题主要发生在使用嵌套标签时(可调整容器右键菜单使用嵌套标签)
我个人仍然认为评论https://github.com/Mudlet/Mudlet/blob/4042ac7600db8196b219b3ae43a977045d591fdd/src/mudlet-lua/lua/DebugTools.lua#L185是解决该问题的可行方法。

我测试了https://github.com/kikito/inspect.lua ,它或多或少与prettywrite 相同,它们以相同的方式解决这个问题(如果表[t] 部分被注释掉,那就是)但是不同之处在于每个重复的表都获得一个 id 而不是通用的<cycle>

我还使用 Geyser Wiki 中的第二个可嵌套标签示例(带有“mainlabel”的那个)https://wiki.mudlet.org/index.php?title=Manual:Geyser#Demo -> 将鼠标悬停在'Hover there part' 然后使用lua display(Geyser)仍然会导致计算器溢出错误(如果使用检查不会发生)

也许从prettywrite 切换到inspect 是需要考虑的事情。

我们没有特别的理由坚持一个——如果另一个更好,我们就去做吧。 两者比较如何,您可以在之前/之后发布吗?

关于一致的密钥顺序,可以将对的使用更改为对,它应该处理所有这些。 这基本上就是链接的代码片段所做的所有事情,我们只是将它抽象出来以便在任何地方作为 spairs 使用。

我们没有特别的理由坚持一个——如果另一个更好,我们就去做吧。 两者比较如何,您可以在之前/之后发布吗?

它几乎在做同样的事情,但我不知道它是否“更好”,至少它不会在 Geyser 中崩溃(这在我看来更好);)
我会开PR

此页面是否有帮助?
0 / 5 - 0 等级