This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix my constant $var utf8 confusion
authorFather Chrysostomos <sprout@cpan.org>
Fri, 5 Sep 2014 20:53:00 +0000 (13:53 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Fri, 5 Sep 2014 21:16:54 +0000 (14:16 -0700)
‘my some_constant $var’ tries to resolve some_constant to a package
name and then look that up, but, when using the value of the constant
to do a stash lookup, it was applying the utf8 flag if ‘use utf8’ was
in scope, even if the constant wasn’t utf8:

$ ./perl -Ilib -e 'use constant foo=>qq|\xc4\xb5|; BEGIN{${"\xc4\xb5::foo"}}; my foo $dog; print "ok\n"'
ok
$ ./perl -Ilib -e 'use constant foo=>qq|\xc4\xb5|; BEGIN{${"\xc4\xb5::foo"}}; use utf8; my foo $dog; print "ok\n"'
No such class foo at -e line 1, near "; my foo"
Execution of -e aborted due to compilation errors.

t/uni/lex_utf8.t
toke.c

index d6c6261..b66c2d9 100644 (file)
@@ -14,7 +14,7 @@ BEGIN {
 
 use strict;
 
-plan (tests => 15);
+plan (tests => 16);
 use charnames ':full';
 
 use utf8;
@@ -61,5 +61,10 @@ eval 'tr νaνbν';
 is $@, "", 'y/// compiles, where / is actually a wide character';
 is $_, "b", 'transliteration worked';
 
+use constant foofoo=>qq|\xc4\xb5|;
+{ no strict; ()=${"\xc4\xb5::foo"} } # vivify Äµ package
+eval 'my foofoo $dog'; # foofoo was resolving to ĵ, not Äµ
+is $@, '', 'my constant $var in utf8 scope where constant is not utf8';
+
 __END__
 
diff --git a/toke.c b/toke.c
index 4d33472..b98fe6f 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -4128,7 +4128,7 @@ S_find_in_my_stash(pTHX_ const char *pkgname, STRLEN len)
     if (gv && GvCV(gv)) {
        SV * const sv = cv_const_sv(GvCV(gv));
        if (sv)
-            pkgname = SvPV_const(sv, len);
+           return gv_stashsv(sv, 0);
     }
 
     return gv_stashpvn(pkgname, len, UTF ? SVf_UTF8 : 0);