A pilha
Profundidade, teto e quadros — a pilha tinha limite e não tinha como ser perguntada.
O teto de quadros é mil, e recursão legítima o atinge: uma travessia de árvore de cinco mil nós não tem nada de infinita. Quem a escreve precisa saber de quanto é o teto antes de bater nele.
dataforge
adopt Arcane.Inicio as I
action folha():
yield I.pilha()
action tronco():
yield folha()
p := tronco()
assert p["profundidade"] bigger_eq 2
assert p["restante"] is p["limite"] - p["profundidade"]dataforge
adopt Arcane.Inicio as I
action quem():
yield [q["acao"] cycle q in I.quadros()]
assert "quem" in quem()Ajustar o teto#
dataforge
adopt Arcane.Inicio as I
antes := I.limite_da_pilha()
I.limite_da_pilha(300)
assert I.pilha()["limite"] is 300
I.limite_da_pilha(antes)As duas saídas que a mensagem do erro traz continuam sendo as certas: yield f(…) como retorno inteiro vira salto e não tem teto (testado com 200 mil), ou um cycle com pilha explícita.
| Item da literatura | Aqui |
|---|---|
| stack frames | I.quadros() — ação, linha e arquivo de cada um |
| stack overflow detection | o teto de quadros, com mensagem que diz as duas saídas |
| coroutine / fiber stacks | as fibras são sem pilha: o contexto é o quadro do gerador |
| stack probes, stack guards, stack growth | não se aplica: quem gerencia a pilha é o CPython |