Blob Blame History Raw
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);