diff --git a/src/share/classes/java/nio/StringCharBuffer.java b/src/share/classes/java/nio/StringCharBuffer.java index d5a80f26d1c5adfa89bcfcaf266014c1b547c3db..c6ef51eb0dcd9ffe574e967a247fbb0e3ac709ff 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/src/share/classes/java/util/prefs/Preferences.java b/src/share/classes/java/util/prefs/Preferences.java index 1c25cfdbc13273b3bd21870b2f09fd924100c5f6..1aad5d9f0ef9fb529960b72bf9723035e507aa06 100644 --- a/src/share/classes/java/util/prefs/Preferences.java +++ b/src/share/classes/java/util/prefs/Preferences.java @@ -32,9 +32,8 @@ import java.security.AccessController; import java.security.Permission; import java.security.PrivilegedAction; import java.util.Iterator; -import sun.misc.Service; -import sun.misc.ServiceConfigurationError; - +import java.util.ServiceLoader; +import java.util.ServiceConfigurationError; // These imports needed only as a workaround for a JavaDoc bug import java.lang.RuntimePermission; @@ -274,12 +273,14 @@ public abstract class Preferences { private static PreferencesFactory factory1() { // 2. Try service provider interface - Iterator i = Service.providers(PreferencesFactory.class, - ClassLoader.getSystemClassLoader()); + Iterator itr = ServiceLoader + .load(PreferencesFactory.class, ClassLoader.getSystemClassLoader()) + .iterator(); + // choose first provider instance - while (i.hasNext()) { + while (itr.hasNext()) { try { - return (PreferencesFactory) i.next(); + return itr.next(); } catch (ServiceConfigurationError sce) { if (sce.getCause() instanceof SecurityException) { // Ignore the security exception, try the next provider diff --git a/src/solaris/native/sun/nio/ch/FileChannelImpl.c b/src/solaris/native/sun/nio/ch/FileChannelImpl.c index 897ad488e949a13f67bfec8cfd8f9f29eb7f7909..6110143de7bcf834067f9b88566e17b08cc3d899 100644 --- a/src/solaris/native/sun/nio/ch/FileChannelImpl.c +++ b/src/solaris/native/sun/nio/ch/FileChannelImpl.c @@ -31,6 +31,7 @@ #include #include "sun_nio_ch_FileChannelImpl.h" #include "java_lang_Integer.h" +#include "java_lang_Long.h" #include "nio.h" #include "nio_util.h" #include @@ -291,7 +292,11 @@ Java_sun_nio_ch_FileChannelImpl_lock0(JNIEnv *env, jobject this, jobject fdo, struct flock64 fl; fl.l_whence = SEEK_SET; - fl.l_len = (off64_t)size; + if (size == (jlong)java_lang_Long_MAX_VALUE) { + fl.l_len = (off64_t)0; + } else { + fl.l_len = (off64_t)size; + } fl.l_start = (off64_t)pos; if (shared == JNI_TRUE) { fl.l_type = F_RDLCK; @@ -325,7 +330,11 @@ Java_sun_nio_ch_FileChannelImpl_release0(JNIEnv *env, jobject this, int cmd = F_SETLK64; fl.l_whence = SEEK_SET; - fl.l_len = (off64_t)size; + if (size == (jlong)java_lang_Long_MAX_VALUE) { + fl.l_len = (off64_t)0; + } else { + fl.l_len = (off64_t)size; + } fl.l_start = (off64_t)pos; fl.l_type = F_UNLCK; lockResult = fcntl(fd, cmd, &fl); diff --git a/test/java/nio/Buffer/StringCharBufferSliceTest.java b/test/java/nio/Buffer/StringCharBufferSliceTest.java index 56770025c32d2c8f35b8c1acc508c5e0a338699a..82d593c5d70b923b5cbd65d9194d4a6ebaca7c38 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!"); }