This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]