SUGGESTED FIX
hg diff src/share/classes/java/nio test/java/nio/Buffer/Basic.java test/java/nio/Buffer/Basic-X.java
diff -r a8d9e8cb38bb src/share/classes/java/nio/ByteBufferAs-X-Buffer.java
--- a/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java Wed Mar 04 15:09:14 2009 +0800
+++ b/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java Mon Mar 09 13:18:24 2009 +0000
@@ -196,10 +196,12 @@ class ByteBufferAs$Type$Buffer$RW$$BO$
if ((start < 0) || (end > len) || (start > end))
throw new IndexOutOfBoundsException();
- int sublen = end - start;
- int off = offset + ((pos + start) << $LG_BYTES_PER_VALUE$);
- assert (off >= 0);
- return new ByteBufferAsCharBuffer$RW$$BO$(bb, -1, 0, sublen, sublen, off);
+ return new ByteBufferAsCharBuffer$RW$$BO$(bb,
+ -1,
+ pos + start,
+ pos + end,
+ capacity(),
+ offset);
}
#end[char]
diff -r a8d9e8cb38bb src/share/classes/java/nio/Direct-X-Buffer.java
--- a/src/share/classes/java/nio/Direct-X-Buffer.java Wed Mar 04 15:09:14 2009 +0800
+++ b/src/share/classes/java/nio/Direct-X-Buffer.java Mon Mar 09 13:18:24 2009 +0000
@@ -412,10 +412,12 @@ class Direct$Type$Buffer$RW$$BO$
if ((start < 0) || (end > len) || (start > end))
throw new IndexOutOfBoundsException();
- int sublen = end - start;
- int off = (pos + start) << $LG_BYTES_PER_VALUE$;
- assert (off >= 0);
- return new DirectCharBuffer$RW$$BO$(this, -1, 0, sublen, sublen, off);
+ return new DirectCharBuffer$RW$$BO$(this,
+ -1,
+ pos + start,
+ pos + end,
+ capacity(),
+ offset);
}
#end[char]
diff -r a8d9e8cb38bb src/share/classes/java/nio/Heap-X-Buffer.java
--- a/src/share/classes/java/nio/Heap-X-Buffer.java Wed Mar 04 15:09:14 2009 +0800
+++ b/src/share/classes/java/nio/Heap-X-Buffer.java Mon Mar 09 13:18:24 2009 +0000
@@ -572,10 +572,13 @@ class Heap$Type$Buffer$RW$
|| (end > length())
|| (start > end))
throw new IndexOutOfBoundsException();
- int len = end - start;
+ int pos = position();
return new HeapCharBuffer$RW$(hb,
- -1, 0, len, len,
- offset + position() + start);
+ -1,
+ pos + start,
+ pos + end,
+ capacity(),
+ offset);
}
#end[char]
diff -r a8d9e8cb38bb src/share/classes/java/nio/StringCharBuffer.java
--- a/src/share/classes/java/nio/StringCharBuffer.java Wed Mar 04 15:09:14 2009 +0800
+++ b/src/share/classes/java/nio/StringCharBuffer.java Mon Mar 09 13:18:24 2009 +0000
@@ -102,10 +102,12 @@ class StringCharBuffer
public final CharBuffer subSequence(int start, int end) {
try {
int pos = position();
- return new StringCharBuffer(str, -1,
+ return new StringCharBuffer(str,
+ -1,
pos + checkIndex(start, pos),
pos + checkIndex(end, pos),
- remaining(), offset);
+ capacity(),
+ offset);
} catch (IllegalArgumentException x) {
throw new IndexOutOfBoundsException();
}
diff -r a8d9e8cb38bb test/java/nio/Buffer/Basic-X.java
--- a/test/java/nio/Buffer/Basic-X.java Wed Mar 04 15:09:14 2009 +0800
+++ b/test/java/nio/Buffer/Basic-X.java Mon Mar 09 13:18:24 2009 +0000
@@ -366,7 +366,10 @@ public class Basic$Type$
b.position(2);
ck(b, b.charAt(1), 'd');
CharBuffer c = (CharBuffer)b.subSequence(1, 4);
- ck(b, b.subSequence(1, 4).toString().equals("def"));
+ ck(c, c.capacity(), b.capacity());
+ ck(c, c.position(), b.position()+1);
+ ck(c, c.limit(), b.position()+4);
+ ck(c, b.subSequence(1, 4).toString().equals("def"));
// 4938424
b.position(4);
@@ -722,6 +725,8 @@ public class Basic$Type$
ck(b, start, b.position());
ck(b, end, b.limit());
ck(b, s.length(), b.capacity());
+ b.position(6);
+ ck(b, b.subSequence(0,3).toString().equals("ghi"));
// The index, relative to the position, must be non-negative and
// smaller than remaining().
diff -r a8d9e8cb38bb test/java/nio/Buffer/Basic.java
--- a/test/java/nio/Buffer/Basic.java Wed Mar 04 15:09:14 2009 +0800
+++ b/test/java/nio/Buffer/Basic.java Mon Mar 09 13:18:24 2009 +0000
@@ -25,7 +25,7 @@
* @summary Unit test for buffers
* @bug 4413135 4414911 4416536 4416562 4418782 4471053 4472779 4490253 4523725
* 4526177 4463011 4660660 4661219 4663521 4782970 4804304 4938424 6231529
- * 6221101 6234263 6535542 6591971 6593946
+ * 6221101 6234263 6535542 6591971 6593946 6795561
* @author Mark Reinhold
*/
|