Change 14904: Integrate from maintperl.

[email protected] (Chris Nandor) Wed, 27 Feb 2002 17:37:18 -0500
Newsgroups perl.perl5.changes.mac
Message-ID <p05100300b8a31016177a@[10.0.1.177]>
Change 14904 by pudge@pudge-mobile on 2002/02/27 21:25:39

	Integrate from maintperl.

Affected files ...

.... //depot/maint-5.6/macperl/doio.c#3 integrate
.... //depot/maint-5.6/macperl/op.c#6 integrate
.... //depot/maint-5.6/macperl/t/io/open.t#3 integrate
.... //depot/maint-5.6/macperl/t/pragma/strict-subs#2 integrate

Differences ...

==== //depot/maint-5.6/macperl/doio.c#3 (text) ====
Index: perl/doio.c
--- perl/doio.c.~1~	Wed Feb 27 14:30:06 2002
+++ perl/doio.c	Wed Feb 27 14:30:06 2002
@@ -457,38 +457,53 @@
 	fd = PerlIO_fileno(saveifp);
 	if (saveofp) {
 	    PerlIO_flush(saveofp);		/* emulate PerlIO_close() */
-	    if (saveofp != saveifp) {	/* was a socket? */
+	    if (saveofp != saveifp) {		/* was a socket? */
 		PerlIO_close(saveofp);
-		if (fd > 2)
-		    Safefree(saveofp);
 	    }
 	}
 	if (fd != PerlIO_fileno(fp)) {
-	    Pid_t pid;
-	    SV *sv;
-
 	    PerlLIO_dup2(PerlIO_fileno(fp), fd);
 #ifdef VMS
 	    if (fd != PerlIO_fileno(PerlIO_stdin())) {
-	      char newname[FILENAME_MAX+1];
-	      if (fgetname(fp, newname)) {
-	        if (fd == PerlIO_fileno(PerlIO_stdout())) Perl_vmssetuserlnm("SYS$OUTPUT", newname);
-	        if (fd == PerlIO_fileno(PerlIO_stderr())) Perl_vmssetuserlnm("SYS$ERROR",  newname);
-	      }
+		char newname[FILENAME_MAX+1];
+		if (fgetname(fp, newname)) {
+		    if (fd == PerlIO_fileno(PerlIO_stdout()))
+			Perl_vmssetuserlnm("SYS$OUTPUT", newname);
+		    if (fd == PerlIO_fileno(PerlIO_stderr()))
+			Perl_vmssetuserlnm("SYS$ERROR",  newname);
+		}
+	    }
+#endif
+
+#if !defined(WIN32)
+	    /* PL_fdpid isn't used on Windows, so avoid this useless work.
+	     * XXX Probably the same for a lot of other places. */
+	    {
+		Pid_t pid;
+		SV *sv;
+
+		LOCK_FDPID_MUTEX;
+		sv = *av_fetch(PL_fdpid,PerlIO_fileno(fp),TRUE);
+		(void)SvUPGRADE(sv, SVt_IV);
+		pid = SvIVX(sv);
+		SvIVX(sv) = 0;
+		sv = *av_fetch(PL_fdpid,fd,TRUE);
+		(void)SvUPGRADE(sv, SVt_IV);
+		SvIVX(sv) = pid;
+		UNLOCK_FDPID_MUTEX;
 	    }
 #endif
-	    LOCK_FDPID_MUTEX;
-	    sv = *av_fetch(PL_fdpid,PerlIO_fileno(fp),TRUE);
-	    (void)SvUPGRADE(sv, SVt_IV);
-	    pid = SvIVX(sv);
-	    SvIVX(sv) = 0;
-	    sv = *av_fetch(PL_fdpid,fd,TRUE);
-	    UNLOCK_FDPID_MUTEX;
-	    (void)SvUPGRADE(sv, SVt_IV);
-	    SvIVX(sv) = pid;
-	    if (!was_fdopen)
+
+	    if (was_fdopen) {
+		/* need to close fp without closing underlying fd */
+		int ofd = PerlIO_fileno(fp);
+		int dupfd = PerlLIO_dup(ofd);
+		PerlIO_close(fp);
+		PerlLIO_dup2(dupfd,ofd);
+		PerlLIO_close(dupfd);
+	    }
+	    else
 		PerlIO_close(fp);
-
 	}
 	fp = saveifp;
 	PerlIO_clearerr(fp);

==== //depot/maint-5.6/macperl/op.c#6 (text) ====
Index: perl/op.c
--- perl/op.c.~1~	Wed Feb 27 14:30:06 2002
+++ perl/op.c	Wed Feb 27 14:30:06 2002
@@ -2352,6 +2352,7 @@
 
     o->op_type = OP_RV2AV;
     o->op_ppaddr = PL_ppaddr[OP_RV2AV];
+    o->op_seq = 0;		/* needs to be revisited in peep() */
     curop = ((UNOP*)o)->op_first;
     ((UNOP*)o)->op_first = newSVOP(OP_CONST, 0, SvREFCNT_inc(*PL_stack_sp--));
     op_free(curop);

==== //depot/maint-5.6/macperl/t/io/open.t#3 (xtext) ====
Index: perl/t/io/open.t
--- perl/t/io/open.t.~1~	Wed Feb 27 14:30:06 2002
+++ perl/t/io/open.t	Wed Feb 27 14:30:06 2002
@@ -8,11 +8,12 @@
 # $RCSfile$    
 $|  = 1;
 use warnings;
+use File::Spec;
 $Is_MacOS = $^O eq 'MacOS';
 $Is_VMS   = $^O eq 'VMS';
 $Is_Dos   = $^O eq 'dos';
 
-print "1..66\n";
+print "1..69\n";
 
 my $test = 1;
 
@@ -271,7 +272,7 @@
     local *F;
     for (1..2) {
         if ($Is_Dos) {
-        open(F, "echo \\#foo|") or print "not ";
+	    open(F, "echo \\#foo|") or print "not ";
         } else {
             open(F, "echo #foo|") or print "not ";
         }
@@ -281,7 +282,7 @@
     ok;
     for (1..2) {
         if ($Is_Dos) {
-	open(F, "-|", "echo \\#foo") or print "not ";
+	    open(F, "-|", "echo \\#foo") or print "not ";
         } else {
             open(F, "-|", "echo #foo") or print "not ";
         }
@@ -290,3 +291,42 @@
     }
     ok;
 }
+
+
+# this used to leak FILE* pointers on all platforms (and also died on
+# Windows after running a few hundred times)
+
+my $devnull = File::Spec->devnull;
+{
+    my $loopcount;
+
+    $loopcount = 0;
+    while ($loopcount++ < 555) {
+	open NEWOUT, ">$devnull" or die;
+	open SAVEOUT, ">&STDOUT" or die;
+	open STDOUT, ">&=" . fileno(NEWOUT) or die;
+	open STDOUT, ">&SAVEOUT" or die;
+	close NEWOUT;
+    }
+    ok;
+
+    $loopcount = 0;
+    while ($loopcount++ < 555) {
+	open NEWOUT, ">$devnull" or die;
+	open SAVEOUT, ">&STDOUT" or die;
+	open STDOUT, ">&=NEWOUT" or die;
+	open STDOUT, ">&SAVEOUT" or die;
+	close NEWOUT;
+    }
+    ok;
+
+    $loopcount = 0;
+    while ($loopcount++ < 555) {
+	open NEWOUT, ">$devnull" or die;
+	open SAVEOUT, ">&STDOUT" or die;
+	open STDOUT, ">&NEWOUT" or die;
+	open STDOUT, ">&SAVEOUT" or die;
+	close NEWOUT;
+    }
+    ok;
+}

==== //depot/maint-5.6/macperl/t/pragma/strict-subs#2 (text) ====
Index: perl/t/pragma/strict-subs
--- perl/t/pragma/strict-subs.~1~	Wed Feb 27 14:30:06 2002
+++ perl/t/pragma/strict-subs	Wed Feb 27 14:30:06 2002
@@ -51,6 +51,15 @@
 ########
 
 # strict subs - error
+use strict 'subs' ;
+my @a = (1..2);
+my $b = xyz;
+EXPECT
+Bareword "xyz" not allowed while "strict subs" in use at - line 5.
+Execution of - aborted due to compilation errors.
+########
+
+# strict subs - error
 use strict ;
 Fred ;
 EXPECT
End of Patch.