<p>Mudlet friert ein, indem display() auf einstellbarem Container aufgerufen wird</p>

Erstellt am 10. Jan. 2021  ·  13Kommentare  ·  Quelle: Mudlet/Mudlet

Kurze Zusammenfassung des Problems

Mudlet friert ein paar Sekunden nach Eingabe des falschen Befehls ein

Schritte zum Reproduzieren des Problems

Discord-Benutzerchad erklärt:

  1. Wenn ich also einen anpassbaren Container namens testContainer erstelle
    testContainer = Adjustable.Container:new({name = "ARS main window"})
  2. und ich mache lua testContainer in meiner cmd-Eingabeaufforderung
  3. es friert Mudlet ein und gibt mir dann einen Speicherfehler

Fehlerausgabe

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

Zusätzliche Informationen, wie Mudlet-Version, Betriebssystem und Ideen zur Lösung / Implementierung:

das ist nicht nur auf meinem beschissenen Laptop oder nur 1 Profil.
das ist auf meinem Laptop und PC (16 GB RAM)
auf neuen Profilen, alten Profilen
Mudlet 4.10.1

bug high lua only

Alle 13 Kommentare

Dieses Verhalten klingt im Einklang mit einer unendlichen Rekursion, die irgendwie im Lua- Code passiert ...

Wir erwarten, dass Mudlet hier besser abschneidet, weil es aufgrund seines schlechten Verhaltens als hoch eingestuft wird.

Wäre es fair, dies als wahrscheinlich nur ein Lua- Problem zu kennzeichnen?

Dieses Verhalten klingt im Einklang mit einer unendlichen Rekursion, die irgendwie im _Lua_-Code passiert ...

Ja das ist der Grund. Da Geyser immer eine Referenz des Elternteils im Container (myGeyserElement.container) vorhält.
Dies ist ein bekanntes Problem mit der Anzeige und ist auch der Grund dafür, dass der Schöpfer von Geyser die Funktion Geyser.display (vor 11 Jahren :eyes: ) entwickelt hat.
https://github.com/Mudlet/Mudlet/blob/d84f0b5b171370feb96db2f1950a3fd6dac1709f/src/mudlet-lua/lua/geyser/GeyserUtil.lua#L35
Anstatt Display zu verwenden, wäre eine Problemumgehung die Verwendung von Geyser.display.

Können wir ein Geyser-Objekt identifizieren, wenn eines angegeben ist? Könnte display() veranlassen, diese Funktion in diesem Fall automatisch aufzurufen.

Vielleicht können wir Display dabei helfen, nie wieder in diese Endlosschleifen zu geraten?
Führen Sie beispielsweise eine Liste aller bereits angezeigten Tabellen und zeigen Sie nicht erneut eine vollständige zweite Version einer Tabelle an.

Nachdem ich ein wenig gegraben hatte, fand ich heraus, dass Prettywrite eine Failsafe-Funktion gegen Endlosschleifen hat, die jedoch in einigen Fällen für Geyser fehlschlägt (ich bin mir nicht sicher, warum).
zum Beispiel:

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

Wird keine Endlosschleife verursachen.

Ich habe versucht, https://github.com/Mudlet/Mudlet/blob/4042ac7600db8196b219b3ae43a977045d591fdd/src/mudlet-lua/lua/DebugTools.lua#L185 auszukommentieren und das scheint zu funktionieren, aber ich bin mir nicht sicher, ob das andere verursachen könnte Probleme und warum es überhaupt da war.

Unabhängig davon sieht es so aus, als ob es eine Verbesserung für die konsistente Tastenreihenfolge gibt, die wir nutzen könnten: https://github.com/lunarmodules/Penlight/pull/293

Nachdem ich weiter gegraben habe, ist mir aufgefallen, dass das Problem hauptsächlich auftritt, wenn verschachtelte Labels verwendet werden (Rechtsklickmenü des anpassbaren Containers verwendet ein verschachteltes Label).
Ich persönlich denke immer noch, dass das Auskommentieren von https://github.com/Mudlet/Mudlet/blob/4042ac7600db8196b219b3ae43a977045d591fdd/src/mudlet-lua/lua/DebugTools.lua#L185 eine praktikable Lösung für das Problem ist.

Ich habe https://github.com/kikito/inspect.lua getestet, was mehr oder weniger das gleiche wie Prettywrite macht, und sie lösen dieses Problem auf die gleiche Weise (so wie es wäre, wenn der Teil der Tabellen[t] auskommentiert wäre), aber mit dem Unterschied, dass jede duplizierte Tabelle eine ID anstelle einer generischen <cycle> bekommt

Ich habe auch ein ähnliches Problem mit dem zweiten Beispiel für nestbare Labels aus dem Geyser-Wiki gefunden (das mit 'mainlabel') https://wiki.mudlet.org/index.php?title=Manual:Geyser#Demo -> fahre mit der Maus über das 'Hover dort Teil' und dann lua display(Geyser) verursacht immer noch einen Stackoverflow-Fehler (tritt nicht auf, wenn inspect verwendet wird)

Vielleicht ist der Wechsel von Prettywrite zu Inspect etwas, worüber Sie nachdenken sollten.

Wir haben keinen besonderen Grund, uns an das eine zu halten - wenn das andere besser ist, lass es uns versuchen. Wie lassen sich die beiden vergleichen, könntest du vorher/nachher posten?

bzgl. konsistenter Schlüsselreihenfolge, könnte einfach die Verwendung von Paaren in Spairs ändern und es sollte all das handhaben. Das ist im Grunde alles, was das verlinkte Code-Snippet tut, wir haben es nur abstrahiert, um es überall als Spairs zu verwenden.

Wir haben keinen besonderen Grund, uns an das eine zu halten - wenn das andere besser ist, lass es uns versuchen. Wie lassen sich die beiden vergleichen, könntest du vorher/nachher posten?

Es macht so ziemlich dasselbe, aber ich weiß nicht, ob es "besser" ist, zumindest stürzt es nicht in Geyser ab (was es meiner Meinung nach besser macht) ;)
Ich eröffne eine PR

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen