OSDN Git Service

2003-12-08 Michael Koch <konqueror@gmx.de>
authormkoch <mkoch@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 8 Dec 2003 12:45:59 +0000 (12:45 +0000)
committermkoch <mkoch@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 8 Dec 2003 12:45:59 +0000 (12:45 +0000)
Fix for PR libgcj/13176.
* java/io/PrintStream.java: Partly revert my previous patches to get
(line_separator): New field.
(converter): New field.
(work): New field.
(work_bytes): New field.
(pw): Removed.
(closed): Removed.
(PrintStrean): Initialize converter and not pw.
(checkError): Flush always, pw doesn't exist anymore.
(close): Close underlying out stream.
(print): New method.
(writeChars): New method.
(print): Use new internal print method.
(println): Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@74419 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/java/io/PrintStream.java

index fb76298..814a350 100644 (file)
@@ -1,3 +1,21 @@
+2003-12-08  Michael Koch  <konqueror@gmx.de>
+
+       Fix for PR libgcj/13176.
+       * java/io/PrintStream.java: Partly revert my previous patches to get
+       (line_separator): New field.
+       (converter): New field.
+       (work): New field.
+       (work_bytes): New field.
+       (pw): Removed.
+       (closed): Removed.
+       (PrintStrean): Initialize converter and not pw.
+       (checkError): Flush always, pw doesn't exist anymore.
+       (close): Close underlying out stream.
+       (print): New method.
+       (writeChars): New method.
+       (print): Use new internal print method.
+       (println): Likewise.
+
 2002-12-08  Bryce McKinlay  <bryce@mckinlay.net.nz>
 
        * java/util/Hashtable.java (Hashtable(Map)): Use putAll, not putAllInternal.
index d2a2117..2e9bfc4 100644 (file)
@@ -38,6 +38,8 @@ exception statement from your version. */
 
 package java.io;
 
+import gnu.gcj.convert.UnicodeToBytes;
+
 /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
  * "The Java Language Specification", ISBN 0-201-63451-1
  * Status:  Believed complete and correct to 1.3
@@ -58,6 +60,21 @@ package java.io;
  */
 public class PrintStream extends FilterOutputStream
 {
+  /* Notice the implementation is quite similar to OutputStreamWriter.
+   * This leads to some minor duplication, because neither inherits
+   * from the other, and we want to maximize performance. */
+
+  // Line separator string.
+  private static final char[] line_separator
+    = System.getProperty("line.separator").toCharArray();
+  
+  UnicodeToBytes converter;
+
+  // Work buffer of characters for converter.
+  char[] work = new char[100];
+  // Work buffer of bytes where we temporarily keep converter output.
+  byte[] work_bytes = new byte[100];
+
   /**
    * This boolean indicates whether or not an error has ever occurred
    * on this stream.
@@ -71,16 +88,6 @@ public class PrintStream extends FilterOutputStream
   private boolean auto_flush;
 
   /**
-   * The PrintWriter instance this object writes to
-   */
-  private PrintWriter pw;
-
-  /**
-   * Lets us know if the stream is closed
-   */
-  private boolean closed;
-
-  /**
    * This method intializes a new <code>PrintStream</code> object to write
    * to the specified output sink.
    *
@@ -108,7 +115,7 @@ public class PrintStream extends FilterOutputStream
   {
     super (out);
 
-    pw = new PrintWriter (out, auto_flush);
+    converter = UnicodeToBytes.getDefaultEncoder();
     this.auto_flush = auto_flush;
   }
 
@@ -132,7 +139,7 @@ public class PrintStream extends FilterOutputStream
   {
     super (out);
 
-    pw = new PrintWriter (new OutputStreamWriter (out, encoding), auto_flush);
+    converter = UnicodeToBytes.getEncoder (encoding);
     this.auto_flush = auto_flush;
   }
 
@@ -147,10 +154,8 @@ public class PrintStream extends FilterOutputStream
    */
   public boolean checkError ()
   {
-    if (!closed)
-      flush ();
-
-    return error_occurred | pw.checkError ();
+    flush ();
+    return error_occurred;
   }
 
   /**
@@ -167,8 +172,19 @@ public class PrintStream extends FilterOutputStream
    */
   public void close ()
   {
-    pw.close ();
-    closed = true;
+    try
+      {
+       flush();
+       out.close();
+      }
+    catch (InterruptedIOException iioe)
+      {
+       Thread.currentThread().interrupt();
+      }
+    catch (IOException e)
+      {
+       setError ();
+      }
   }
 
   /**
@@ -177,7 +193,85 @@ public class PrintStream extends FilterOutputStream
    */
   public void flush ()
   {
-    pw.flush();
+    try
+      {
+       out.flush();
+      }
+    catch (InterruptedIOException iioe)
+      {
+       Thread.currentThread().interrupt();
+      }
+    catch (IOException e)
+      {
+       setError ();
+      }
+  }
+
+  private synchronized void print (String str, boolean println)
+  {
+    try
+      {
+        writeChars(str, 0, str.length());
+       if (println)
+         writeChars(line_separator, 0, line_separator.length);
+       if (auto_flush)
+         flush();
+      }
+    catch (InterruptedIOException iioe)
+      {
+       Thread.currentThread().interrupt();
+      }
+    catch (IOException e)
+      {
+       setError ();
+      }
+  }
+
+  private synchronized void print (char[] chars, int pos, int len,
+                                  boolean println)
+  {
+    try
+      {
+        writeChars(chars, pos, len);
+       if (println)
+         writeChars(line_separator, 0, line_separator.length);
+       if (auto_flush)
+         flush();
+      }
+    catch (InterruptedIOException iioe)
+      {
+       Thread.currentThread().interrupt();
+      }
+    catch (IOException e)
+      {
+       setError ();
+      }
+  }
+
+  private void writeChars(char[] buf, int offset, int count)
+    throws IOException
+  {
+    while (count > 0 || converter.havePendingBytes())
+      {
+       converter.setOutput(work_bytes, 0);
+       int converted = converter.write(buf, offset, count);
+       offset += converted;
+       count -= converted;
+       out.write(work_bytes, 0, converter.count);
+      }
+  }
+
+  private void writeChars(String str, int offset, int count)
+    throws IOException
+  {
+    while (count > 0 || converter.havePendingBytes())
+      {
+       converter.setOutput(work_bytes, 0);
+       int converted = converter.write(str, offset, count, work);
+       offset += converted;
+       count -= converted;
+       out.write(work_bytes, 0, converter.count);
+      }
   }
 
   /**
@@ -189,7 +283,7 @@ public class PrintStream extends FilterOutputStream
    */
   public void print (boolean bool)
   {
-    print (String.valueOf (bool));
+    print(String.valueOf(bool), false);
   }
 
   /**
@@ -200,7 +294,7 @@ public class PrintStream extends FilterOutputStream
    */
   public void print (int inum)
   {
-    print (String.valueOf (inum));
+    print(String.valueOf(inum), false);
   }
 
   /**
@@ -211,7 +305,7 @@ public class PrintStream extends FilterOutputStream
    */
   public void print (long lnum)
   {
-    print (String.valueOf (lnum));
+    print(String.valueOf(lnum), false);
   }
 
   /**
@@ -222,7 +316,7 @@ public class PrintStream extends FilterOutputStream
    */
   public void print (float fnum)
   {
-    print (String.valueOf (fnum));
+    print(String.valueOf(fnum), false);
   }
 
   /**
@@ -233,7 +327,7 @@ public class PrintStream extends FilterOutputStream
    */
   public void print (double dnum)
   {
-    print (String.valueOf (dnum));
+    print(String.valueOf(dnum), false);
   }
 
   /**
@@ -245,9 +339,7 @@ public class PrintStream extends FilterOutputStream
    */
   public void print (Object obj)
   {
-    // Don't call pw directly.  Convert to String so we scan for newline
-    // characters on auto-flush;
-    print (String.valueOf (obj));
+    print(obj == null ? "null" : obj.toString(), false);
   }
 
   /**
@@ -258,10 +350,7 @@ public class PrintStream extends FilterOutputStream
    */
   public void print (String str)
   {
-    pw.print (str);
-
-    if (auto_flush)
-      flush ();
+    print(str == null ? "null" : str, false);
   }
 
   /**
@@ -270,9 +359,10 @@ public class PrintStream extends FilterOutputStream
    *
    * @param ch The <code>char</code> value to be printed
    */
-  public void print (char ch)
+  public synchronized void print (char ch)
   {
-    print (String.valueOf (ch));
+    work[0] = ch;
+    print(work, 0, 1, false);
   }
 
   /**
@@ -283,7 +373,7 @@ public class PrintStream extends FilterOutputStream
    */
   public void print (char[] charArray)
   {
-    pw.print (charArray);
+    print(charArray, 0, charArray.length, false);
   }
 
   /**
@@ -293,7 +383,7 @@ public class PrintStream extends FilterOutputStream
    */
   public void println ()
   {
-    pw.println();
+    print(line_separator, 0, line_separator.length, false);
   }
 
   /**
@@ -307,7 +397,7 @@ public class PrintStream extends FilterOutputStream
    */
   public void println (boolean bool)
   {
-    println (String.valueOf (bool));
+    print(String.valueOf(bool), true);
   }
 
   /**
@@ -320,7 +410,7 @@ public class PrintStream extends FilterOutputStream
    */
   public void println (int inum)
   {
-    println (String.valueOf (inum));
+    print(String.valueOf(inum), true);
   }
 
   /**
@@ -333,7 +423,7 @@ public class PrintStream extends FilterOutputStream
    */
   public void println (long lnum)
   {
-    println (String.valueOf (lnum));
+    print(String.valueOf(lnum), true);
   }
 
   /**
@@ -346,7 +436,7 @@ public class PrintStream extends FilterOutputStream
    */
   public void println (float fnum)
   {
-    println (String.valueOf (fnum));
+    print(String.valueOf(fnum), true);
   }
 
   /**
@@ -359,7 +449,7 @@ public class PrintStream extends FilterOutputStream
    */
   public void println (double dnum)
   {
-    println (String.valueOf (dnum));
+    print(String.valueOf(dnum), true);
   }
 
   /**
@@ -373,7 +463,7 @@ public class PrintStream extends FilterOutputStream
    */
   public void println (Object obj)
   {
-    println (String.valueOf (obj));
+    print(obj == null ? "null" : obj.toString(), true);
   }
 
   /**
@@ -386,7 +476,7 @@ public class PrintStream extends FilterOutputStream
    */
   public void println (String str)
   {
-    pw.println (str);
+    print (str == null ? "null" : str, true);
   }
 
   /**
@@ -397,9 +487,10 @@ public class PrintStream extends FilterOutputStream
    *
    * @param ch The <code>char</code> value to be printed
    */
-  public void println (char ch)
+  public synchronized void println (char ch)
   {
-    println (String.valueOf (ch));
+    work[0] = ch;
+    print(work, 0, 1, true);
   }
 
   /**
@@ -412,7 +503,7 @@ public class PrintStream extends FilterOutputStream
    */
   public void println (char[] charArray)
   {
-    pw.println (charArray);
+    print(charArray, 0, charArray.length, true);
   }
 
   /**
@@ -424,10 +515,6 @@ public class PrintStream extends FilterOutputStream
    */
   public void write (int oneByte)
   {
-    // We actually have to implement this method. Flush first so that
-    // things get written in the right order.
-    flush();
-
     try
       {
         out.write (oneByte & 0xff);
@@ -435,6 +522,10 @@ public class PrintStream extends FilterOutputStream
         if (auto_flush && (oneByte == '\n'))
           flush ();
       }
+    catch (InterruptedIOException iioe)
+      {
+       Thread.currentThread ().interrupt ();
+      }
     catch (IOException e)
       {
         setError ();
@@ -451,10 +542,6 @@ public class PrintStream extends FilterOutputStream
    */
   public void write (byte[] buffer, int offset, int len)
   {
-    // We actually have to implement this method too. Flush first so that
-    // things get written in the right order.
-    flush();
-
     try
       {
         out.write (buffer, offset, len);
@@ -462,6 +549,10 @@ public class PrintStream extends FilterOutputStream
         if (auto_flush)
           flush ();
       }
+    catch (InterruptedIOException iioe)
+      {
+       Thread.currentThread ().interrupt ();
+      }
     catch (IOException e)
       {
         setError ();