pp_length should stringify before checking DO_UTF8
authorFather Chrysostomos <sprout@cpan.org>
Fri, 28 Sep 2012 20:44:48 +0000 (13:44 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 1 Oct 2012 19:51:55 +0000 (12:51 -0700)
Typeglobs and references can change their UTF8ness upon string-
ification.

pp.c
t/op/length.t

index b57ee84..eef9483 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -2916,7 +2916,7 @@ PP(pp_length)
            SETi(len);
     } else if (SvOK(sv)) {
        /* Neither magic nor overloaded.  */
-       if (DO_UTF8(sv))
+       if (!IN_BYTES)
            SETi(sv_len_utf8(sv));
        else
            SETi(sv_len(sv));
index 55260d3..dffc583 100644 (file)
@@ -6,7 +6,7 @@ BEGIN {
     @INC = '../lib';
 }
 
-plan (tests => 38);
+plan (tests => 39);
 
 print "not " unless length("")    == 0;
 print "ok 1\n";
@@ -231,4 +231,10 @@ is($ul, undef, "Assigned length of overloaded undef with result in TARG");
     eval ' sub { length my @forecasts } ';
 }
 
+# length could be fooled by UTF8ness of non-magical variables changing with
+# stringification.
+my $ref = [];
+bless $ref, "\x{100}";
+is length $ref, length "$ref", 'length on reference blessed to utf8 class';
+
 is($warnings, 0, "There were no other warnings");