diff -rup Lexical-Var-0.007-F6v6iu/lib/Lexical/Var.xs Lexical-Var-0.007-uRRqJL/lib/Lexical/Var.xs --- Lexical-Var-0.007-F6v6iu/lib/Lexical/Var.xs 2012-02-04 00:58:09.000000000 -0800 +++ Lexical-Var-0.007-uRRqJL/lib/Lexical/Var.xs 2012-10-21 07:03:18.000000000 -0700 @@ -83,6 +83,18 @@ static SV *THX_newSV_type(pTHX_ svtype t # define GV_NOTQUAL 0 #endif /* !GV_NOTQUAL */ +#ifndef PadARRAY +typedef AV PADNAMELIST; +# if PERL_VERSION < 8 || (PERL_VERSION == 8 && !PERL_SUBVERSION) +typedef AV PADLIST; +typedef AV PAD; +# endif +# define PadlistARRAY(pl) ((PAD **)AvARRAY(pl)) +# define PadlistNAMES(pl) (*PadlistARRAY(pl)) +# define PadARRAY AvARRAY +# define PadMAX AvFILLp +#endif + /* * scalar classification * @@ -413,9 +425,10 @@ static U32 THX_pad_max(pTHX) static CV *THX_find_compcv(pTHX_ char const *vari_word) { GV *compgv; - CV *compcv; + CV *compcv = PL_compcv; /* - * Given that we're being invoked from a BEGIN block, + * We're being invoked from a BEGIN + * block. In perl 5.17.4 and earlier, * PL_compcv here doesn't actually point to the sub * being compiled. Instead it points to the BEGIN block. * The code that we want to affect is the parent of that. @@ -424,10 +437,13 @@ static CV *THX_find_compcv(pTHX_ char co * runtime, or it can be non-null in a couple of * other situations (require, string eval). */ - if(!(PL_compcv && CvSPECIAL(PL_compcv) && - (compgv = CvGV(PL_compcv)) && + if(!(compcv && +#if !PERL_VERSION_GE(5,17,5) + CvSPECIAL(compcv) && + (compgv = CvGV(compcv)) && strEQ(GvNAME(compgv), "BEGIN") && - (compcv = CvOUTSIDE(PL_compcv)) && + (compcv = CvOUTSIDE(compcv)) && +#endif CvPADLIST(compcv))) croak("can't set up lexical %s outside compilation", vari_word); @@ -437,15 +453,15 @@ static CV *THX_find_compcv(pTHX_ char co #define setup_pad(compcv, name) THX_setup_pad(aTHX_ compcv, name) static void THX_setup_pad(pTHX_ CV *compcv, char const *name) { - AV *padlist = CvPADLIST(compcv); - AV *padname = (AV*)*av_fetch(padlist, 0, 0); - AV *padvar = (AV*)*av_fetch(padlist, 1, 0); + PADLIST *padlist = CvPADLIST(compcv); + PADNAMELIST *padname = PadlistNAMES(padlist); + PAD *padvar = PadlistARRAY(padlist)[1]; PADOFFSET ouroffset; SV *ourname, *ourvar; HV *stash; - ourvar = *av_fetch(padvar, AvFILLp(padvar) + 1, 1); + ourvar = *av_fetch(padvar, PadMAX(padvar) + 1, 1); SvPADMY_on(ourvar); - ouroffset = AvFILLp(padvar); + ouroffset = PadMAX(padvar); ourname = newSV_type(SVt_PADNAME); sv_setpv(ourname, name); SvPAD_OUR_on(ourname);