From 6b777caf7ff7d7c80c140b41535ce6e19da391c9 Mon Sep 17 00:00:00 2001 From: alanb Date: Thu, 13 Mar 2008 19:34:49 +0000 Subject: [PATCH] 6546113: (bf) CharSequence.slice() on wrapped CharSequence doesn't start at buffer position Reviewed-by: iris Contributed-by: roman.kennke@aicas.com --- .../classes/java/nio/StringCharBuffer.java | 20 +++----- .../nio/Buffer/StringCharBufferSliceTest.java | 51 +++++++++++++++++++ 2 files changed, 58 insertions(+), 13 deletions(-) diff --git a/src/share/classes/java/nio/StringCharBuffer.java b/src/share/classes/java/nio/StringCharBuffer.java index d5a80f26d..c6ef51eb0 100644 --- a/src/share/classes/java/nio/StringCharBuffer.java +++ b/src/share/classes/java/nio/StringCharBuffer.java @@ -60,16 +60,9 @@ class StringCharBuffer // package-private str = s; } - private StringCharBuffer(CharSequence s, int mark, - int pos, int limit, int cap) - { - super(mark, pos, limit, cap); - str = s; - } - public CharBuffer duplicate() { return new StringCharBuffer(str, markValue(), - position(), limit(), capacity()); + position(), limit(), capacity(), offset); } public CharBuffer asReadOnlyBuffer() { @@ -77,11 +70,11 @@ class StringCharBuffer // package-private } public final char get() { - return str.charAt(nextGetIndex()); + return str.charAt(nextGetIndex() + offset); } public final char get(int index) { - return str.charAt(checkIndex(index)); + return str.charAt(checkIndex(index) + offset); } // ## Override bulk get methods for better performance @@ -103,15 +96,16 @@ class StringCharBuffer // package-private } final String toString(int start, int end) { - return str.toString().substring(start, end); + return str.toString().substring(start + offset, end + offset); } public final CharSequence subSequence(int start, int end) { try { int pos = position(); - return new StringCharBuffer(str, + return new StringCharBuffer(str, -1, pos + checkIndex(start, pos), - pos + checkIndex(end, pos)); + pos + checkIndex(end, pos), + remaining(), offset); } catch (IllegalArgumentException x) { throw new IndexOutOfBoundsException(); } diff --git a/test/java/nio/Buffer/StringCharBufferSliceTest.java b/test/java/nio/Buffer/StringCharBufferSliceTest.java index 56770025c..82d593c5d 100644 --- a/test/java/nio/Buffer/StringCharBufferSliceTest.java +++ b/test/java/nio/Buffer/StringCharBufferSliceTest.java @@ -53,6 +53,57 @@ public class StringCharBufferSliceTest { buff = CharBuffer.wrap(in, 3, in.length()); test(buff, buff.slice()); + System.out.println( + ">>> StringCharBufferSliceTest-main: testing slice result with get()"); + buff.position(4); + buff.limit(7); + CharBuffer slice = buff.slice(); + for (int i = 0; i < 3; i++) { + if (slice.get() != buff.get()) { + throw new RuntimeException("Wrong characters in slice result."); + } + } + + System.out.println( + ">>> StringCharBufferSliceTest-main: testing slice result with get(int)"); + buff.position(4); + buff.limit(7); + slice = buff.slice(); + for (int i = 0; i < 3; i++) { + if (slice.get(i) != buff.get(4 + i)) { + throw new RuntimeException("Wrong characters in slice result."); + } + } + + System.out.println( + ">>> StringCharBufferSliceTest-main: testing toString."); + buff.position(4); + buff.limit(7); + slice = buff.slice(); + if (! slice.toString().equals("tes")) { + throw new RuntimeException("bad toString() after slice(): " + slice.toString()); + } + + System.out.println( + ">>> StringCharBufferSliceTest-main: testing subSequence."); + buff.position(4); + buff.limit(8); + slice = buff.slice(); + CharSequence subSeq = slice.subSequence(1, 3); + if (subSeq.charAt(0) != 'e' || subSeq.charAt(1) != 's') { + throw new RuntimeException("bad subSequence() after slice(): '" + subSeq + "'"); + } + + System.out.println( + ">>> StringCharBufferSliceTest-main: testing duplicate."); + buff.position(4); + buff.limit(8); + slice = buff.slice(); + CharBuffer dupe = slice.duplicate(); + if (dupe.charAt(0) != 't' || dupe.charAt(1) != 'e' + || dupe.charAt(2) != 's' || dupe.charAt(3) != 't') { + throw new RuntimeException("bad duplicate() after slice(): '" + dupe + "'"); + } System.out.println(">>> StringCharBufferSliceTest-main: done!"); } -- GitLab