<p>Visor de chamada de congelamento de Mudlet () no recipiente ajustável</p>

Criado em 10 jan. 2021  ·  13Comentários  ·  Fonte: Mudlet/Mudlet

Breve resumo do problema

Mudlet congela alguns segundos após digitar o comando errado

Etapas para reproduzir o problema

O usuário Discord chad explica:

  1. então, se eu fizer um contêiner ajustável, chamado testContainer
    testContainer = Adjustable.Container:new({name = "ARS main window"})
  2. e eu faço lua testContainer em meu prompt de cmd
  3. ele congela mudlet e depois me dá um erro de memória

Saída de erro

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

Informações extras, como versão do Mudlet, sistema operacional e ideias para resolver / implementar:

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

bug high lua only

Todos 13 comentários

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.

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

Esta página foi útil?
0 / 5 - 0 avaliações