ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/Coro/State.xs
(Generate patch)

Comparing Coro/Coro/State.xs (file contents):
Revision 1.242 by root, Thu Aug 14 12:48:20 2008 UTC vs.
Revision 1.244 by root, Sun Sep 21 18:29:39 2008 UTC

361 361
362 /* casting is fun. */ 362 /* casting is fun. */
363 while (&PL_sv_undef != (SV *)(padlist = (AV *)av_pop (av))) 363 while (&PL_sv_undef != (SV *)(padlist = (AV *)av_pop (av)))
364 free_padlist (aTHX_ padlist); 364 free_padlist (aTHX_ padlist);
365 365
366 SvREFCNT_dec (av);
367
366 return 0; 368 return 0;
367} 369}
368 370
369#define CORO_MAGIC_type_cv PERL_MAGIC_ext 371#define CORO_MAGIC_type_cv PERL_MAGIC_ext
370#define CORO_MAGIC_type_state PERL_MAGIC_ext 372#define CORO_MAGIC_type_state PERL_MAGIC_ext
420 if (expect_true (mg && AvFILLp ((av = (AV *)mg->mg_obj)) >= 0)) 422 if (expect_true (mg && AvFILLp ((av = (AV *)mg->mg_obj)) >= 0))
421 CvPADLIST (cv) = (AV *)AvARRAY (av)[AvFILLp (av)--]; 423 CvPADLIST (cv) = (AV *)AvARRAY (av)[AvFILLp (av)--];
422 else 424 else
423 { 425 {
424#if CORO_PREFER_PERL_FUNCTIONS 426#if CORO_PREFER_PERL_FUNCTIONS
425 /* this is probably cleaner, but also slower? */ 427 /* this is probably cleaner? but also slower! */
428 /* in practise, it seems to be less stable */
426 CV *cp = Perl_cv_clone (cv); 429 CV *cp = Perl_cv_clone (cv);
427 CvPADLIST (cv) = CvPADLIST (cp); 430 CvPADLIST (cv) = CvPADLIST (cp);
428 CvPADLIST (cp) = 0; 431 CvPADLIST (cp) = 0;
429 SvREFCNT_dec (cp); 432 SvREFCNT_dec (cp);
430#else 433#else
1623 else 1626 else
1624 coro->slot->runops = RUNOPS_DEFAULT; 1627 coro->slot->runops = RUNOPS_DEFAULT;
1625 } 1628 }
1626} 1629}
1627 1630
1631static int
1632coro_gensub_free (pTHX_ SV *sv, MAGIC *mg)
1633{
1634 AV *padlist;
1635 AV *av = (AV *)mg->mg_obj;
1636
1637 abort ();
1638
1639 return 0;
1640}
1641
1642static MGVTBL coro_gensub_vtbl = {
1643 0, 0, 0, 0,
1644 coro_gensub_free
1645};
1646
1628MODULE = Coro::State PACKAGE = Coro::State PREFIX = api_ 1647MODULE = Coro::State PACKAGE = Coro::State PREFIX = api_
1629 1648
1630PROTOTYPES: DISABLE 1649PROTOTYPES: DISABLE
1631 1650
1632BOOT: 1651BOOT:
2083 api_trace (coro_current, 0); 2102 api_trace (coro_current, 0);
2084 2103
2085 av_push (av_async_pool, newSVsv (coro_current)); 2104 av_push (av_async_pool, newSVsv (coro_current));
2086} 2105}
2087 2106
2107#if 0
2108
2109void
2110_generator_call (...)
2111 PROTOTYPE: @
2112 PPCODE:
2113 fprintf (stderr, "call %p\n", CvXSUBANY(cv).any_ptr);
2114 xxxx
2115 abort ();
2116
2117SV *
2118gensub (SV *sub, ...)
2119 PROTOTYPE: &;@
2120 CODE:
2121{
2122 struct coro *coro;
2123 MAGIC *mg;
2124 CV *xcv;
2125 CV *ncv = (CV *)newSV_type (SVt_PVCV);
2126 int i;
2127
2128 CvGV (ncv) = CvGV (cv);
2129 CvFILE (ncv) = CvFILE (cv);
2130
2131 Newz (0, coro, 1, struct coro);
2132 coro->args = newAV ();
2133 coro->flags = CF_NEW;
2134
2135 av_extend (coro->args, items - 1);
2136 for (i = 1; i < items; i++)
2137 av_push (coro->args, newSVsv (ST (i)));
2138
2139 CvISXSUB_on (ncv);
2140 CvXSUBANY (ncv).any_ptr = (void *)coro;
2141
2142 xcv = GvCV (gv_fetchpv ("Coro::_generator_call", 0, SVt_PVCV));
2143
2144 CvXSUB (ncv) = CvXSUB (xcv);
2145 CvANON_on (ncv);
2146
2147 mg = sv_magicext ((SV *)ncv, 0, CORO_MAGIC_type_state, &coro_gensub_vtbl, (char *)coro, 0);
2148 RETVAL = newRV_noinc ((SV *)ncv);
2149}
2150 OUTPUT:
2151 RETVAL
2152
2153#endif
2154
2088 2155
2089MODULE = Coro::State PACKAGE = Coro::AIO 2156MODULE = Coro::State PACKAGE = Coro::AIO
2090 2157
2091SV * 2158SV *
2092_get_state () 2159_get_state ()

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines