… | |
… | |
1051 | |
1051 | |
1052 | void |
1052 | void |
1053 | yield(...) |
1053 | yield(...) |
1054 | PROTOTYPE: @ |
1054 | PROTOTYPE: @ |
1055 | CODE: |
1055 | CODE: |
1056 | static SV *returnstk; |
1056 | SV *yieldstack; |
1057 | SV *sv; |
1057 | SV *sv; |
1058 | AV *defav = GvAV (PL_defgv); |
1058 | AV *defav = GvAV (PL_defgv); |
1059 | struct coro *prev, *next; |
1059 | struct coro *prev, *next; |
1060 | |
1060 | |
1061 | if (!returnstk) |
1061 | yieldstack = *hv_fetch ( |
1062 | returnstk = SvRV ((SV *)get_sv ("Coro::Cont::return", FALSE)); |
1062 | (HV *)SvRV (GvSV (coro_current)), |
|
|
1063 | "yieldstack", sizeof ("yieldstack") - 1, |
|
|
1064 | 0 |
|
|
1065 | ); |
1063 | |
1066 | |
1064 | /* set up @_ -- ugly */ |
1067 | /* set up @_ -- ugly */ |
1065 | av_clear (defav); |
1068 | av_clear (defav); |
1066 | av_fill (defav, items - 1); |
1069 | av_fill (defav, items - 1); |
1067 | while (items--) |
1070 | while (items--) |
1068 | av_store (defav, items, SvREFCNT_inc (ST(items))); |
1071 | av_store (defav, items, SvREFCNT_inc (ST(items))); |
1069 | |
1072 | |
1070 | SvGETMAGIC (returnstk); /* isn't documentation wrong for mg_get? */ |
|
|
1071 | sv = av_pop ((AV *)SvRV (returnstk)); |
1073 | sv = av_pop ((AV *)SvRV (yieldstack)); |
1072 | prev = (struct coro *)SvIV ((SV*)SvRV (*av_fetch ((AV *)SvRV (sv), 0, 0))); |
1074 | prev = (struct coro *)SvIV ((SV*)SvRV (*av_fetch ((AV *)SvRV (sv), 0, 0))); |
1073 | next = (struct coro *)SvIV ((SV*)SvRV (*av_fetch ((AV *)SvRV (sv), 1, 0))); |
1075 | next = (struct coro *)SvIV ((SV*)SvRV (*av_fetch ((AV *)SvRV (sv), 1, 0))); |
1074 | SvREFCNT_dec (sv); |
1076 | SvREFCNT_dec (sv); |
1075 | |
1077 | |
1076 | transfer (aTHX_ prev, next, 0); |
1078 | transfer (aTHX_ prev, next, 0); |