<p>Tampilan panggilan beku Mudlet () pada wadah yang dapat disesuaikan</p>

Dibuat pada 10 Jan 2021  ·  13Komentar  ·  Sumber: Mudlet/Mudlet

Ringkasan singkat masalah

Mudlet membeku beberapa detik setelah mengetik perintah yang salah

Langkah-langkah untuk mereproduksi masalah

Chad pengguna Discord menjelaskan:

  1. jadi jika saya membuat wadah yang dapat disesuaikan, yang disebut testContainer
    testContainer = Adjustable.Container:new({name = "ARS main window"})
  2. dan saya melakukan lua testContainer di cmd Prompt
  3. itu membekukan lumpur dan kemudian memberi saya kesalahan memori

Keluaran kesalahan

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

Informasi tambahan, seperti versi Mudlet, sistem operasi, dan ide tentang cara memecahkan / menerapkan:

itu bukan hanya di laptop sial saya, atau hanya 1 profil.
itu di laptop dan pc saya (ram 16gb)
di profil baru, profil lama
Lumpur 4.10.1

bug high lua only

Semua 13 komentar

Perilaku itu terdengar konsisten dengan rekursi tak terbatas yang terjadi dalam kode Lua entah bagaimana...

Memberi label tinggi karena perilakunya yang buruk, kami berharap Mudlet bekerja lebih baik di sini.

Apakah adil untuk menandai ini sebagai satu- satunya masalah

Perilaku itu terdengar konsisten dengan rekursi tak terbatas yang terjadi dalam kode _Lua_ entah bagaimana...

Ya itulah alasannya. Karena Geyser selalu menyimpan referensi induk dalam wadah (myGeyserElement.container).
Ini adalah masalah yang diketahui dengan tampilan dan juga merupakan alasan pencipta Geyser membuat fungsi Geyser.display (11 tahun lalu :eyes: ).
https://github.com/Mudlet/Mudlet/blob/d84f0b5b171370feb96db2f1950a3fd6dac1709f/src/mudlet-lua/lua/geyser/GeyserUtil.lua#L35
Jadi, alih-alih menggunakan tampilan, solusinya adalah menggunakan Geyser.display.

Bisakah kita mengidentifikasi objek Geyser jika diberikan? Bisa membuat display() memanggil fungsi itu dalam kasus itu secara otomatis.

Mungkin kami dapat membantu tampilan untuk tidak pernah mengalami loop tak terbatas ini lagi?
Misalnya, simpan daftar semua tabel yang sudah ditampilkan, dan jangan tampilkan versi kedua penuh lagi.

Setelah menggali sedikit saya menemukan bahwa prettywrite memiliki failsafe terhadap infinite loop di dalamnya tetapi gagal untuk Geyser dalam beberapa kasus (saya tidak yakin mengapa)
Misalnya:

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

Tidak akan menyebabkan infinite loop.

Saya mencoba berkomentar https://github.com/Mudlet/Mudlet/blob/4042ac7600db8196b219b3ae43a977045d591fdd/src/mudlet-lua/lua/DebugTools.lua#L185 dan itu tampaknya berhasil tetapi saya tidak yakin apakah itu dapat menyebabkan yang lain masalah dan mengapa itu ada di tempat pertama.

Tidak terkait, sepertinya ada peningkatan untuk urutan kunci yang konsisten yang dapat kami manfaatkan: https://github.com/lunarmodules/Penlight/pull/293

Setelah menggali lebih jauh, saya perhatikan bahwa masalah ini terutama terjadi jika Label bersarang digunakan (menu klik kanan Kontainer yang Dapat Disesuaikan menggunakan Label bersarang)
Saya pribadi masih berpikir bahwa berkomentar https://github.com/Mudlet/Mudlet/blob/4042ac7600db8196b219b3ae43a977045d591fdd/src/mudlet-lua/lua/DebugTools.lua#L185 out adalah solusi yang layak untuk masalah ini.

Saya menguji https://github.com/kikito/inspect.lua yang kurang lebih sama dengan prettywrite dan mereka menyelesaikan masalah ini dengan cara yang sama (seperti jika bagian tables[t] dikomentari) tetapi dengan perbedaan bahwa setiap tabel yang digandakan mendapatkan id alih-alih <cycle> generic generik

Saya juga menemukan masalah serupa menggunakan contoh label bersarang kedua dari Geyser Wiki (yang memiliki 'mainlabel') https://wiki.mudlet.org/index.php?title=Manual:Geyser#Demo -> arahkan kursor ke 'Arahkan ke sana bagian' dan kemudian gunakan lua display(Geyser) masih menyebabkan kesalahan stackoverflow (tidak terjadi jika menggunakan inspeksi)

Mungkin beralih dari prettywrite ke inspect adalah sesuatu yang perlu dipikirkan.

Kami tidak memiliki alasan khusus untuk tetap berpegang pada satu - jika yang lain lebih baik, mari kita lakukan. Bagaimana perbandingan keduanya, bisakah Anda memposting sebelum/sesudah?

mengenai urutan kunci yang konsisten, bisa saja mengubah penggunaan pasangan menjadi pasangan dan itu harus menangani semua itu. Itu pada dasarnya semua cuplikan kode yang ditautkan, kami baru saja mengabstraksikannya untuk digunakan di mana saja sebagai pasangan.

Kami tidak memiliki alasan khusus untuk tetap berpegang pada satu - jika yang lain lebih baik, mari kita lakukan. Bagaimana perbandingan keduanya, bisakah Anda memposting sebelum/sesudah?

Ini cukup banyak melakukan hal yang sama tetapi saya tidak tahu apakah itu 'lebih baik' setidaknya tidak macet di Geyser (yang membuatnya lebih baik menurut saya) ;)
Saya akan membuka PR

Apakah halaman ini membantu?
0 / 5 - 0 peringkat