aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authorMichael Koch <konqueror@gmx.de>2003-12-08 12:45:59 +0000
committerMichael Koch <mkoch@gcc.gnu.org>2003-12-08 12:45:59 +0000
commitcfeb18dbeca3b5d651152c183c68d4bdf9ae9b9f (patch)
tree2cadccb2a988d0446646a56fa491435e0c773b5e /libjava
parentde9315db9c74db72425230b6af548c9ddfe02bbd (diff)
downloadgcc-cfeb18dbeca3b5d651152c183c68d4bdf9ae9b9f.zip
gcc-cfeb18dbeca3b5d651152c183c68d4bdf9ae9b9f.tar.gz
gcc-cfeb18dbeca3b5d651152c183c68d4bdf9ae9b9f.tar.bz2
re PR libgcj/13176 (Revert PrintStream changes)
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. From-SVN: r74419
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog18
-rw-r--r--libjava/java/io/PrintStream.java197
2 files changed, 162 insertions, 53 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index fb76298..814a350 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -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.
diff --git a/libjava/java/io/PrintStream.java b/libjava/java/io/PrintStream.java
index d2a2117..2e9bfc4 100644
--- a/libjava/java/io/PrintStream.java
+++ b/libjava/java/io/PrintStream.java
@@ -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 ();