<p>調整可能なコンテナでdisplay()を呼び出すマッドレットフリーズ</p>

作成日 2021年01月10日  ·  13コメント  ·  ソース: Mudlet/Mudlet

問題の簡単な要約

間違ったコマンドを入力した後、マッドレットが数秒フリーズします

問題を再現する手順

不和のユーザーチャドは説明します:

  1. したがって、testContainerと呼ばれる調整可能なコンテナを作成する場合
    testContainer = Adjustable.Container:new({name = "ARS main window"})
  2. cmdプロンプトでlua testContainerします
  3. それは泥だらけを凍らせて、それから私に記憶エラーを与えます

エラー出力

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

マドレットのバージョン、オペレーティングシステム、解決/実装方法のアイデアなどの追加情報:

それは私のたわごとのラップトップだけではなく、1つのプロファイルだけでもありません。
それは私のラップトップとPCにあります(16GB RAM)
新しいプロファイル、古いプロファイル
マッドレット4.10.1

bug high lua only

全てのコメント13件

その振る舞いは、どういうわけかLuaコードで起こっている無限の再帰と一致しているように聞こえます...

動作が悪いため、ラベルを高くすると、Mudletの方がうまくいくと予想されます。

これを月のみの問題である可能性が高いとマークするのは公正でしょうか?

その振る舞いは、どういうわけか_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()その関数を自動的に呼び出させることができます。

たぶん、これらの無限ループに二度と遭遇しないようにディスプレイを助けることができますか?
たとえば、すでに表示されているすべてのテーブルのリストを保持し、1つの完全な2番目のバージョンを再度表示しないようにします。

少し掘り下げた後、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をテストしました<cycle>ではなくIDを取得するという違いがあります

また、Geyser Wikiの2番目のネスト可能なラベルの例(「mainlabel」が付いているもの)を使用して同様の問題を見つけましたhttps://wiki.mudlet.org/index.php?title=Manual:Geyser#Demo-> 「その部分にカーソルを合わせて」からlua display(Geyser)を使用すると、スタックオーバーフローエラーが発生します(検査を使用している場合は発生しません)

たぶん、prettywriteからinspectに切り替えることは考えるべきことです。

どちらか一方に固執する特別な理由はありません。もう一方の方が優れている場合は、それを選びましょう。 2つをどのように比較しますか、前後に投稿できますか?

一貫したキーの順序に関しては、ペアの使用をペアに変更するだけで、すべてを処理する必要があります。 リンクされたコードスニペットが行うのは基本的にこれだけです。どこでもペアとして使用できるように抽象化しただけです。

どちらか一方に固執する特別な理由はありません。もう一方の方が優れている場合は、それを選びましょう。 2つをどのように比較しますか、前後に投稿できますか?

それはほとんど同じことをしていますが、それが「より良い」かどうかはわかりませんが、少なくとも間欠泉ではクラッシュしません(私の意見ではそれがより良くなります);)
PRを開きます

このページは役に立ちましたか?
0 / 5 - 0 評価