This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #97478] Make ‘Can’t find opnumber’ UTF-8- and null-clean
authorFather Chrysostomos <sprout@cpan.org>
Sun, 22 Apr 2012 02:12:21 +0000 (19:12 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Tue, 29 May 2012 16:41:14 +0000 (09:41 -0700)
pp.c
t/comp/proto.t

diff --git a/pp.c b/pp.c
index 908d16d..4858d99 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -439,7 +439,10 @@ PP(pp_prototype)
        if (strnEQ(s, "CORE::", 6)) {
            const int code = keyword(s + 6, SvCUR(TOPs) - 6, 1);
            if (!code || code == -KEY_CORE)
-               DIE(aTHX_ "Can't find an opnumber for \"%s\"", s+6);
+               DIE(aTHX_ "Can't find an opnumber for \"%"SVf"\"",
+                   SVfARG(newSVpvn_flags(
+                       s+6, SvCUR(TOPs)-6, SvFLAGS(TOPs) & SVf_UTF8
+                   )));
            {
                SV * const sv = core_prototype(NULL, s + 6, code, NULL);
                if (sv) ret = sv;
index 04fea69..8e9821f 100644 (file)
@@ -18,7 +18,7 @@ BEGIN {
 # strict
 use strict;
 
-print "1..177\n";
+print "1..179\n";
 
 my $i = 1;
 
@@ -413,6 +413,16 @@ print "# CORE:Foo => ($p), \$@ => '$@'\nnot "
     if defined ($p = eval { prototype('CORE::Foo') or 1 }) or $@ !~ /^Can't find an opnumber/;
 print "ok ", $i++, "\n";
 
+eval { prototype("CORE::a\0b") };
+print "# CORE::a\\0b: \$@ => '$@'\nnot " 
+    if $@ !~ /^Can't find an opnumber for "a\0b"/;
+print "ok ", $i++, "\n";
+
+eval { prototype("CORE::\x{100}") };
+print "# CORE::\\x{100}: => ($p), \$@ => '$@'\nnot " 
+    if $@ !~ /^Can't find an opnumber for "\x{100}"/;
+print "ok ", $i++, "\n";
+
 # correctly note too-short parameter lists that don't end with '$',
 #  a possible regression.