… | |
… | |
26 | #ifndef SVs_PADSTALE |
26 | #ifndef SVs_PADSTALE |
27 | # define SVs_PADSTALE 0 |
27 | # define SVs_PADSTALE 0 |
28 | #endif |
28 | #endif |
29 | |
29 | |
30 | #ifdef PadARRAY |
30 | #ifdef PadARRAY |
31 | # define NEWPADAPI |
31 | # define NEWPADAPI 1 |
32 | # define newPADLIST(var) (Newz (0, var, 1, PADLIST), Newx (PadlistARRAY (var), 2, PAD *)) |
32 | # define newPADLIST(var) (Newz (0, var, 1, PADLIST), Newx (PadlistARRAY (var), 2, PAD *)) |
33 | #else |
33 | #else |
34 | typedef AV PADNAMELIST; |
34 | typedef AV PADNAMELIST; |
35 | # if !PERL_VERSION_ATLEAST(5,8,0) |
35 | # if !PERL_VERSION_ATLEAST(5,8,0) |
36 | typedef AV PADLIST; |
36 | typedef AV PADLIST; |
… | |
… | |
42 | # define PadARRAY AvARRAY |
42 | # define PadARRAY AvARRAY |
43 | # define PadMAX AvFILLp |
43 | # define PadMAX AvFILLp |
44 | # define newPADLIST(var) ((var) = newAV (), av_extend (var, 1)) |
44 | # define newPADLIST(var) ((var) = newAV (), av_extend (var, 1)) |
45 | #endif |
45 | #endif |
46 | |
46 | |
|
|
47 | /* 5.19.something has replaced SVt_BIND by SVt_INVLIST */ |
|
|
48 | /* we just alias it to SVt_IV, as that is sufficient for swap_sv for now */ |
|
|
49 | #if PERL_VERSION_ATLEAST(5,19,0) |
|
|
50 | # define SVt_BIND SVt_IV |
|
|
51 | #endif |
|
|
52 | |
47 | #if defined(_WIN32) |
53 | #if defined(_WIN32) |
48 | # undef HAS_GETTIMEOFDAY |
54 | # undef HAS_GETTIMEOFDAY |
49 | # undef setjmp |
55 | # undef setjmp |
50 | # undef longjmp |
56 | # undef longjmp |
51 | # undef _exit |
57 | # undef _exit |
… | |
… | |
279 | |
285 | |
280 | #if CORO_JIT |
286 | #if CORO_JIT |
281 | /* APPLE doesn't have mmap though */ |
287 | /* APPLE doesn't have mmap though */ |
282 | #define CORO_JIT_UNIXY (__linux || __FreeBSD__ || __OpenBSD__ || __NetBSD__ || __solaris || __APPLE__) |
288 | #define CORO_JIT_UNIXY (__linux || __FreeBSD__ || __OpenBSD__ || __NetBSD__ || __solaris || __APPLE__) |
283 | #ifndef CORO_JIT_TYPE |
289 | #ifndef CORO_JIT_TYPE |
284 | #if __x86_64 && CORO_JIT_UNIXY |
290 | #if ECB_AMD64 && CORO_JIT_UNIXY |
285 | #define CORO_JIT_TYPE "amd64-unix" |
291 | #define CORO_JIT_TYPE "amd64-unix" |
286 | #elif __i386 && CORO_JIT_UNIXY |
292 | #elif __i386 && CORO_JIT_UNIXY |
287 | #define CORO_JIT_TYPE "x86-unix" |
293 | #define CORO_JIT_TYPE "x86-unix" |
288 | #endif |
294 | #endif |
289 | #endif |
295 | #endif |
… | |
… | |
511 | coro_derive_padlist (pTHX_ CV *cv) |
517 | coro_derive_padlist (pTHX_ CV *cv) |
512 | { |
518 | { |
513 | PADLIST *padlist = CvPADLIST (cv); |
519 | PADLIST *padlist = CvPADLIST (cv); |
514 | PADLIST *newpadlist; |
520 | PADLIST *newpadlist; |
515 | PAD *newpad; |
521 | PAD *newpad; |
516 | PADOFFSET const off = PadlistMAX (padlist) + 1; |
522 | PADOFFSET off = PadlistMAX (padlist) + 1; |
517 | |
523 | |
518 | newPADLIST(newpadlist); |
524 | #if NEWPADAPI |
519 | #if !PERL_VERSION_ATLEAST(5,15,3) |
525 | |
520 | /* Padlists are AvREAL as of 5.15.3. See perl bug #98092 and perl commit 7d953ba. */ |
526 | /* if we had the original CvDEPTH, we might be able to steal the CvDEPTH+1 entry instead */ |
521 | AvREAL_off (newpadlist); |
527 | /* 20131102194744.GA6705@schmorp.de, 20131102195825.2013.qmail@lists-nntp.develooper.com */ |
522 | #endif |
528 | while (!PadlistARRAY (padlist)[off - 1]) |
|
|
529 | --off; |
|
|
530 | |
|
|
531 | Perl_pad_push (aTHX_ padlist, off); |
|
|
532 | |
|
|
533 | newpad = PadlistARRAY (padlist)[off]; |
|
|
534 | PadlistARRAY (padlist)[off] = 0; |
|
|
535 | |
|
|
536 | #else |
|
|
537 | |
523 | #if PERL_VERSION_ATLEAST (5,10,0) |
538 | #if PERL_VERSION_ATLEAST (5,10,0) |
524 | Perl_pad_push (aTHX_ padlist, off); |
539 | Perl_pad_push (aTHX_ padlist, off); |
525 | #else |
540 | #else |
526 | Perl_pad_push (aTHX_ padlist, off, 1); |
541 | Perl_pad_push (aTHX_ padlist, off, 1); |
527 | #endif |
542 | #endif |
|
|
543 | |
528 | newpad = PadlistARRAY (padlist)[off]; |
544 | newpad = PadlistARRAY (padlist)[off]; |
529 | PadlistMAX (padlist) = off - 1; |
545 | PadlistMAX (padlist) = off - 1; |
|
|
546 | |
|
|
547 | #endif |
|
|
548 | |
|
|
549 | newPADLIST (newpadlist); |
|
|
550 | #if !PERL_VERSION_ATLEAST(5,15,3) |
|
|
551 | /* Padlists are AvREAL as of 5.15.3. See perl bug #98092 and perl commit 7d953ba. */ |
|
|
552 | AvREAL_off (newpadlist); |
|
|
553 | #endif |
530 | |
554 | |
531 | /* Already extended to 2 elements by newPADLIST. */ |
555 | /* Already extended to 2 elements by newPADLIST. */ |
532 | PadlistMAX (newpadlist) = 1; |
556 | PadlistMAX (newpadlist) = 1; |
533 | PadlistNAMES (newpadlist) = (PADNAMELIST *)SvREFCNT_inc_NN (PadlistNAMES (padlist)); |
557 | PadlistNAMES (newpadlist) = (PADNAMELIST *)SvREFCNT_inc_NN (PadlistNAMES (padlist)); |
534 | PadlistARRAY (newpadlist)[1] = newpad; |
558 | PadlistARRAY (newpadlist)[1] = newpad; |
… | |
… | |
546 | |
570 | |
547 | while (i > 0) /* special-case index 0 */ |
571 | while (i > 0) /* special-case index 0 */ |
548 | { |
572 | { |
549 | /* we try to be extra-careful here */ |
573 | /* we try to be extra-careful here */ |
550 | PAD *pad = PadlistARRAY (padlist)[i--]; |
574 | PAD *pad = PadlistARRAY (padlist)[i--]; |
|
|
575 | |
|
|
576 | if (pad) |
|
|
577 | { |
551 | I32 j = PadMAX (pad); |
578 | I32 j = PadMAX (pad); |
552 | |
579 | |
553 | while (j >= 0) |
580 | while (j >= 0) |
554 | SvREFCNT_dec (PadARRAY (pad)[j--]); |
581 | SvREFCNT_dec (PadARRAY (pad)[j--]); |
555 | |
582 | |
556 | PadMAX (pad) = -1; |
583 | PadMAX (pad) = -1; |
557 | SvREFCNT_dec (pad); |
584 | SvREFCNT_dec (pad); |
|
|
585 | } |
558 | } |
586 | } |
559 | |
587 | |
560 | SvREFCNT_dec (PadlistNAMES (padlist)); |
588 | SvREFCNT_dec (PadlistNAMES (padlist)); |
561 | |
589 | |
562 | #ifdef NEWPADAPI |
590 | #if NEWPADAPI |
563 | Safefree (PadlistARRAY (padlist)); |
591 | Safefree (PadlistARRAY (padlist)); |
564 | Safefree (padlist); |
592 | Safefree (padlist); |
565 | #else |
593 | #else |
566 | AvFILLp (padlist) = -1; |
594 | AvFILLp (padlist) = -1; |
567 | AvREAL_off (padlist); |
595 | AvREAL_off (padlist); |
… | |
… | |
2095 | { |
2123 | { |
2096 | AV *od = coro->on_destroy; |
2124 | AV *od = coro->on_destroy; |
2097 | |
2125 | |
2098 | if (!od) |
2126 | if (!od) |
2099 | return; |
2127 | return; |
|
|
2128 | |
|
|
2129 | coro->on_destroy = 0; |
|
|
2130 | sv_2mortal ((SV *)od); |
2100 | |
2131 | |
2101 | while (AvFILLp (od) >= 0) |
2132 | while (AvFILLp (od) >= 0) |
2102 | { |
2133 | { |
2103 | SV *cb = sv_2mortal (av_pop (od)); |
2134 | SV *cb = sv_2mortal (av_pop (od)); |
2104 | |
2135 | |
… | |
… | |
3148 | /* it quickly returns */ |
3179 | /* it quickly returns */ |
3149 | if (CORO_THROW) |
3180 | if (CORO_THROW) |
3150 | return 0; |
3181 | return 0; |
3151 | |
3182 | |
3152 | /* one element that is an RV? repeat! */ |
3183 | /* one element that is an RV? repeat! */ |
3153 | if (AvFILLp (state) == 0 && SvROK (AvARRAY (state)[0])) |
3184 | if (AvFILLp (state) == 0 && SvTYPE (AvARRAY (state)[0]) != SVt_PV) |
3154 | return 1; |
3185 | return 1; |
3155 | |
3186 | |
3156 | /* restore status */ |
3187 | /* restore status */ |
3157 | { |
3188 | { |
3158 | SV *data_sv = av_pop (state); |
3189 | SV *data_sv = av_pop (state); |
… | |
… | |
3470 | void |
3501 | void |
3471 | transfer (...) |
3502 | transfer (...) |
3472 | PROTOTYPE: $$ |
3503 | PROTOTYPE: $$ |
3473 | CODE: |
3504 | CODE: |
3474 | CORO_EXECUTE_SLF_XS (slf_init_transfer); |
3505 | CORO_EXECUTE_SLF_XS (slf_init_transfer); |
3475 | |
|
|
3476 | void |
|
|
3477 | _exit (int code) |
|
|
3478 | PROTOTYPE: $ |
|
|
3479 | CODE: |
|
|
3480 | _exit (code); |
|
|
3481 | |
3506 | |
3482 | SV * |
3507 | SV * |
3483 | clone (Coro::State coro) |
3508 | clone (Coro::State coro) |
3484 | CODE: |
3509 | CODE: |
3485 | { |
3510 | { |
… | |
… | |
4237 | { |
4262 | { |
4238 | PL_ppaddr [OP_SSELECT] = coro_old_pp_sselect; |
4263 | PL_ppaddr [OP_SSELECT] = coro_old_pp_sselect; |
4239 | coro_old_pp_sselect = 0; |
4264 | coro_old_pp_sselect = 0; |
4240 | } |
4265 | } |
4241 | |
4266 | |
|
|
4267 | MODULE = Coro::State PACKAGE = Coro::Util |
|
|
4268 | |
|
|
4269 | void |
|
|
4270 | _exit (int code) |
|
|
4271 | CODE: |
|
|
4272 | _exit (code); |
|
|
4273 | |
|
|
4274 | NV |
|
|
4275 | time () |
|
|
4276 | CODE: |
|
|
4277 | RETVAL = nvtime (aTHX); |
|
|
4278 | OUTPUT: |
|
|
4279 | RETVAL |
|
|
4280 | |
|
|
4281 | NV |
|
|
4282 | gettimeofday () |
|
|
4283 | PPCODE: |
|
|
4284 | { |
|
|
4285 | UV tv [2]; |
|
|
4286 | u2time (aTHX_ tv); |
|
|
4287 | EXTEND (SP, 2); |
|
|
4288 | PUSHs (sv_2mortal (newSVuv (tv [0]))); |
|
|
4289 | PUSHs (sv_2mortal (newSVuv (tv [1]))); |
|
|
4290 | } |
|
|
4291 | |