Jeff~ On Tue, 30 Nov 2004 11:20:50 -0800, Jeff Clites <[EMAIL PROTECTED]> wrote: > On Nov 30, 2004, at 10:27 AM, Dan Sugalski wrote: > > > > > At 10:15 AM -0800 11/30/04, Jeff Clites wrote: > > > Oh. No, it won't. We've declared that return continuations will always > > leave the top half registers in the state they were when the return > > continuation was taken. In this case, when it's taken to pass into > > foo, P16 is 0x04. When that return continuation is invoked, no matter > > where or how many times, P16 will be set to 0x04. This does make > > return continuations slightly different from 'plain' continuations, > > but I think this is acceptable. > > Ah, I see. > > > > >> None of this should have anything to do with return continuations > >> specifically, since this is the case where the body of foo (or > >> something called from it) creates a "real" continuation, which as I > >> understand it is supposed to promote the return continuations to > >> "real" continuations all the way up the stack. > > > > The return continuations have to maintain their returny-ness > > regardless, otherwise they can't be trusted and we'd need to > > unconditionally reload the registers after the return from foo(), > > since there's no way to tell whether we were invoked via a normal > > return continuation chain invocation, or whether something funky > > happened down deep in the call chain. > > Yeah, so I think that won't work correctly. Here's an example from Ruby > which I posted in a previous thread. If the return from the call to > strange() by outer() always restores the registers as of the point the > (return) continuation was created, then the below would print out "a = > 1" over and over, but really it's intended that the value should > increase, so with the behavior you describe, the following Ruby code > wouldn't work right: > > % cat continuation6.ruby > def strange > callcc {|continuation| $saved = continuation} > end > > def outer > a = 0 > strange() > a = a + 1 > print "a = ", a, "\n" > end > > # these two lines are "main" > outer() > $saved.call > > % ruby continuation6.ruby > a = 1 > a = 2 > a = 3 > a = 4 > a = 5 > a = 6 > a = 7 > a = 8 > a = 9 > a = 10 > ...infinite loop, by design
a would need to be stored in a RubyInt PMC. In such a situation it would work as the register for a is actually a pointer to its value. An optimizer might try and lower a to an I register, but that would be an invalid optimization. Matt -- "Computer Science is merely the post-Turing Decline of Formal Systems Theory." -???