This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
java.lang.String.getBytes(String enc) fixlet
- From: Marco Trudel <mtrudel at gmx dot ch>
- To: Java Patch List <java-patches at gcc dot gnu dot org>
- Date: Sat, 10 Mar 2007 18:03:34 +0100
- Subject: java.lang.String.getBytes(String enc) fixlet
This patch fixes a bug in GCJs java.lang.String.getBytes(String enc) and
additionally cleans it up a little. This is the problem:
while (todo > 0 || converter->havePendingBytes())
{
// We only really need to do a single write.
converter->setFinished();
int converted = converter->write(this, offset, todo, NULL);
}
Setting the converter to finished will only allow one succeeding write
call. Doesn't make too much sense in a loop. So the patch repositions
the flush (setFinished() + empty write()) to after the loop.
This makes java.lang.String.getBytes13 mauve test and
"abc".getBytes("unicode") on Windows run without an
IllegalStateException exception (since they will cycle multiple times
through the loop).
- Compilation tested on a host=Linux target=Linux as well as host=Linux
target=Mingw.
- java.lang.String.getBytes13 mauve test will now run correctly and
report 3 failed calls to harness.check(). Without the patch, that test
will end because of an exception. Otherwise no changes in the
java.lang.String tests.
Changelog:
2007-??-?? Marco Trudel <mtrudel@gmx.ch>
* java/lang/natString.cc (getBytes (jstring enc)):
Fixed the loop for multiple cycles, Code cleanup
Something I missed? Comments/Concerns?
Marco
Index: java/lang/natString.cc
===================================================================
--- java/lang/natString.cc (revision 122749)
+++ java/lang/natString.cc (working copy)
@@ -1,6 +1,6 @@
// natString.cc - Implementation of java.lang.String native methods.
-/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation
This file is part of libgcj.
@@ -615,11 +615,9 @@
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)
+ if (converted == 0)
{
buflen *= 2;
jbyteArray newbuffer = JvNewByteArray(buflen);
@@ -627,11 +625,16 @@
buffer = newbuffer;
}
else
- bufpos = converter->count;
-
- offset += converted;
- todo -= converted;
+ {
+ offset += converted;
+ todo -= converted;
+ }
}
+ if (length() > 0)
+ {
+ converter->setFinished();
+ converter->write(this, 0, 0, NULL);
+ }
converter->done ();
if (bufpos == buflen)
return buffer;
PASS: java.lang.String.getBytes
PASS: java.lang.String.indexOf
FAIL: java.lang.String.getBytes13
line 60: String.getBytes("UTF-16") [1] -- boolean passed to check was false
line 60: String.getBytes("UnicodeBig") [1] -- boolean passed to check was false
line 58: String.getBytes("UnicodeBig") [2] -- uncaught exception:
java.lang.IllegalStateException
at java.nio.charset.CharsetEncoder.encode(gij)
at gnu.gcj.convert.CharsetToBytesAdaptor.write(gij)
at gnu.gcj.convert.CharsetToBytesAdaptor.write(gij)
at gnu.gcj.convert.UnicodeToBytes.write(gij)
at java.lang.String.getBytes(gij)
at gnu.testlet.java.lang.String.getBytes13.test1Encoding(getBytes13.java:58)
at gnu.testlet.java.lang.String.getBytes13.test(getBytes13.java:46)
at RunnerProcess.runtest(RunnerProcess.java:360)
at RunnerProcess.runAndReport(RunnerProcess.java:415)
at RunnerProcess.main(RunnerProcess.java:227)
PASS: java.lang.String.charAt
PASS: java.lang.String.surrogate
PASS: java.lang.String.equals
PASS: java.lang.String.new_String
PASS: java.lang.String.StringTest
PASS: java.lang.String.getBytes14
PASS: java.lang.String.CASE_INSENSITIVE_ORDER
FAIL: java.lang.String.decode
line 119: [12] -- boolean passed to check was false
line 120: [13] -- boolean passed to check was false
line 121: [14] -- boolean passed to check was false
line 136: [23] -- boolean passed to check was false
PASS: java.lang.String.to
PASS: java.lang.String.compareTo
PASS: java.lang.String.substring
PASS: java.lang.String.split
PASS: java.lang.String.hash
PASS: java.lang.String.startsWith
TEST RESULTS:
2 of 17 tests failed. 4 total calls to harness.check() failed.
PASS: java.lang.String.getBytes
PASS: java.lang.String.indexOf
FAIL: java.lang.String.getBytes13
line 60: String.getBytes("UTF-16") [1] -- boolean passed to check was false
line 60: String.getBytes("UnicodeBig") [1] -- boolean passed to check was false
line 60: String.getBytes("UnicodeLittle") [1] -- boolean passed to check was false
PASS: java.lang.String.charAt
PASS: java.lang.String.surrogate
PASS: java.lang.String.equals
PASS: java.lang.String.new_String
PASS: java.lang.String.StringTest
PASS: java.lang.String.getBytes14
PASS: java.lang.String.CASE_INSENSITIVE_ORDER
FAIL: java.lang.String.decode
line 119: [12] -- boolean passed to check was false
line 120: [13] -- boolean passed to check was false
line 121: [14] -- boolean passed to check was false
line 136: [23] -- boolean passed to check was false
PASS: java.lang.String.to
PASS: java.lang.String.compareTo
PASS: java.lang.String.substring
PASS: java.lang.String.split
PASS: java.lang.String.hash
PASS: java.lang.String.startsWith
TEST RESULTS:
2 of 17 tests failed. 7 total calls to harness.check() failed.