2010/4/11 François Perrad <[email protected]>:
> I try to refactor runtime/parrot/library/TAP/parser.pir with a generator
> (see attached patch)
>
> this naive implementation :
>    .sub '_get_results'
>        .param pmc parser
>        .local pmc result
>        result = new 'ResizablePMCArray'
>      L1:
>        $P0 = parser.'next'()
>        if null $P0 goto L2
>        diag($P0)
>        push result, $P0
>        goto L1
>      L2:
>        .return (result)
>    .end
> cannot work with more than 1 file.
> And fails at the beginning of second file with the message :
>    Cannot resume dead coroutine.
>

This behaviour is fine for me.
I don't like the idea of a silently restart.

> this other implementation with a Coroutine PMC :
>    .sub '_get_results'
>        .param pmc parser
>        .local pmc result
>        result = new 'ResizablePMCArray'
>        $P0 = get_hll_global ['TAP';'Parser'], 'next'
>        .local pmc coro
>        coro = new 'Coroutine', $P0
>      L1:
>        $P0 = coro(parser)
>        if null $P0 goto L2
>        diag($P0)
>        push result, $P0
>        goto L1
>      L2:
>        .return (result)
>    .end
> fails with the message :
>    exists_keyed_str() not implemented in class 'Coroutine'
> Something seems to be broken and parrot lacks of tests for this part.
>

Now, when I instanciate explicity a Coroutine
    const 'Sub' func = 'my_coro'
    $P0 = new 'Coroutine', func
I want each time, a 'new' coroutine in its initial state.

Another idea is cloning the coroutine before using it, and consume
only the clone.
That's work with the attached sample.
But gives a new error with TAP/Parser which uses a lexical 'state'.

    .sub '_get_results'
        .param pmc parser
        .local pmc result
        result = new 'ResizablePMCArray'
        $P0 = get_hll_global ['TAP';'Parser'], 'next'
        .local pmc coro
        coro = clone $P0
      L1:
        $P0 = coro(parser)
        if null $P0 goto L2
        diag($P0)
        push result, $P0
        goto L1
      L2:
        .return (result)
    .end


François

> Any idea or help is welcome.
>
> François
>

Attachment: coro.pir
Description: Binary data

_______________________________________________
http://lists.parrot.org/mailman/listinfo/parrot-dev

Reply via email to