diff options
author | Father Chrysostomos <sprout@cpan.org> | 2011-10-29 19:56:18 -0700 |
---|---|---|
committer | Father Chrysostomos <sprout@cpan.org> | 2011-11-06 01:13:46 -0700 |
commit | f1c31c527b5fd97a0d6c39c815e40a37674881ca (patch) | |
tree | 35237861fdc41cd644f21efaf6f146c3cfc0d54c | |
parent | cc7b5b23f454a503cb20d27859ae5c49d0a911e3 (diff) | |
download | perl-f1c31c527b5fd97a0d6c39c815e40a37674881ca.tar.gz |
Forbid source filters in Unicode evals
Source filters have always been byte-level filters. Therefore they
don’t make sense on Unicode strings, unless we are planning to add
new APIs to support it. Until then, croak.
-rw-r--r-- | ext/XS-APItest/t/eval-filter.t | 11 | ||||
-rw-r--r-- | pod/perldiag.pod | 7 | ||||
-rw-r--r-- | toke.c | 3 |
3 files changed, 20 insertions, 1 deletions
diff --git a/ext/XS-APItest/t/eval-filter.t b/ext/XS-APItest/t/eval-filter.t index 8d370e59a7..d4a9153613 100644 --- a/ext/XS-APItest/t/eval-filter.t +++ b/ext/XS-APItest/t/eval-filter.t @@ -1,9 +1,18 @@ #!perl -w use strict; -use Test::More tests => 1; +use Test::More tests => 3; use XS::APItest; +{ + use feature "unicode_eval"; + my $unfiltered_foo = "foo"; + eval "BEGIN { filter() }"; + like $@, qr/^Source filters apply only to byte streams at /, + 'filters die under unicode_eval'; + is "foo", $unfiltered_foo, 'filters leak not out of unicode evals'; +} + BEGIN { eval "BEGIN{ filter() }" } is "foo", "fee", "evals share filters with the currently compiling scope"; diff --git a/pod/perldiag.pod b/pod/perldiag.pod index a477db85d2..20ee6415bd 100644 --- a/pod/perldiag.pod +++ b/pod/perldiag.pod @@ -4334,6 +4334,13 @@ But before sort was a keyword, people sometimes used it as a filehandle. (F) A sort comparison subroutine may not return a list value with more or less than one element. See L<perlfunc/sort>. +=item Source filters apply only to byte streams + +(F) You tried to activate a source filter (usually by loading a +source filter module) within a string passed to C<eval>. This is +not permitted under the C<unicode_eval> feature. Consider using +C<evalbytes> instead. See L<feature>. + =item splice() offset past end of array (W misc) You attempted to specify an offset that was past the end of @@ -3839,6 +3839,9 @@ Perl_filter_add(pTHX_ filter_t funcp, SV *datasv) if (!PL_parser) return NULL; + if (PL_parser->lex_flags & LEX_IGNORE_UTF8_HINTS) + Perl_croak(aTHX_ "Source filters apply only to byte streams"); + if (!PL_rsfp_filters) PL_rsfp_filters = newAV(); if (!datasv) |