… | |
… | |
1988 | SV *data = (SV *)GENSUB_ARG; |
1988 | SV *data = (SV *)GENSUB_ARG; |
1989 | |
1989 | |
1990 | if (SvTYPE (SvRV (data)) != SVt_PVAV) |
1990 | if (SvTYPE (SvRV (data)) != SVt_PVAV) |
1991 | { |
1991 | { |
1992 | /* first call, set args */ |
1992 | /* first call, set args */ |
|
|
1993 | SV *coro = SvRV (data); |
1993 | AV *av = newAV (); |
1994 | AV *av = newAV (); |
1994 | SV *coro = SvRV (data); |
|
|
1995 | |
1995 | |
1996 | SvRV_set (data, (SV *)av); |
1996 | SvRV_set (data, (SV *)av); |
1997 | api_ready (aTHX_ coro); |
|
|
1998 | SvREFCNT_dec (coro); |
|
|
1999 | |
1997 | |
2000 | /* better take a full copy of the arguments */ |
1998 | /* better take a full copy of the arguments */ |
2001 | while (items--) |
1999 | while (items--) |
2002 | av_store (av, items, newSVsv (ST (items))); |
2000 | av_store (av, items, newSVsv (ST (items))); |
|
|
2001 | |
|
|
2002 | api_ready (aTHX_ coro); |
|
|
2003 | SvREFCNT_dec (coro); |
2003 | } |
2004 | } |
2004 | |
2005 | |
2005 | XSRETURN_EMPTY; |
2006 | XSRETURN_EMPTY; |
2006 | } |
2007 | } |
2007 | |
2008 | |
… | |
… | |
2024 | |
2025 | |
2025 | EXTEND (SP, AvFILLp (av) + 1); |
2026 | EXTEND (SP, AvFILLp (av) + 1); |
2026 | for (i = 0; i <= AvFILLp (av); ++i) |
2027 | for (i = 0; i <= AvFILLp (av); ++i) |
2027 | PUSHs (sv_2mortal (AvARRAY (av)[i])); |
2028 | PUSHs (sv_2mortal (AvARRAY (av)[i])); |
2028 | |
2029 | |
2029 | /* we have stolen the elements, so ste length to zero and free */ |
2030 | /* we have stolen the elements, so set length to zero and free */ |
2030 | AvFILLp (av) = -1; |
2031 | AvFILLp (av) = -1; |
2031 | av_undef (av); |
2032 | av_undef (av); |
2032 | |
2033 | |
2033 | PUTBACK; |
2034 | PUTBACK; |
2034 | } |
2035 | } |
… | |
… | |
3430 | av_push (*avp, SvREFCNT_inc (block)); |
3431 | av_push (*avp, SvREFCNT_inc (block)); |
3431 | |
3432 | |
3432 | if (!ix) |
3433 | if (!ix) |
3433 | on_enterleave_call (aTHX_ block); |
3434 | on_enterleave_call (aTHX_ block); |
3434 | |
3435 | |
3435 | LEAVE; /* pp_entersub unfortunately forces an ENTER/LEAVE around xs calls */ |
3436 | LEAVE; /* pp_entersub unfortunately forces an ENTER/LEAVE around XS calls */ |
3436 | SAVEDESTRUCTOR_X (ix ? coro_pop_on_leave : coro_pop_on_enter, (void *)coro); |
3437 | SAVEDESTRUCTOR_X (ix ? coro_pop_on_leave : coro_pop_on_enter, (void *)coro); |
3437 | ENTER; /* pp_entersub unfortunately forces an ENTER/LEAVE around xs calls */ |
3438 | ENTER; /* pp_entersub unfortunately forces an ENTER/LEAVE around XS calls */ |
3438 | } |
3439 | } |
3439 | |
3440 | |
3440 | |
3441 | |
3441 | MODULE = Coro::State PACKAGE = PerlIO::cede |
3442 | MODULE = Coro::State PACKAGE = PerlIO::cede |
3442 | |
3443 | |