… | |
… | |
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; |
… | |
… | |
511 | coro_derive_padlist (pTHX_ CV *cv) |
511 | coro_derive_padlist (pTHX_ CV *cv) |
512 | { |
512 | { |
513 | PADLIST *padlist = CvPADLIST (cv); |
513 | PADLIST *padlist = CvPADLIST (cv); |
514 | PADLIST *newpadlist; |
514 | PADLIST *newpadlist; |
515 | PAD *newpad; |
515 | PAD *newpad; |
516 | PADOFFSET const off = PadlistMAX (padlist) + 1; |
516 | PADOFFSET off = PadlistMAX (padlist) + 1; |
517 | |
517 | |
518 | newPADLIST(newpadlist); |
518 | #if NEWPADAPI |
519 | #if !PERL_VERSION_ATLEAST(5,15,3) |
519 | |
520 | /* Padlists are AvREAL as of 5.15.3. See perl bug #98092 and perl commit 7d953ba. */ |
520 | while (!PadlistARRAY (padlist)[off - 1]) |
521 | AvREAL_off (newpadlist); |
521 | --off; |
522 | #endif |
522 | |
|
|
523 | Perl_pad_push (aTHX_ padlist, off); |
|
|
524 | |
|
|
525 | newpad = PadlistARRAY (padlist)[off]; |
|
|
526 | PadlistARRAY (padlist)[off] = 0; |
|
|
527 | |
|
|
528 | #else |
|
|
529 | |
523 | #if PERL_VERSION_ATLEAST (5,10,0) |
530 | #if PERL_VERSION_ATLEAST (5,10,0) |
524 | Perl_pad_push (aTHX_ padlist, off); |
531 | Perl_pad_push (aTHX_ padlist, off); |
525 | #else |
532 | #else |
526 | Perl_pad_push (aTHX_ padlist, off, 1); |
533 | Perl_pad_push (aTHX_ padlist, off, 1); |
527 | #endif |
534 | #endif |
|
|
535 | |
528 | newpad = PadlistARRAY (padlist)[off]; |
536 | newpad = PadlistARRAY (padlist)[off]; |
529 | PadlistMAX (padlist) = off - 1; |
537 | PadlistMAX (padlist) = off - 1; |
|
|
538 | |
|
|
539 | #endif |
|
|
540 | |
|
|
541 | newPADLIST (newpadlist); |
|
|
542 | #if !PERL_VERSION_ATLEAST(5,15,3) |
|
|
543 | /* Padlists are AvREAL as of 5.15.3. See perl bug #98092 and perl commit 7d953ba. */ |
|
|
544 | AvREAL_off (newpadlist); |
|
|
545 | #endif |
530 | |
546 | |
531 | /* Already extended to 2 elements by newPADLIST. */ |
547 | /* Already extended to 2 elements by newPADLIST. */ |
532 | PadlistMAX (newpadlist) = 1; |
548 | PadlistMAX (newpadlist) = 1; |
533 | PadlistNAMES (newpadlist) = (PADNAMELIST *)SvREFCNT_inc_NN (PadlistNAMES (padlist)); |
549 | PadlistNAMES (newpadlist) = (PADNAMELIST *)SvREFCNT_inc_NN (PadlistNAMES (padlist)); |
534 | PadlistARRAY (newpadlist)[1] = newpad; |
550 | PadlistARRAY (newpadlist)[1] = newpad; |
… | |
… | |
557 | SvREFCNT_dec (pad); |
573 | SvREFCNT_dec (pad); |
558 | } |
574 | } |
559 | |
575 | |
560 | SvREFCNT_dec (PadlistNAMES (padlist)); |
576 | SvREFCNT_dec (PadlistNAMES (padlist)); |
561 | |
577 | |
562 | #ifdef NEWPADAPI |
578 | #if NEWPADAPI |
563 | Safefree (PadlistARRAY (padlist)); |
579 | Safefree (PadlistARRAY (padlist)); |
564 | Safefree (padlist); |
580 | Safefree (padlist); |
565 | #else |
581 | #else |
566 | AvFILLp (padlist) = -1; |
582 | AvFILLp (padlist) = -1; |
567 | AvREAL_off (padlist); |
583 | AvREAL_off (padlist); |