From: Leopold Toetsch <[EMAIL PROTECTED]> Date: Sun, 08 Jan 2006 17:21:25 +0100
Bob Rogers wrote: > Actually, I would have assumed that the user stack operated more or less > independently of the call chain, but I see it is kept in the context > structure and not the interpreter. Hmmm . . . I think so too. It's just in the context as it was there, w/o further recent discussion. Comments welcome leo Sure enough, it doesn't behave as I would expect across call and return (see patch). But I'm not sure how I would expect it to behave for coroutines, so my earlier comment ("Hmmm . . .") still stands. My gut feeling, though, is that calling a continuation should not affect the user stack, so for consistency the same should probably be true of coroutines. In that case, the model becomes "one user stack per thread," and the user stack can be moved to the interpreter struct. On the other hand, a "one user stack per coroutine" model doesn't seem that much harder, and might be more tractable for users/compilers to deal with. I think I could be persuaded either way. Since nobody has complained, though, it seems safe to deal with this after implementing rezipping for the dynamic context. It could be that rezipping would also have to do something with the user stack, but it seems unlikely. It seems to me that both the "per coroutine" and "per thread" models would need to have the user stack in the interpreter in order to preserve its state across call/return. -- Bob
Index: t/op/stacks.t =================================================================== --- t/op/stacks.t (revision 10945) +++ t/op/stacks.t (working copy) @@ -605,9 +605,49 @@ Stack 'Control' too deep OUTPUT } + +{ +local $TODO = 'bug: stack state is saved across call/return'; + +pir_output_is(<<'CODE', <<'OUTPUT', "save/restore across contexts [1]"); +.sub main :main + $I0 = 11 + save $I0 + test_1() + restore $I0 + print $I0 + print "\n" +.end +.sub test_1 + save 22 +.end +CODE +22 +OUTPUT + +pir_output_is(<<'CODE', <<'OUTPUT', "save/restore across contexts [2]"); +.sub main :main + $I0 = 11 + save $I0 + inc $I0 + save $I0 + test_1() + restore $I0 + print $I0 + print "\n" +.end +.sub test_1 + restore $I22 +.end +CODE +11 +OUTPUT + +} + ############################## ## remember to change the number of tests :-) -BEGIN { plan tests => 24; } +BEGIN { plan tests => 26; }