diff options
author | Per Bothner <per@bothner.com> | 2004-02-16 12:00:33 -0800 |
---|---|---|
committer | Per Bothner <bothner@gcc.gnu.org> | 2004-02-16 12:00:33 -0800 |
commit | 35d0b14df6995e79e84201c45d49ef986f9e0b77 (patch) | |
tree | b053bce2ad70d769c220be5941b4cd3ae9fdccaf /libjava/java/nio/DirectByteBufferImpl.java | |
parent | 5693912a7d109bb281efb8bf2ce107a6b516fc1f (diff) | |
download | gcc-35d0b14df6995e79e84201c45d49ef986f9e0b77.zip gcc-35d0b14df6995e79e84201c45d49ef986f9e0b77.tar.gz gcc-35d0b14df6995e79e84201c45d49ef986f9e0b77.tar.bz2 |
ByteBuffer.java (endian): Make non-private so other java.nio classes can inherit it.
* java/nio/ByteBuffer.java (endian): Make non-private so other
java.nio classes can inherit it.
(<init>): Don't bother clearing array_offset.
* java/nio/ByteBuffer.java (allocate): Re-implement using wrap.
* java/nio/ByteBuffer.java (get(byte[],int,int)): Check underflow.
Remove redundant test.
* java/nio/ByteBufferImpl.java (asCharBuffer, asShortBuffer,
asIntBuffer, asLongBuffer, asFloatBuffer, asDoubleBuffer):
Use new XxxViewBufferImpl constructors.
* java/nio/MappedByteBufferImpl.java: Likewise.
* java/nio/DirectByteBufferImpl.java: Likewise.
* java/nio/ByteBufferImpl.java: Remove one constructor.
Inline super in remaining constructor.
* java/nio/ByteBuffer.java: Remove unused constructor.
* java/nio/ByteBufferImpl.java (shiftDown): New optimized method.
* java/nio/ByteBufferImpl.java (get, put): Add array_offset.
* java/nio/DirectByteBufferImpl.java (owner): New field.
(offset): Remove unused field.
(<init>): Modify one and add another constructor. Change callers.
(allocateDirect): Removed - not used.
(getImpl, putImpl): Make static and pass address explicitly,
to make them useful for MappedByteBufferImpl.
(get, put): Check for underflow. Modify for new getImpl.
(getImpl): New native method where target is array.
(get(byte[],int,int)): Use the above.
(adjustAddress): New static native method.
(slice, duplicate, asReadOnly): New implementations.
* java/nio/natDirectByteBufferImpl.cc (getImpl, putImpl, shiftDown,
adjustAddress): New or updated native methods.
From-SVN: r77919
Diffstat (limited to 'libjava/java/nio/DirectByteBufferImpl.java')
-rw-r--r-- | libjava/java/nio/DirectByteBufferImpl.java | 138 |
1 files changed, 89 insertions, 49 deletions
diff --git a/libjava/java/nio/DirectByteBufferImpl.java b/libjava/java/nio/DirectByteBufferImpl.java index 37b96a7..ef88d34 100644 --- a/libjava/java/nio/DirectByteBufferImpl.java +++ b/libjava/java/nio/DirectByteBufferImpl.java @@ -52,23 +52,25 @@ class DirectByteBufferImpl extends ByteBuffer } } + /** Used by MappedByteBufferImpl to prevent premature GC. */ + protected Object owner; + RawData address; - private int offset; private boolean readOnly; public DirectByteBufferImpl (RawData address, long len) { - this (address, 0, (int) len, (int) len, 0, -1, false); + this (null, address, (int) len, (int) len, 0, false); } - public DirectByteBufferImpl (RawData address, int offset, int capacity, - int limit, int position, int mark, - boolean readOnly) + public DirectByteBufferImpl (Object owner, RawData address, + int capacity, int limit, + int position, boolean readOnly) { - super (capacity, limit, position, mark); + super (capacity, limit, position, -1); this.address = address; - this.offset = offset; this.readOnly = readOnly; + this.owner = owner; } private static native RawData allocateImpl (int capacity); @@ -79,41 +81,58 @@ class DirectByteBufferImpl extends ByteBuffer freeImpl (address); } - public static ByteBuffer allocateDirect (int capacity) - { - RawData address = allocateImpl (capacity); - - if (address == null) - throw new InternalError ("Not enough memory to create direct buffer"); - - return new DirectByteBufferImpl (address, 0, capacity, capacity, 0, -1, false); - } - - private native byte getImpl (int index); - private native void putImpl (int index, byte value); + static native byte getImpl (RawData address, int index); + static native void putImpl (RawData address, int index, byte value); public byte get () { - byte result = getImpl (position () + offset); - position (position () + 1); + int pos = position(); + if (pos >= limit()) + throw new BufferUnderflowException(); + byte result = getImpl (address, pos); + position (pos + 1); return result; } public byte get (int index) { - return getImpl (index); + if (index >= limit()) + throw new BufferUnderflowException(); + return getImpl (address, index); + } + + static native void getImpl (RawData address, int index, + byte[] dst, int offset, int length); + + public ByteBuffer get (byte[] dst, int offset, int length) + { + if (offset < 0 || length < 0 || offset + length > dst.length) + throw new IndexOutOfBoundsException (); + if (length > remaining()) + throw new BufferUnderflowException(); + + int index = position(); + getImpl(address, index, dst, offset, length); + position(index+length); + + return this; } public ByteBuffer put (byte value) { - putImpl (position (), value); - position (position () + 1); + int pos = position(); + if (pos >= limit()) + throw new BufferUnderflowException(); + putImpl (address, pos, value); + position (pos + 1); return this; } public ByteBuffer put (int index, byte value) { - putImpl (index, value); + if (index >= limit()) + throw new BufferUnderflowException(); + putImpl (address, index, value); return this; } @@ -132,21 +151,42 @@ class DirectByteBufferImpl extends ByteBuffer return this; } - public ByteBuffer duplicate () + public static native RawData adjustAddress(RawData address, int offset); + + public ByteBuffer slice () { - return new DirectByteBufferImpl ( - address, offset, capacity (), limit (), position (), -1, isReadOnly ()); + int rem = remaining(); + return new DirectByteBufferImpl (owner, + adjustAddress(address, position()), + rem, rem, 0, isReadOnly ()); } - public ByteBuffer slice () + private ByteBuffer duplicate (boolean readOnly) + { + int pos = position(); + reset(); + int mark = position(); + position(pos); + DirectByteBufferImpl result + = new DirectByteBufferImpl (owner, address, capacity (), limit (), + pos, readOnly); + if (mark != pos) + { + result.position(mark); + result.mark(); + result.position(pos); + } + return result; + } + + public ByteBuffer duplicate () { - return new DirectByteBufferImpl (address, position () + offset, remaining (), remaining (), 0, -1, isReadOnly ()); + return duplicate(isReadOnly()); } public ByteBuffer asReadOnlyBuffer () { - return new DirectByteBufferImpl ( - address, offset, capacity (), limit (), position (), -1, true); + return duplicate(true); } public boolean isReadOnly () @@ -161,34 +201,34 @@ class DirectByteBufferImpl extends ByteBuffer public CharBuffer asCharBuffer () { - return new CharViewBufferImpl (this, position (), remaining (), remaining (), 0, -1, isReadOnly (), order()); - } - - public DoubleBuffer asDoubleBuffer () - { - return new DoubleViewBufferImpl (this, position (), remaining (), remaining (), 0, -1, isReadOnly (), order()); + return new CharViewBufferImpl (this, remaining() >> 1); } - - public FloatBuffer asFloatBuffer () + + public ShortBuffer asShortBuffer () { - return new FloatViewBufferImpl (this, position (), remaining (), remaining (), 0, -1, isReadOnly (), order()); + return new ShortViewBufferImpl (this, remaining() >> 1); } - + public IntBuffer asIntBuffer () { - return new IntViewBufferImpl (this, position (), remaining (), remaining (), 0, -1, isReadOnly (), order()); + return new IntViewBufferImpl (this, remaining() >> 2); } - + public LongBuffer asLongBuffer () { - return new LongViewBufferImpl (this, position (), remaining (), remaining (), 0, -1, isReadOnly (), order()); + return new LongViewBufferImpl (this, remaining() >> 3); } - - public ShortBuffer asShortBuffer () + + public FloatBuffer asFloatBuffer () { - return new ShortViewBufferImpl (this, position (), remaining (), remaining (), 0, -1, isReadOnly (), order()); + return new FloatViewBufferImpl (this, remaining() >> 2); } - + + public DoubleBuffer asDoubleBuffer () + { + return new DoubleViewBufferImpl (this, remaining() >> 3); + } + final public char getChar () { return ByteBufferHelper.getChar(this, order()); |