This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Stop /(?[\p{...}])/ compilation from leaking
authorFather Chrysostomos <sprout@cpan.org>
Thu, 6 Jun 2013 20:42:32 +0000 (13:42 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Fri, 7 Jun 2013 00:53:22 +0000 (17:53 -0700)
The swash returned by utf8_heavy.pl was not being freed in the code
path to handle returning character classes to the (?[...]) parser
(when ret_invlist is true).

regcomp.c
t/op/svleak.t

index 1812028..f5adebc 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -13724,6 +13724,7 @@ parseit:
 
     if (ret_invlist) {
         *ret_invlist = cp_list;
+        SvREFCNT_dec(swash);
 
         /* Discard the generated node */
         if (SIZE_ONLY) {
index b97a5cb..0fb6b24 100644 (file)
@@ -15,7 +15,7 @@ BEGIN {
 
 use Config;
 
-plan tests => 121;
+plan tests => 122;
 
 # run some code N times. If the number of SVs at the end of loop N is
 # greater than (N-1)*delta at the end of loop 1, we've got a leak
@@ -247,6 +247,7 @@ eleak(2,0,'no warnings; /(?[[a]&[b]])/');
 eleak(2,0,'no warnings; /(?[[a]|[b]])/');
 eleak(2,0,'no warnings; /(?[[a]^[b]])/');
 eleak(2,0,'no warnings; /(?[![a]])/');
+eleak(2,0,'no warnings; /(?[\p{Word}])/');
 
 # These can generate one ref count, but just  once.
 eleak(4,1,'chr(0x100) =~ /[[:punct:]]/');