Dan~
On Tue, 30 Nov 2004 08:28:35 -0500, Dan Sugalski <[EMAIL PROTECTED]> wrote:At 1:45 AM -0800 11/29/04, Jeff Clites wrote:
>On Nov 28, 2004, at 2:48 AM, Piers Cawley wrote:
>
>>I just thought of a heuristic that might help with register
>>preservation:
>>
>>A variable/register should be preserved over a function call if either of the
>>following is true:
>>
>>1. The variable is referred to again (lexically) after the function has
>> returned.
>>2. The variable is used as the argument of a function call within the
>> current compilation unit.
>
>That doesn't solve it, though you'd think it would. Here's the
>counter-example:
>
> x = 1
> foo()
> print x
> y = 2
> return y
>
>You'd think that x and y could use the same memory location
>(register, variable--whatever), since ostensibly their lifetimes
>don't overlap. But continuation re-invocation can cause foo() to
>return multiple times, and each time it should print "1", but it
>won't if x and y use the same "slot" (it would print "2" each time
>after the first). In truth, their lifetimes do overlap, due to the
>hidden (potential) loops created by continuations.
Except... we've already declared that return continuations are special, and preserve the registers in the 16-31 range. So when we return from foo, regardless of how or how many times, the pointer to x's PMC will be in a register if it was in there before the call to foo, if it's in the preserved range. So in this case there's no problem. Things'll look like:
x = 1 # new P16, .Integer; P16 = 1 # P16 has pointer value 0x04 foo() # foo invocation print x # P16 still has pointer value 0x04 y = 2 # new P16, .Integer; P16 = 2 # P16 now has pointer value 0x08 return y # Passes back 0x08
With more or less clarity.
I think that the concern is for the circumstance where foo() promotes it return continuation to a full continuation. Then, that guarantee is no longer provided (I think), and repeated invocation could leave y in P16 rather than x.
Nope. The guarantee's still there. Promotion will force things up the call chain to get marked as un-recyclable, but registers still get restored on invocation.
--
Dan
--------------------------------------it's like this------------------- Dan Sugalski even samurai [EMAIL PROTECTED] have teddy bears and even teddy bears get drunk