Mudlet congela alguns segundos após digitar o comando errado
O usuário Discord chad explica:
testContainer = Adjustable.Container:new({name = "ARS main window"})
lua testContainer
em meu prompt de cmd[ERROR:] Objekt:<run lua code> Funktion:<Alias4>
<not enough memory>
isso não é apenas no meu laptop de merda, ou apenas um perfil.
que está no meu laptop e PC (16 gb de RAM)
em novos perfis, perfis antigos
Mudlet 4.10.1
Esse comportamento parece consistente com uma recursão infinita acontecendo no código Lua de alguma forma ...
Rotulado como alto porque é um comportamento ruim, esperamos que Mudlet se saia melhor aqui.
Seria justo marcar isso como provavelmente um problema apenas de lua ?
Esse comportamento parece consistente com uma recursão infinita acontecendo no código _Lua_ de alguma forma ...
Sim, esse é o motivo. Como Geyser sempre mantém uma referência do pai no container (myGeyserElement.container).
Este é um problema conhecido com exibição e também é a razão pela qual o criador do Geyser fez a função Geyser.display (11 anos atrás: olhos :).
https://github.com/Mudlet/Mudlet/blob/d84f0b5b171370feb96db2f1950a3fd6dac1709f/src/mudlet-lua/lua/geyser/GeyserUtil.lua#L35
Portanto, em vez de usar display, uma solução alternativa seria usar Geyser.display.
Podemos identificar um objeto Geyser se um for fornecido? Poderia fazer display()
chamar essa função nesse caso automaticamente.
Talvez possamos ajudar o display para nunca mais voltar a esses loops infinitos?
Por exemplo, mantenha uma lista de todas as tabelas já exibidas e não exiba uma segunda versão completa de uma novamente.
Depois de cavar um pouco, descobri que o prettywrite tem uma proteção contra falhas contra loops infinitos, mas falha para o Geyser em alguns casos (não tenho certeza do porquê)
por exemplo:
test = {}
test[1] = test
display(test)
Não causará um loop infinito.
Tentei comentar https://github.com/Mudlet/Mudlet/blob/4042ac7600db8196b219b3ae43a977045d591fdd/src/mudlet-lua/lua/DebugTools.lua#L185 e isso parece funcionar, mas não tenho certeza se isso poderia causar outro questões e por que ele estava lá em primeiro lugar.
Este é o motivo: https://github.com/lunarmodules/Penlight/pull/38
Não relacionado, parece que há uma melhoria para a ordem consistente das chaves que poderíamos aproveitar: https://github.com/lunarmodules/Penlight/pull/293
Depois de cavar mais, percebi que o problema ocorre principalmente se rótulos aninhados forem usados (o menu de clique com o botão direito do recipiente ajustável usa um rótulo aninhado)
Pessoalmente, ainda acho que comentar https://github.com/Mudlet/Mudlet/blob/4042ac7600db8196b219b3ae43a977045d591fdd/src/mudlet-lua/lua/DebugTools.lua#L185 out é uma solução viável para o problema.
Eu testei https://github.com/kikito/inspect.lua que faz mais ou menos o mesmo que prettywrite e eles resolvem esse problema da mesma maneira (como seria se a parte das tabelas [t] fosse comentada), mas com a diferença de que cada tabela duplicada recebe um id em vez de um <cycle>
genérico
Eu também encontrei um problema semelhante usando o segundo exemplo de rótulos aninhados do Geyser Wiki (aquele com 'mainlabel') https://wiki.mudlet.org/index.php?title=Manual:Geyser#Demo -> passe o mouse sobre o 'Passe o mouse sobre a parte' e, em seguida, use lua display(Geyser)
ainda causa um erro de stackoverflow (não ocorre se estiver usando inspecionar)
Talvez mudar de Prettywrite para Inspecionar seja algo em que se pensar.
Não temos um motivo específico para nos limitarmos a um - se o outro for melhor, vamos em frente. Como os dois se comparam, você poderia postar antes / depois?
em relação à ordem consistente das chaves, poderia apenas mudar o uso de pares por pares e deveria cuidar de tudo isso. Isso é essencialmente tudo que o trecho de código linkado faz, nós apenas abstraímos para uso em qualquer lugar como spairs.
Não temos um motivo específico para nos limitarmos a um - se o outro for melhor, vamos em frente. Como os dois se comparam, você poderia postar antes / depois?
Ele está praticamente fazendo o mesmo, mas não sei se é "melhor", pelo menos não falha no Geyser (o que o torna melhor na minha opinião);)
Vou abrir um PR