Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Continuation usage

4 views
Skip to first unread message

Jens Rieks

unread,
Mar 18, 2004, 12:44:29 PM3/18/04
to perl6-i...@perl.org
Hi,

does the attached test use the Continuation in a correct way?
The test failes, what am I doing wrong?

jens

conti.t

Piers Cawley

unread,
Mar 19, 2004, 1:40:02 AM3/19/04
to Jens Rieks, perl6-i...@perl.org
Jens Rieks <par...@jensbeimsurfen.de> writes:

Without running it I'm guessing that it prints out something like

456=789
456=456
123=123

And on running it, I see that I'm right.

Remember that invoking a continuation does nothing to the existing
register state (which is as it should be).

So why does it work like this?

Letting IMCC handle calling _func saves all the registers and sets P1
to a RetContinuation that points to _func's return point (which is sort
of inside the _func() line because of the stuff IMCC does on a function
return).

_func then sets P16-18 to 4-6 respectively and you make the
continuation.

Calling _do_something saves all the registers and sets P1 to
(essentially) _end

_do_something sets P16-18 to 7-9 then jumps through the continuation
back to _end.

Which prints out '456=789' because P16-18 haven't been restored

Then it returns. Returning invokes P1, which is currently set to point
to _end. However, returning using .pcc_*_return also restores the
registers, which means P16-18 now contain 4-6, so it prints out
456=456 and returns through P1, which now boints back to the original
place that _func was called from.

Easy.

One part of your problem (The state of P16-18) is, therefore, a bug in
your program. The other part seems to be a bug in the current
implementation of Continuation.

A new Continuation should grab the current P1 continuation. If you
later invoke that Continuation, it should make the jump and reset
P1. Until that's done, all we have is a heavyweight goto.

Leopold Toetsch

unread,
Mar 19, 2004, 5:10:12 AM3/19/04
to Piers Cawley, perl6-i...@perl.org
Piers Cawley <pdca...@bofh.org.uk> wrote:
> Jens Rieks <par...@jensbeimsurfen.de> writes:

>> Hi,
>>
>> does the attached test use the Continuation in a correct way?
>> The test failes, what am I doing wrong?

> Without running it I'm guessing that it prints out something like

> 456=789
> 456=456
> 123=123

Why would it print 3 lines?

> Easy.

Brrr.

> One part of your problem (The state of P16-18) is, therefore, a bug in
> your program. The other part seems to be a bug in the current
> implementation of Continuation.

Yep.

> A new Continuation should grab the current P1 continuation. If you
> later invoke that Continuation, it should make the jump and reset
> P1. Until that's done, all we have is a heavyweight goto.

I don't get that. Below is a stripped down version of Jens program. There
are 2 ways of invokeing the return continuation:

invoke conti

or

conti()

The former is more or less ignored by imcc, the latter is recognized as
a regular function call: registers are preserved and a flag
"sub_calls_a_sub" is set, so that e.g. the return continuation is
preserved around the call. These variants give different output.

How schould it really work?

.sub _main
.local int a
a = 1
_func()
print a
print " main\n"
end
.end

.sub _func
.local pmc conti
.local int a
a = 4
conti = newcont _end
_do_something( conti )
_end:
print a
print " _func\n"
.end

.sub _do_something
.param pmc conti
.local int a
a = 7
# invoke conti # (1)
conti() # (2)
print "error!\n"
.end

Thanks,
leo

Piers Cawley

unread,
Mar 19, 2004, 9:01:13 AM3/19/04
to l...@toetsch.at, perl6-i...@perl.org
Leopold Toetsch <l...@toetsch.at> writes:

> Piers Cawley <pdca...@bofh.org.uk> wrote:
>> Jens Rieks <par...@jensbeimsurfen.de> writes:
>
>>> Hi,
>>>
>>> does the attached test use the Continuation in a correct way?
>>> The test failes, what am I doing wrong?
>
>> Without running it I'm guessing that it prints out something like
>
>> 456=789
>> 456=456
>> 123=123
>
> Why would it print 3 lines?

Actually, it doesn't, I was going mad and mixing it up with the problem
I've been having with ParrotUnit, which does bad things with returning...

0 new messages