Mudlet se congela unos segundos después de escribir el comando incorrecto
El usuario de Discord, chad, explica:
testContainer = Adjustable.Container:new({name = "ARS main window"})
lua testContainer
en mi indicador de cmd[ERROR:] Objekt:<run lua code> Funktion:<Alias4>
<not enough memory>
eso no es solo en mi portátil de mierda, o solo en 1 perfil.
que está en mi computadora portátil y PC (16 GB de RAM)
en perfiles nuevos, perfiles antiguos
Mudlet 4.10.1
Ese comportamiento suena consistente con una recursividad infinita que ocurre en el código Lua de alguna manera ...
Etiquetado como alto porque es un mal comportamiento, esperamos que Mudlet lo haga mejor aquí.
¿Sería justo marcar esto como probable que sea un problema exclusivo de lua ?
Ese comportamiento suena consistente con una recursividad infinita que ocurre en el código _Lua_ de alguna manera ...
Sí, esa es la razón. Como Geyser siempre mantiene una referencia del padre en el contenedor (myGeyserElement.container).
Este es un problema conocido con la visualización y también es la razón por la que el creador de Geyser creó la función Geyser.display (hace 11 años: ojos :).
https://github.com/Mudlet/Mudlet/blob/d84f0b5b171370feb96db2f1950a3fd6dac1709f/src/mudlet-lua/lua/geyser/GeyserUtil.lua#L35
Entonces, en lugar de usar la pantalla, una solución alternativa sería usar Geyser.display.
¿Podemos identificar un objeto Geyser si se da uno? Podría hacer que display()
llame a esa función en ese caso automáticamente.
¿Quizás podamos ayudar a la pantalla para no volver a encontrarnos nunca con estos bucles infinitos?
Por ejemplo, mantenga una lista de todas las tablas que ya se muestran y no vuelva a mostrar una segunda versión completa de una.
Después de excavar un poco, descubrí que prettywrite tiene un mecanismo de seguridad contra bucles infinitos, pero falla para Geyser en algunos casos (no estoy seguro de por qué)
por ejemplo:
test = {}
test[1] = test
display(test)
No provocará un bucle infinito.
Intenté comentar https://github.com/Mudlet/Mudlet/blob/4042ac7600db8196b219b3ae43a977045d591fdd/src/mudlet-lua/lua/DebugTools.lua#L185 y eso parece funcionar, pero no estoy seguro si eso podría causar otros problemas y por qué estaba allí en primer lugar.
Esta es la razón: https://github.com/lunarmodules/Penlight/pull/38
Sin relación, parece que hay una mejora para el orden de claves consistente que podríamos aprovechar: https://github.com/lunarmodules/Penlight/pull/293
Después de profundizar más, noté que el problema ocurre principalmente si se usan etiquetas anidadas (el menú contextual del contenedor ajustable usa una etiqueta anidada)
Personalmente, sigo pensando que comentar https://github.com/Mudlet/Mudlet/blob/4042ac7600db8196b219b3ae43a977045d591fdd/src/mudlet-lua/lua/DebugTools.lua#L185 es una solución viable al problema.
Probé https://github.com/kikito/inspect.lua, que hace más o menos lo mismo que prettywrite y resuelven este problema de la misma manera (como sería si se comentara la parte de las tablas [t]) pero con la diferencia de que cada tabla duplicada obtiene una identificación en lugar de un <cycle>
genérico
También encontré un problema similar usando el segundo ejemplo de etiquetas encajables de Geyser Wiki (el que tiene 'mainlabel') https://wiki.mudlet.org/index.php?title=Manual:Geyser#Demo -> desplazarse sobre el 'Hover there part' y luego usar lua display(Geyser)
todavía causa un error de desbordamiento de pila (no ocurre si se usa inspeccionar)
Quizás cambiar de prettywrite a inspeccionar es algo en lo que pensar.
No tenemos una razón particular para ceñirnos a uno; si el otro es mejor, hagámoslo. ¿Cómo se comparan los dos? ¿Podrías publicar antes / después?
con respecto al orden de claves consistente, podría simplemente cambiar el uso de pares a spairs y debería manejar todo eso. Eso es esencialmente todo lo que hace el fragmento de código vinculado, solo lo hemos abstraído para usarlo en cualquier lugar como spairs.
No tenemos una razón particular para ceñirnos a uno; si el otro es mejor, hagámoslo. ¿Cómo se comparan los dos? ¿Podrías publicar antes / después?
Está haciendo prácticamente lo mismo, pero no sé si es 'mejor', al menos no se bloquea en Geyser (lo que lo hace mejor en mi opinión);)
Abriré un PR