Change 18567 by jhi@kosh on 2003/01/22 18:37:55

        Integrate:
        [ 18545]
        Subject: [PATCH perl-current] AUTHORS correction
        From: Richard Soderberg <[EMAIL PROTECTED]>
        Date: Wed, 22 Jan 2003 02:08:13 -0500
        Message-Id: <[EMAIL PROTECTED]>
        
        [ 18552]
        Subject: [PATCH] assert PV isn't RV
        From: Nicholas Clark <[EMAIL PROTECTED]>
        Date: Fri, 17 Jan 2003 19:40:45 +0000
        Message-ID: <[EMAIL PROTECTED]>
        
        [ 18553]
        Subject: Term::Complete problem + fix (Was: Re: muttprofile + perl 5.8)
        From: Martti Rahkila <[EMAIL PROTECTED]>
        Date: Sat, 18 Jan 2003 00:25:39 +0200
        Message-ID: <[EMAIL PROTECTED]>
        
        (chose the 'even safer' version)
        
        [ 18554]
        Subject: [PATCH av.c] Re: [perl #15439] unreferenced scalar due to double 
DESTROY
        From: Dave Mitchell <[EMAIL PROTECTED]>
        Date: Sun, 19 Jan 2003 16:43:54 +0000
        Message-ID: <[EMAIL PROTECTED]>
        
        [ 18556]
        Subject: [PATCH perlio.h] (was RE: [PATCH] %_ (was Re: [PATCH] operation on 
`PL_na' may be undefined))
        From: Robin Barker <[EMAIL PROTECTED]>
        Date: Mon, 20 Jan 2003 15:26:21 -0000
        Message-ID: <[EMAIL PROTECTED]>
        
        [ 18559]
        Upgrade to Encode 1.86.

Affected files ...

... //depot/maint-5.8/perl/AUTHORS#3 integrate
... //depot/maint-5.8/perl/av.c#7 integrate
... //depot/maint-5.8/perl/dump.c#8 integrate
... //depot/maint-5.8/perl/ext/Encode/Changes#5 integrate
... //depot/maint-5.8/perl/ext/Encode/Encode.pm#5 integrate
... //depot/maint-5.8/perl/ext/Encode/MANIFEST#5 integrate
... //depot/maint-5.8/perl/ext/Encode/Unicode/Unicode.xs#3 integrate
... //depot/maint-5.8/perl/ext/Encode/encoding.pm#4 integrate
... //depot/maint-5.8/perl/ext/Encode/t/enc_eucjp.t#2 integrate
... //depot/maint-5.8/perl/ext/Encode/t/enc_utf8.t#2 integrate
... //depot/maint-5.8/perl/lib/Term/Complete.pm#3 integrate
... //depot/maint-5.8/perl/perlio.h#2 integrate
... //depot/maint-5.8/perl/sv.h#8 integrate
... //depot/maint-5.8/perl/t/op/array.t#2 integrate

Differences ...

==== //depot/maint-5.8/perl/AUTHORS#3 (text) ====
Index: perl/AUTHORS
--- perl/AUTHORS#2~18080~       Sun Nov  3 21:23:04 2002
+++ perl/AUTHORS        Wed Jan 22 10:37:55 2003
@@ -131,7 +131,6 @@
 Colin Watson                   <[EMAIL PROTECTED]>
 Conrad Augustin
 Conrad E. Kimball              <[EMAIL PROTECTED]>
-Coral                          <[EMAIL PROTECTED]>
 Craig A. Berry                 <[EMAIL PROTECTED]>
 Craig Milo Rogers              <[EMAIL PROTECTED]>
 Curtis Poe                     <[EMAIL PROTECTED]>

==== //depot/maint-5.8/perl/av.c#7 (text) ====
Index: perl/av.c
--- perl/av.c#6~18208~  Thu Nov 28 08:57:01 2002
+++ perl/av.c   Wed Jan 22 10:37:55 2003
@@ -453,8 +453,11 @@
        ary = AvARRAY(av);
        key = AvFILLp(av) + 1;
        while (key) {
-           SvREFCNT_dec(ary[--key]);
+           SV * sv = ary[--key];
+           /* undef the slot before freeing the value, because a
+            * destructor might try to modify this arrray */
            ary[key] = &PL_sv_undef;
+           SvREFCNT_dec(sv);
        }
     }
     if ((key = AvARRAY(av) - AvALLOC(av))) {

==== //depot/maint-5.8/perl/dump.c#8 (text) ====
Index: perl/dump.c
--- perl/dump.c#7~18387~        Wed Jan  1 17:39:31 2003
+++ perl/dump.c Wed Jan 22 10:37:55 2003
@@ -194,10 +194,22 @@
        sv_catpv(t, "(");
        unref++;
     }
-    else if (DEBUG_R_TEST_ && SvREFCNT(sv) > 1) {
-       Perl_sv_catpvf(aTHX_ t, "<%"UVuf">", (UV)SvREFCNT(sv));
+    else if (DEBUG_R_TEST_) {
+       int is_tmp = 0;
+       I32 ix;
+       /* is this SV on the tmps stack? */
+       for (ix=PL_tmps_ix; ix>=0; ix--) {
+           if (PL_tmps_stack[ix] == sv) {
+               is_tmp = 1;
+               break;
+           }
+       }
+       if (SvREFCNT(sv) > 1)
+           Perl_sv_catpvf(aTHX_ t, "<%"UVuf"%s>", (UV)SvREFCNT(sv),
+                   is_tmp ? "T" : "");
+       else if (is_tmp)
+           sv_catpv(t, "<T>");
     }
-
 
     if (SvROK(sv)) {
        sv_catpv(t, "\\");

==== //depot/maint-5.8/perl/ext/Encode/Changes#5 (text) ====
Index: perl/ext/Encode/Changes
--- perl/ext/Encode/Changes#4~18503~    Thu Jan 16 15:29:57 2003
+++ perl/ext/Encode/Changes     Wed Jan 22 10:37:55 2003
@@ -1,9 +1,25 @@
 # Revision history for Perl extension Encode.
 #
-# $Id: Changes,v 1.84 2003/01/10 12:00:16 dankogai Exp dankogai $
+# $Id: Changes,v 1.86 2003/01/22 03:29:07 dankogai Exp $
 #
 
-$Revision: 1.84 $ $Date: 2003/01/10 12:00:16 $
+$Revision: 1.86 $ $Date: 2003/01/22 03:29:07 $
+! encoding.pm
+  * Don't forget to canonize when you attempt an exact match!
+  Message-Id: <[EMAIL PROTECTED]>
+  * ${^ENCODING} exception is off for $] > 5.008
+  Message-Id: <[EMAIL PROTECTED]>
+! t/enc_utf8.t
+  $] check commented out so it runs on 5.8.0
+  
+1.85 2003/01/21 22:19:14
+! encoding.pm
+  ${^ENCODING} exception is now explicit rather than handled by regex.
++ t/enc_eucjp.t t/enc_utf8.t
+  Test suite for the better "encoding" pragma support for bleedperl.
+  On 5.8.0, they will just be skipped.
+
+1.84 2003/01/10 12:00:16
 ! encoding.pm
   ${^ENCODING} is no longer set for utf so encoding is no longer fun :)
   (That is to prevent duplicate encoding first by IO then ${^ENCODING})

==== //depot/maint-5.8/perl/ext/Encode/Encode.pm#5 (text) ====
Index: perl/ext/Encode/Encode.pm
--- perl/ext/Encode/Encode.pm#4~18503~  Thu Jan 16 15:29:57 2003
+++ perl/ext/Encode/Encode.pm   Wed Jan 22 10:37:55 2003
@@ -1,9 +1,9 @@
 #
-# $Id: Encode.pm,v 1.84 2003/01/10 12:00:16 dankogai Exp dankogai $
+# $Id: Encode.pm,v 1.86 2003/01/22 03:30:40 dankogai Exp $
 #
 package Encode;
 use strict;
-our $VERSION = do { my @r = (q$Revision: 1.84 $ =~ /\d+/g); sprintf "%d."."%02d" x 
$#r, @r };
+our $VERSION = do { my @r = (q$Revision: 1.86 $ =~ /\d+/g); sprintf "%d."."%02d" x 
+$#r, @r };
 our $DEBUG = 0;
 use XSLoader ();
 XSLoader::load(__PACKAGE__, $VERSION);

==== //depot/maint-5.8/perl/ext/Encode/Unicode/Unicode.xs#3 (text) ====
Index: perl/ext/Encode/Unicode/Unicode.xs
--- perl/ext/Encode/Unicode/Unicode.xs#2~18503~ Thu Jan 16 15:29:57 2003
+++ perl/ext/Encode/Unicode/Unicode.xs  Wed Jan 22 10:37:55 2003
@@ -1,5 +1,5 @@
 /*
- $Id: Unicode.xs,v 1.6 2003/01/10 12:00:16 dankogai Exp dankogai $
+ $Id: Unicode.xs,v 1.6 2003/01/10 12:00:16 dankogai Exp $
  */
 
 #define PERL_NO_GET_CONTEXT

==== //depot/maint-5.8/perl/ext/Encode/encoding.pm#4 (text) ====
Index: perl/ext/Encode/encoding.pm
--- perl/ext/Encode/encoding.pm#3~18503~        Thu Jan 16 15:29:57 2003
+++ perl/ext/Encode/encoding.pm Wed Jan 22 10:37:55 2003
@@ -1,5 +1,5 @@
 package encoding;
-our $VERSION = do { my @r = (q$Revision: 1.38 $ =~ /\d+/g); sprintf "%d."."%02d" x 
$#r, @r };
+our $VERSION = do { my @r = (q$Revision: 1.40 $ =~ /\d+/g); sprintf "%d."."%02d" x 
+$#r, @r };
 
 use Encode;
 use strict;
@@ -17,6 +17,9 @@
     $HAS_PERLIO = (PerlIO::encoding->VERSION >= 0.02);
 }
 
+my %utfs = map {$_=>1}
+    qw(utf8 UCS-2BE UCS-2LE UTF-16 UTF-16BE UTF-16LE UTF-32 UTF-32BE UTF-32LE);
+
 sub import {
     my $class = shift;
     my $name  = shift;
@@ -28,8 +31,9 @@
        require Carp;
        Carp::croak("Unknown encoding '$name'");
     }
+    $name = $enc->name; # canonize
     unless ($arg{Filter}) {
-       ${^ENCODING} = $enc;
+       ${^ENCODING} = $enc unless $] <= 5.008 and $utfs{$name};
        $HAS_PERLIO or return 1;
        for my $h (qw(STDIN STDOUT)){
            if ($arg{$h}){

==== //depot/maint-5.8/perl/ext/Encode/t/enc_eucjp.t#2 (text) ====
Index: perl/ext/Encode/t/enc_eucjp.t
--- perl/ext/Encode/t/enc_eucjp.t#1~18503~      Thu Jan 16 15:29:57 2003
+++ perl/ext/Encode/t/enc_eucjp.t       Wed Jan 22 10:37:55 2003
@@ -1,7 +1,12 @@
+# $Id: enc_eucjp.t,v 1.1 2003/01/21 22:19:14 dankogai Exp $
 # This is the twin of enc_utf8.t, the only difference is that
 # this has "use encoding 'euc-jp'".
 
 BEGIN {
+    if ($] <= 5.008){
+       print "1..0 # Skip: Perl 5.8.1 or later required\n";
+       exit 0;
+    }
     require Config; import Config;
     if ($Config{'extensions'} !~ /\bEncode\b/) {
       print "1..0 # Skip: Encode was not built\n";
@@ -30,6 +35,7 @@
   open(F, ">f$i") or die "$0: failed to open 'f$i' for writing: $!";
   binmode(F, ":utf8");
   print F chr($c[$i]);
+  print F pack("C" => $c[$i]);
   close F;
 }
 

==== //depot/maint-5.8/perl/ext/Encode/t/enc_utf8.t#2 (text) ====
Index: perl/ext/Encode/t/enc_utf8.t
--- perl/ext/Encode/t/enc_utf8.t#1~18503~       Thu Jan 16 15:29:57 2003
+++ perl/ext/Encode/t/enc_utf8.t        Wed Jan 22 10:37:55 2003
@@ -1,7 +1,12 @@
+# $Id: enc_utf8.t,v 1.2 2003/01/22 03:29:07 dankogai Exp $
 # This is the twin of enc_eucjp.t, the only difference is that
 # this has "use encoding 'utf8'".
 
 BEGIN {
+#     if ($] <= 5.008){
+#      print "1..0 # Skip: Perl 5.8.1 or later required\n";
+#      exit 0;
+#     }
     require Config; import Config;
     if ($Config{'extensions'} !~ /\bEncode\b/) {
       print "1..0 # Skip: Encode was not built\n";
@@ -40,7 +45,7 @@
   binmode(F, ":utf8");
   my $c = <F>;
   my $o = ord($c);
-  print $o == $c[$i] ? "ok $t - utf8 I/O $c[$i]\n" : "not ok $t - utf8 I/O $c[$$i]: 
$o != $c[$i]\n";
+  print $o == $c[$i] ? "ok $t - utf8 I/O $c[$i]\n" : "not ok $t - utf8 I/O $c[$i]: $o 
+!= $c[$i]\n";
   $t++;
 }
 

==== //depot/maint-5.8/perl/lib/Term/Complete.pm#3 (text) ====
Index: perl/lib/Term/Complete.pm
--- perl/lib/Term/Complete.pm#2~18347~  Sun Dec 22 22:37:31 2002
+++ perl/lib/Term/Complete.pm   Wed Jan 22 10:37:55 2003
@@ -5,7 +5,7 @@
 use strict;
 our @ISA = qw(Exporter);
 our @EXPORT = qw(Complete);
-our $VERSION = '1.4';
+our $VERSION = '1.401';
 
 #      @(#)complete.pl,v1.2            ([EMAIL PROTECTED]) 09/23/91
 
@@ -66,7 +66,7 @@
 
 =cut
 
-our($complete, $kill, $erase1, $erase2, $tty_raw_noecho, $tty_restore, $stty);
+our($complete, $kill, $erase1, $erase2, $tty_raw_noecho, $tty_restore, $stty, 
+$tty_safe_restore);
 our($tty_saved_state) = '';
 CONFIG: {
     $complete = "\004";
@@ -77,6 +77,7 @@
        if (-x $s) {
            $tty_raw_noecho = "$s raw -echo";
            $tty_restore    = "$s -raw echo";
+           $tty_safe_restore = $tty_restore;
            $stty = $s;
            last;
        }
@@ -106,8 +107,8 @@
            $tty_saved_state = undef;
        }
        else {
-           chomp $tty_saved_state;
-           $tty_restore = qq($stty "$tty_saved_state");
+           $tty_saved_state =~ s/\s+$//g;
+           $tty_restore = qq($stty "$tty_saved_state" 2>/dev/null);
        }
     }
     system $tty_raw_noecho if defined $tty_raw_noecho;
@@ -169,10 +170,18 @@
             }
         }
     }
-    system $tty_restore if defined $tty_restore;
+
+    # system $tty_restore if defined $tty_restore;
+    if (defined $tty_saved_state && defined $tty_restore && defined $tty_safe_restore)
+    {
+       system $tty_restore;
+       if ($?) {
+           # tty_restore caused error
+           system $tty_safe_restore;
+       }
+    }
     print("\n");
     $return;
 }
 
 1;
-

==== //depot/maint-5.8/perl/perlio.h#2 (text) ====
Index: perl/perlio.h
--- perl/perlio.h#1~17645~      Fri Jul 19 12:29:57 2002
+++ perl/perlio.h       Wed Jan 22 10:37:55 2003
@@ -206,7 +206,10 @@
 #endif
 #ifndef PerlIO_stdoutf
 extern int PerlIO_stdoutf(const char *, ...)
-    __attribute__ ((__format__(__printf__, 1, 2)));
+#ifdef CHECK_FORMAT
+    __attribute__ ((__format__(__printf__, 1, 2)))
+#endif
+;
 #endif
 #ifndef PerlIO_puts
 extern int PerlIO_puts(PerlIO *, const char *);
@@ -266,11 +269,17 @@
 #endif
 #ifndef PerlIO_printf
 extern int PerlIO_printf(PerlIO *, const char *, ...)
-    __attribute__ ((__format__(__printf__, 2, 3)));
+#ifdef CHECK_FORMAT
+    __attribute__ ((__format__(__printf__, 2, 3)))
+#endif
+;
 #endif
 #ifndef PerlIO_sprintf
 extern int PerlIO_sprintf(char *, int, const char *, ...)
-    __attribute__ ((__format__(__printf__, 3, 4)));
+#ifdef CHECK_FORMAT
+    __attribute__ ((__format__(__printf__, 3, 4)))
+#endif
+;
 #endif
 #ifndef PerlIO_vprintf
 extern int PerlIO_vprintf(PerlIO *, const char *, va_list);

==== //depot/maint-5.8/perl/sv.h#8 (text) ====
Index: perl/sv.h
--- perl/sv.h#7~18503~  Thu Jan 16 15:29:57 2003
+++ perl/sv.h   Wed Jan 22 10:37:55 2003
@@ -546,11 +546,19 @@
 #define SvNIOK_off(sv)         (SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK| \
                                                  SVp_IOK|SVp_NOK|SVf_IVisUV))
 
+#ifdef __GNUC__
+#define assert_not_ROK(sv)     ({assert(!SvROK(sv) || !SvRV(sv))})
+#else
+#define assert_not_ROK(sv)     0
+#endif
+
 #define SvOK(sv)               (SvFLAGS(sv) & SVf_OK)
-#define SvOK_off(sv)           (SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC|    \
+#define SvOK_off(sv)           (assert_not_ROK(sv),                    \
+                                SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC|    \
                                                  SVf_IVisUV|SVf_UTF8), \
                                                        SvOOK_off(sv))
-#define SvOK_off_exc_UV(sv)    (SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC|    \
+#define SvOK_off_exc_UV(sv)    (assert_not_ROK(sv),                    \
+                                SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC|    \
                                                  SVf_UTF8),            \
                                                        SvOOK_off(sv))
 
@@ -560,7 +568,8 @@
 #define SvNOKp(sv)             (SvFLAGS(sv) & SVp_NOK)
 #define SvNOKp_on(sv)          (SvFLAGS(sv) |= SVp_NOK)
 #define SvPOKp(sv)             (SvFLAGS(sv) & SVp_POK)
-#define SvPOKp_on(sv)          (SvFLAGS(sv) |= SVp_POK)
+#define SvPOKp_on(sv)          (assert_not_ROK(sv),                    \
+                                SvFLAGS(sv) |= SVp_POK)
 
 #define SvIOK(sv)              (SvFLAGS(sv) & SVf_IOK)
 #define SvIOK_on(sv)           ((void)SvOOK_off(sv), \
@@ -611,12 +620,15 @@
 #define SvUTF8_off(sv)         (SvFLAGS(sv) &= ~(SVf_UTF8))
 
 #define SvPOK(sv)              (SvFLAGS(sv) & SVf_POK)
-#define SvPOK_on(sv)           (SvFLAGS(sv) |= (SVf_POK|SVp_POK))
+#define SvPOK_on(sv)           (assert_not_ROK(sv),                    \
+                                SvFLAGS(sv) |= (SVf_POK|SVp_POK))
 #define SvPOK_off(sv)          (SvFLAGS(sv) &= ~(SVf_POK|SVp_POK))
-#define SvPOK_only(sv)         (SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC|    \
+#define SvPOK_only(sv)         (assert_not_ROK(sv),                    \
+                                SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC|    \
                                                  SVf_IVisUV|SVf_UTF8), \
                                    SvFLAGS(sv) |= (SVf_POK|SVp_POK))
-#define SvPOK_only_UTF8(sv)    (SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC|    \
+#define SvPOK_only_UTF8(sv)    (assert_not_ROK(sv),                    \
+                                SvFLAGS(sv) &= ~(SVf_OK|SVf_AMAGIC|    \
                                                  SVf_IVisUV),          \
                                    SvFLAGS(sv) |= (SVf_POK|SVp_POK))
 

==== //depot/maint-5.8/perl/t/op/array.t#2 (xtext) ====
Index: perl/t/op/array.t
--- perl/t/op/array.t#1~17645~  Fri Jul 19 12:29:57 2002
+++ perl/t/op/array.t   Wed Jan 22 10:37:55 2003
@@ -1,6 +1,12 @@
 #!./perl
 
-print "1..72\n";
+
+BEGIN {
+    chdir 't' if -d 't';
+    @INC = '../lib';
+}
+
+print "1..73\n";
 
 #
 # @foo, @bar, and @ary are also used from tie-stdarray after tie-ing them
@@ -247,3 +253,22 @@
 
 @tary = (0..50);
 tary();
+
+
+require './test.pl';
+
+# bugid #15439 - clearing an array calls destructors which may try
+# to modify the array - caused 'Attempt to free unreferenced scalar'
+
+my $got = runperl (
+       prog => q{
+                   sub X::DESTROY { @a = () }
+                   @a = (bless {}, 'X');
+                   @a = ();
+               },
+       stderr => 1
+    );
+
+$got =~ s/\n/ /g;
+print "# $got\nnot " unless $got eq '';
+print "ok 73\n";
End of Patch.

Reply via email to