Well, I had the right idea, but at a key moment I zigged when I should have zagged. So let's try this again.
---------------------------------------------------------------- On Wed, Nov 23, 2005 at 10:49:18PM +0100, Leopold Toetsch wrote: > outer_sub - (the static sub PMC info) can't refer to :outer because the > :outer can be a closure too. There are many incarnations of the :outer > then. Therefore the implementation needs sub->ctx (currently and IMHO). The docs accidentally conflate non-closure Subs and closure Subs. So I'm going to write my way through this. I think the design as is can work, with each Sub having a static outer_sub attribute, but only if closures also have an attribute that points to the Sub that they were created from. (Perl 5 calls this closure-creation process "cloning". I'll adopt that term for this doc, and maybe permanently.) OK, here goes. Correct me where I go wrong: * The initial static result of compilation is N Parrot_subroutines (Subs). * Each of these Subs may have a non-NULL outer_sub attribute, which describes the textual relationship of the Subs in the original source code. For example, given: sub foo { my sub bar { my sub baz { } } } baz.outer_sub is bar, and bar.outer_sub is foo. * This is a static description of a static situation (the source code doesn't evolve at runtime). So it need never change. * The result of newclosure is a new Sub, but I'm going to call it a Closure for clarity in this message. * Each Closure has an "outer_ctx" attribute, which points to the call frame in which it was cloned. That call frame contains a pointer to the Sub (or Closure) that cloned the leaf Closure. * Therefore, we have outer_sub for the relationship of non-Closure Subs, and caller_ctx for Closure (cloning) relationships. * And thus there should be no need to modify a Sub after compilation, nor a Closure after cloning. Does this describe the current situation and its features? -- Chip Salzenberg <[EMAIL PROTECTED]>