<p>Pantalla de llamada de congelación de Mudlet () en contenedor ajustable</p>

Creado en 10 ene. 2021  ·  13Comentarios  ·  Fuente: Mudlet/Mudlet

Breve resumen del problema

Mudlet se congela unos segundos después de escribir el comando incorrecto

Pasos para reproducir el problema

El usuario de Discord, chad, explica:

  1. así que si hago un contenedor ajustable, llamado testContainer
    testContainer = Adjustable.Container:new({name = "ARS main window"})
  2. y hago lua testContainer en mi indicador de cmd
  3. congela mudlet y luego me da un error de memoria

Salida de error

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

Información adicional, como la versión de Mudlet, el sistema operativo e ideas sobre cómo solucionarlo / implementarlo:

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

bug high lua only

Todos 13 comentarios

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.

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

¿Fue útil esta página
0 / 5 - 0 calificaciones