On Tue, Oct 25, 2005 at 04:56:57PM +0200, Leopold Toetsch wrote:
> >How do I get an anonymous coroutine into a register?
>
> As these 2 .subs are generated in one bunch and compiled ...
> 
> >    .sub _pge_rule
> >        .param pmc mob
> 
> ... drop the var decl:
> 
> >        .local pmc corou
> 
> >        newsub corou, .Coroutine, _pge_rule_coroutine
> 
> and use a .Sub constant (.Sub is ok despite the PMC is a Coroutine).
> 
>           .const .Sub corou = "_pge_rule_coroutine"
> 
> The coroutine label is resolved at compile-time.

I tried the .Sub constant and I get an error:

    [EMAIL PROTECTED] pge]$ ./parrot Library.pir
    error:imcc:parse error, unexpected INTC
    in file 'Library.pir' line 5
    [EMAIL PROTECTED] pge]$ 

See attached Library.pir.

Better still, is there an easy way for a sub (coroutine) to get 
its own PMC when it's running?  Is C<interpinfo> the right 
way to do it?  What I'd like to do now is the equivalent of...

    .sub ident
        .param pmc mob
        $I0 = find_type "PGE::Match"
        mob = new $I0
        setattribute mob, "PGE::Match\x0&:corou", CURRENT_SUB
        ...
        .yield()
        ...
    .end

where the C<setattribute> line somehow stores the currently executing
coroutine into mob's attribute table.

Thanks,

Pm
# <PGE::Rule::ident>

.namespace [ "PGE::Rule" ]

.const .Sub corou = "_ident_coroutine"

.sub ident
    .param pmc mob
    $P0 = find_global "PGE::Match", "newfrom"
    mob = $P0(mob)
    setattribute mob, "PGE::Match\x0&:corou", corou
    corou(mob)
    .return (mob)
.end

.sub _ident_coroutine
    .param pmc mob
  loop:
    print mob
    .yield()
    goto loop
.end

Reply via email to