Hi,
the attached patch fixes the way ByteDecodeLoopHelper and
ByteEncodeLoopHelper deal with the situation of unmappable characters:
With the attached patch the method really returns with a CoderResult
indicating unmappable characters. The former variant overwrote the
return value with either CoderResult.UNDERFLOW or CoderResult.OVERFLOW.
I found and debugged this problem while using mysql connector/j.
Regards
Robert
ChangeLog:
2008-09-04 Robert Schuster <[EMAIL PROTECTED]>
* gnu/java/nio/charset/ByteDecodeLoopHelper:
(arrayDecodeLoop): Added new break label, escape to that label.
* gnu/java/nio/charset/ByteEncodeLoopHelper:
(arrayDecodeLoop): Added new break label, escape to that label.
Index: gnu/java/nio/charset/ByteDecodeLoopHelper.java
===================================================================
RCS file: /sources/classpath/classpath/gnu/java/nio/charset/ByteDecodeLoopHelper.java,v
retrieving revision 1.1
diff -u -r1.1 ByteDecodeLoopHelper.java
--- gnu/java/nio/charset/ByteDecodeLoopHelper.java 23 Nov 2007 16:11:17 -0000 1.1
+++ gnu/java/nio/charset/ByteDecodeLoopHelper.java 3 Sep 2008 23:11:29 -0000
@@ -119,6 +119,8 @@
int inRemaining = in.remaining();
int outRemaining = out.remaining();
CoderResult result;
+
+ bailOut:
if (inRemaining <= outRemaining)
{
for (int i = 0; i < inRemaining; i++)
@@ -129,7 +131,7 @@
{
inPos--;
result = CoderResult.unmappableForLength(1);
- break;
+ break bailOut;
}
char c = mapToChar(b);
outArray[outPos] = c;
@@ -147,7 +149,7 @@
{
inPos--;
result = CoderResult.unmappableForLength(1);
- break;
+ break bailOut;
}
char c = mapToChar(b);
outArray[outPos] = c;
Index: gnu/java/nio/charset/ByteEncodeLoopHelper.java
===================================================================
RCS file: /sources/classpath/classpath/gnu/java/nio/charset/ByteEncodeLoopHelper.java,v
retrieving revision 1.1
diff -u -r1.1 ByteEncodeLoopHelper.java
--- gnu/java/nio/charset/ByteEncodeLoopHelper.java 23 Nov 2007 16:11:17 -0000 1.1
+++ gnu/java/nio/charset/ByteEncodeLoopHelper.java 3 Sep 2008 23:11:29 -0000
@@ -120,6 +120,8 @@
int inRemaining = in.remaining();
int outRemaining = out.remaining();
CoderResult result;
+
+ bailOut:
if (inRemaining <= outRemaining)
{
for (int i = 0; i < inRemaining; i++)
@@ -130,7 +132,7 @@
{
inPos--;
result = CoderResult.unmappableForLength(1);
- break;
+ break bailOut;
}
byte b = mapToByte(inChar);
outArray[outPos] = b;
@@ -148,7 +150,7 @@
{
inPos--;
result = CoderResult.unmappableForLength(1);
- break;
+ break bailOut;
}
byte b = mapToByte(inChar);
outArray[outPos] = b;