[PD] Why does this cause stack overflow?
Claude Heiland-Allen
claude at mathr.co.uk
Mon May 27 19:44:39 CEST 2019
Hi Phil,
On 2019-05-27 18:23, Philip Stone wrote:
> Hello, I’ve run into a situation that strains my understanding of
> Pd’s strict determinacy – please see the attached patch of the
> simplest case. On my system, the stack over-flows at count 331.
>
> I don’t understand why this happens, as the bang that re-fires the
> loop is not triggered until after the print. What is filling the
> stack, exactly?
Control flow in Pd's message system is depth-first, usually
right-to-left. This means that control passes from first object to
deepest object, then back up again:
in this small example
[bng]
[t b b]
| [print r]
[print l]
the control flow stack over time is like:
[bng]
[bng] [t b b]
[bng] [t b b] [print r]
[bng] [t b b]
[bng] [t b b] [print l]
[bng] [t b b]
[bng]
But in your example control is not yielded back to the caller before 400
iterations, at which point the stack is filled with
... [f] [t] [spigot] [f] [t] [spigot] ....
The default stack size limit I think is 1000 objects, recent Pd let you
change it - search list archives or github issues for details.
But the simplest(*) way to get recursive calls to work is often to break
the recursion with a [delay 0] to start a new depth first execution
chain after the current one is finished, or to refactor it to use
[until](+) to iterate instead of recurse.
(*) but it can become unmaintainable in larger patches...
(+) but [bang(--[until] can take a while to finish, be careful...
Claude
--
https://mathr.co.uk
More information about the Pd-list
mailing list