This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
fix ord of upgraded empty string
authorZefram <zefram@fysh.org>
Fri, 27 Jan 2017 05:53:22 +0000 (05:53 +0000)
committerZefram <zefram@fysh.org>
Fri, 27 Jan 2017 05:53:22 +0000 (05:53 +0000)
pp_ord fell foul of the new API stricture added by
d1f8d421df731c77beff3db92d27dc6ec28589f2.  Change it to avoid calling
utf8n_to_uvchr() on an empty string.  Fixes [perl #130545].

pp.c
t/op/ord.t

diff --git a/pp.c b/pp.c
index 657abf7..3e6b891 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -3626,7 +3626,7 @@ PP(pp_ord)
     const U8 *s = (U8*)SvPV_const(argsv, len);
 
     SETu(DO_UTF8(argsv)
-           ? utf8n_to_uvchr(s, len, 0, UTF8_ALLOW_ANYUV)
+           ? (len ? utf8n_to_uvchr(s, len, 0, UTF8_ALLOW_ANYUV) : 0)
            : (UV)(*s));
 
     return NORMAL;
index deb0880..5776755 100644 (file)
@@ -6,7 +6,7 @@ BEGIN {
     set_up_inc(qw(. ../lib)); # ../lib needed for test.deparse
 }
 
-plan tests => 35;
+plan tests => 38;
 
 # compile time evaluation
 
@@ -66,3 +66,9 @@ is(ord($x), 0x1234, 'runtime ord \x{....}');
     is(ord(chr(0x1FFFFF)), 0x1FFFFF, 'last four-byte char in UTF-8');
     is(ord(chr(0x200000)), 0x200000, 'first five-byte char in UTF-8');
 }
+
+is(ord(""), 0, "ord of literal empty string");
+is(ord(do { my $x = ""; utf8::downgrade($x); $x }), 0,
+    "ord of downgraded empty string");
+is(ord(do { my $x = ""; utf8::upgrade($x); $x }), 0,
+    "ord of upgraded empty string");