Control: tag -1 patch
Control: forwarded -1 https://rt.cpan.org/Public/Bug/Display.html?id=110623

On Fri, Dec 25, 2015 at 11:00:18AM +0200, Niko Tyni wrote:

>   use Devel::CallParser;
>   
>   sub f {
>     my $arg = shift;
>   
>     { my $arg; } # ???
>     print $arg ? "ok\n" : "not ok\n";
>   }
>   
>   f(1);
>  
> which gives "ok" on 5.20 and "not ok" on 5.22.

Patch attached, sent upstream in
 https://rt.cpan.org/Public/Bug/Display.html?id=110623

Will upload shortly.
-- 
Niko Tyni   nt...@debian.org
>From ba92f4cba247c91d100e05f2b83dd093055e462b Mon Sep 17 00:00:00 2001
From: Niko Tyni <nt...@debian.org>
Date: Fri, 25 Dec 2015 18:53:08 +0200
Subject: [PATCH] Fix a pad problem with Perl >= 5.21.4 on threaded builds

This broke at least the Kavorka and Moops distributions.

Bug-Debian: https://bugs.debian.org/808826
Bug: https://rt.cpan.org/Public/Bug/Display.html?id=110623
---
 lib/Devel/CallParser.xs | 10 +++++++---
 t/pad2.t                | 15 +++++++++++++++
 2 files changed, 22 insertions(+), 3 deletions(-)
 create mode 100644 t/pad2.t

diff --git a/lib/Devel/CallParser.xs b/lib/Devel/CallParser.xs
index 6643739..847742c 100644
--- a/lib/Devel/CallParser.xs
+++ b/lib/Devel/CallParser.xs
@@ -323,10 +323,14 @@ static int my_keyword_plugin(pTHX_
 	 * The core bug was supposedly fixed in Perl 5.19.4, but actually
 	 * that version exhibits a different bug also apparently related
 	 * to padrange.  Restoring the pad's fill pointer works around
-	 * this bug too.  So for now this workaround is used with no
-	 * upper bound on the Perl version.
+	 * this bug too.
+	 *
+	 * The other padrange bug was fixed in Perl 5.19.5 (commit aa033da),
+	 * so the workaround is no longer needed after that, but it remains
+	 * harmless until v5.21.4 (commit c9859fb)  where it starts breaking
+	 * (see t/pad2.t.)
 	 */
-#define MUST_RESTORE_PAD_FILL PERL_VERSION_GE(5,17,6)
+#define MUST_RESTORE_PAD_FILL PERL_VERSION_GE(5,17,6) && ! PERL_VERSION_GE(5,19,5)
 #if MUST_RESTORE_PAD_FILL
 	I32 padfill = av_len(PL_comppad);
 #endif /* MUST_RESTORE_PAD_FILL */
diff --git a/t/pad2.t b/t/pad2.t
new file mode 100644
index 0000000..92c6dab
--- /dev/null
+++ b/t/pad2.t
@@ -0,0 +1,15 @@
+use warnings;
+use strict;
+
+use Test::More tests => 1;
+
+use Devel::CallParser;
+
+sub f {
+  my $arg = shift;
+
+  { my $arg; } # ???
+  ok($arg, '$arg stays set after a "my $arg" block');
+}
+
+f(1);
-- 
2.6.4

Reply via email to