Handle cow $_ in @INC filter
authorFather Chrysostomos <sprout@cpan.org>
Sat, 13 Oct 2012 05:29:04 +0000 (22:29 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sat, 13 Oct 2012 05:55:59 +0000 (22:55 -0700)
Setting $_ to a copy-on-write scalar in an @INC filter causes the
parser to modify every other scalar sharing the same string buffer.
It needs to be forced to a regular scalar before the parser sees it.

pp_ctl.c
t/op/incfilter.t

index 23847c4..1aaa261 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -5383,6 +5383,7 @@ S_run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen)
        LEAVE_with_name("call_filter_sub");
     }
 
+    if (SvIsCOW(upstream)) sv_force_normal(upstream);
     if(!err && SvOK(upstream)) {
        got_p = SvPV(upstream, got_len);
        if (umaxlen) {
index 582b691..6227c4a 100644 (file)
@@ -13,7 +13,7 @@ use strict;
 use Config;
 use Filter::Util::Call;
 
-plan(tests => 144);
+plan(tests => 145);
 
 unshift @INC, sub {
     no warnings 'uninitialized';
@@ -216,6 +216,11 @@ do [\'pa', \&generator_with_state,
      "pass('And return multiple lines');\n",
     ]] or die;
 
+@origlines = keys %{{ "1\n+\n2\n" => 1 }};
+@lines = @origlines;
+do \&generator or die;
+is $origlines[0], "1\n+\n2\n", 'ink filters do not mangle cow buffers';
+
 # d8723a6a74b2c12e wasn't perfect, as the char * returned by SvPV*() can be
 # a temporary, freed at the next FREETMPS. And there is a FREETMPS in
 # pp_require