OutputStreamWriter.java (writeChars): Use a 'do' loop.

* java/io/OutputStreamWriter.java (writeChars): Use a 'do' loop.
	Set 'out.count' earlier.
	(close): Call setFinished on converter.
	(flush): Always write work buffer.
	* java/io/PrintStream.java (writeChars): Do 'do' loop.
	(close): Call setFinished on converter.  Write a 'flush' array.
	* java/lang/natString.cc (getBytes): Call setFinished on
	converter.
	* gnu/gcj/convert/CharsetToBytesAdaptor.java (hasBytes): New
	field.
	(write): Set hasBytes.  Changed 'finished' logic.
	(havePendingBytes): Rewrote.
	(setFinished): New method.
	* gnu/gcj/convert/UnicodeToBytes.java (setFinished): New method.
	* testsuite/libjava.lang/RH194522.java: New file.
	* testsuite/libjava.lang/RH194522.out: New file.

From-SVN: r115039
This commit is contained in:
Tom Tromey 2006-06-27 20:38:10 +00:00 committed by Tom Tromey
parent 80cd0e33d9
commit 9e01bff779
8 changed files with 85 additions and 23 deletions

View File

@ -1,3 +1,22 @@
2006-06-27 Tom Tromey <tromey@redhat.com>
* java/io/OutputStreamWriter.java (writeChars): Use a 'do' loop.
Set 'out.count' earlier.
(close): Call setFinished on converter.
(flush): Always write work buffer.
* java/io/PrintStream.java (writeChars): Do 'do' loop.
(close): Call setFinished on converter. Write a 'flush' array.
* java/lang/natString.cc (getBytes): Call setFinished on
converter.
* gnu/gcj/convert/CharsetToBytesAdaptor.java (hasBytes): New
field.
(write): Set hasBytes. Changed 'finished' logic.
(havePendingBytes): Rewrote.
(setFinished): New method.
* gnu/gcj/convert/UnicodeToBytes.java (setFinished): New method.
* testsuite/libjava.lang/RH194522.java: New file.
* testsuite/libjava.lang/RH194522.out: New file.
2006-06-27 Marco Trudel <mtrudel@gmx.ch>
* boehm.cc (_Jv_SuspendThread, _Jv_ResumeThread): Define

View File

@ -38,6 +38,11 @@ public class CharsetToBytesAdaptor extends UnicodeToBytes
*/
private boolean closedEncoder;
/**
* True if there are bytes pending in the encoder.
*/
private boolean hasBytes;
/**
* True if we're finished.
*/
@ -112,20 +117,16 @@ public class CharsetToBytesAdaptor extends UnicodeToBytes
// Set the current position.
outBuf.position(count);
// If we've already said that there is no more input available,
// then we simply try to flush again.
// Do the conversion.
CoderResult result = encoder.encode(inBuf, outBuf, closedEncoder);
hasBytes = result == CoderResult.OVERFLOW;
if (closedEncoder)
{
CoderResult result = encoder.flush(outBuf);
result = encoder.flush(outBuf);
if (result == CoderResult.UNDERFLOW)
finished = true;
}
else
{
// Do the conversion. If there are no characters to write,
// then we are finished.
closedEncoder = ! inBuf.hasRemaining();
encoder.encode(inBuf, outBuf, closedEncoder);
else
hasBytes = true;
}
// Mark the new end of buf.
@ -140,7 +141,12 @@ public class CharsetToBytesAdaptor extends UnicodeToBytes
*/
public boolean havePendingBytes()
{
return ! finished;
return hasBytes;
}
public void setFinished()
{
closedEncoder = true;
}
// These aren't cached.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1999, 2000, 2001, 2003, 2005 Free Software Foundation
/* Copyright (C) 1999, 2000, 2001, 2003, 2005, 2006 Free Software Foundation
This file is part of libgcj.
@ -172,6 +172,15 @@ public abstract class UnicodeToBytes extends IOConverter
return false;
}
/**
* Users should call this method when the input is coming to an
* end. This signals that the next write (which might be
* zero-length) ought to flush any internal state.
*/
public void setFinished()
{
}
/** Indicate that the converter is resuable.
* This class keeps track of converters on a per-encoding basis.
* When done with an encoder you may call this method to indicate

View File

@ -1,5 +1,5 @@
/* OutputStreamWriter.java -- Writer that converts chars to bytes
Copyright (C) 1998, 1999, 2000, 2001, 2003, 2005 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2000, 2001, 2003, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -168,6 +168,7 @@ public class OutputStreamWriter extends Writer
{
if (out != null)
{
converter.setFinished();
flush();
out.close();
out = null;
@ -200,11 +201,11 @@ public class OutputStreamWriter extends Writer
if (out == null)
throw new IOException("Stream closed");
if (wcount > 0)
{
writeChars(work, 0, wcount);
wcount = 0;
}
// Always write -- if we are close()ing then we want to make
// sure the converter is flushed.
writeChars(work, 0, wcount);
wcount = 0;
out.flush();
}
}
@ -243,7 +244,7 @@ public class OutputStreamWriter extends Writer
private void writeChars(char[] buf, int offset, int count)
throws IOException
{
while (count > 0 || converter.havePendingBytes())
do
{
// We must flush if out.count == out.buf.length.
// It is probably a good idea to flush if out.buf is almost full.
@ -256,6 +257,9 @@ public class OutputStreamWriter extends Writer
}
converter.setOutput(out.buf, out.count);
int converted = converter.write(buf, offset, count);
// Must set this before we flush the output stream, because
// flushing will reset 'out.count'.
out.count = converter.count;
// Flush if we cannot make progress.
if (converted == 0 && out.count == converter.count)
{
@ -265,8 +269,8 @@ public class OutputStreamWriter extends Writer
}
offset += converted;
count -= converted;
out.count = converter.count;
}
while (count > 0 || converter.havePendingBytes());
}
/**

View File

@ -1,5 +1,5 @@
/* PrintStream.java -- OutputStream for printing output
Copyright (C) 1998, 1999, 2001, 2003, 2004, 2005 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -174,6 +174,8 @@ public class PrintStream extends FilterOutputStream
{
try
{
converter.setFinished();
writeChars(new char[0], 0, 0);
flush();
out.close();
}
@ -251,7 +253,7 @@ public class PrintStream extends FilterOutputStream
private void writeChars(char[] buf, int offset, int count)
throws IOException
{
while (count > 0 || converter.havePendingBytes())
do
{
converter.setOutput(work_bytes, 0);
int converted = converter.write(buf, offset, count);
@ -259,12 +261,13 @@ public class PrintStream extends FilterOutputStream
count -= converted;
out.write(work_bytes, 0, converter.count);
}
while (count > 0 || converter.havePendingBytes());
}
private void writeChars(String str, int offset, int count)
throws IOException
{
while (count > 0 || converter.havePendingBytes())
do
{
converter.setOutput(work_bytes, 0);
int converted = converter.write(str, offset, count, work);
@ -272,6 +275,7 @@ public class PrintStream extends FilterOutputStream
count -= converted;
out.write(work_bytes, 0, converter.count);
}
while (count > 0 || converter.havePendingBytes());
}
/**

View File

@ -615,6 +615,8 @@ java::lang::String::getBytes (jstring enc)
while (todo > 0 || converter->havePendingBytes())
{
converter->setOutput(buffer, bufpos);
// We only really need to do a single write.
converter->setFinished();
int converted = converter->write(this, offset, todo, NULL);
bufpos = converter->count;
if (converted == 0 && bufpos == converter->count)

View File

@ -0,0 +1,18 @@
// Test case for http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=194522
import java.io.*;
import java.nio.charset.Charset;
public class RH194522
{
public static void main(String[] args) throws Exception
{
Charset c = Charset.forName("UTF-8");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintWriter pw = new PrintWriter(new OutputStreamWriter(baos, c));
pw.println("hi");
pw.println("bob");
pw.flush();
pw.close();
}
}