]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ByteBuffer.java (endian): Make non-private so other java.nio classes can inherit it.
authorPer Bothner <per@bothner.com>
Mon, 16 Feb 2004 20:00:33 +0000 (12:00 -0800)
committerPer Bothner <bothner@gcc.gnu.org>
Mon, 16 Feb 2004 20:00:33 +0000 (12:00 -0800)
* 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

libjava/ChangeLog
libjava/java/nio/ByteBuffer.java
libjava/java/nio/ByteBufferImpl.java
libjava/java/nio/DirectByteBufferImpl.java
libjava/java/nio/MappedByteBufferImpl.java
libjava/java/nio/natDirectByteBufferImpl.cc

index 5352ffa4ac1013aebb394a07ea9c0762c5f7f3e9..9e7199860a1f1f20139391c4f3dbde2057d1f49c 100644 (file)
        * java/nio/IntViewBufferImpl.java:  Likewise.
        * java/nio/LongViewBufferImpl.java:  Likewise.
        * java/nio/ShortViewBufferImpl.java:  Likewise.
+       
+       * 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.
 
 2004-02-15  Ito Kazumitsu  <kaz@maczuka.gcd.org>
 
index 9ca20618c457b52023804a3c1388309da0f5d9da..276b2dbcb81fdabf54c8ad816b2f1511f5916c4b 100644 (file)
@@ -44,7 +44,7 @@ package java.nio;
 public abstract class ByteBuffer extends Buffer
   implements Comparable
 {
-  private ByteOrder endian = ByteOrder.BIG_ENDIAN;
+  ByteOrder endian = ByteOrder.BIG_ENDIAN;
 
   int array_offset;
   byte[] backing_buffer;
@@ -52,16 +52,8 @@ public abstract class ByteBuffer extends Buffer
   ByteBuffer (int capacity, int limit, int position, int mark)
   {
     super (capacity, limit, position, mark);
-    array_offset = 0;
   }
 
-  ByteBuffer (byte[] buffer, int offset, int capacity, int limit, int position, int mark)
-  {
-    super (capacity, limit, position, mark);
-    this.backing_buffer = buffer;
-    this.array_offset = offset;
-  }
-  
   /**
    * Allocates a new direct byte buffer.
    */ 
@@ -75,7 +67,7 @@ public abstract class ByteBuffer extends Buffer
    */
   public static ByteBuffer allocate (int capacity)
   {
-    return new ByteBufferImpl (capacity);
+    return wrap(new byte[capacity], 0, capacity);
   }
 
   /**
@@ -87,6 +79,14 @@ public abstract class ByteBuffer extends Buffer
    */
   final public static ByteBuffer wrap (byte[] array, int offset, int length)
   {
+    // FIXME: In GCJ and other implementations where arrays may not
+    // move we might consider, at least when offset==0:
+    // return new DirectByteBufferImpl(array,
+    //                                 address_of_data(array) + offset,
+    //                                 length, length, 0, false);
+    // This may be more efficient, mainly because we can then use the
+    // same logic for all ByteBuffers.
+
     return new ByteBufferImpl (array, 0, array.length, offset + length, offset, -1, false);
   }
 
@@ -116,11 +116,10 @@ public abstract class ByteBuffer extends Buffer
    */
   public ByteBuffer get (byte[] dst, int offset, int length)
   {
-    if ((offset < 0)
-        || (offset > dst.length)
-        || (length < 0)
-        || (length > (dst.length - offset)))
+    if (offset < 0 || length < 0 || offset + length > dst.length)
       throw new IndexOutOfBoundsException ();
+    if (length > remaining())
+      throw new BufferUnderflowException();
 
     for (int i = offset; i < offset + length; i++)
       {
index 6a3814862c986fcf21994001343903b96e6feeff..5d3c3d31a86ba29ddcffc97611f7f889a88c337d 100644 (file)
@@ -45,45 +45,42 @@ final class ByteBufferImpl extends ByteBuffer
 {
   private boolean readOnly;
 
-  ByteBufferImpl (int capacity)
-  {
-    this (new byte [capacity], 0, capacity, capacity, 0, -1, false);
-  }
-  
   ByteBufferImpl (byte[] buffer, int offset, int capacity, int limit, int position, int mark, boolean readOnly)
   {
-    super (buffer, offset, capacity, limit, position, mark);
+    super (capacity, limit, position, mark);
+    this.backing_buffer = buffer;
+    this.array_offset = offset;
     this.readOnly = readOnly;
   }
   
   public CharBuffer asCharBuffer ()
   {
-    return new CharViewBufferImpl (this, position (), remaining(), remaining (), 0, -1, isReadOnly (), order());
+    return new CharViewBufferImpl (this, remaining() >> 1);
   }
 
   public ShortBuffer asShortBuffer ()
   {
-    return new ShortViewBufferImpl (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 FloatBuffer asFloatBuffer ()
   {
-    return new FloatViewBufferImpl (this, position (), remaining(), remaining (), 0, -1, isReadOnly (), order());
+    return new FloatViewBufferImpl (this, remaining() >> 2);
   }
 
   public DoubleBuffer asDoubleBuffer ()
   {
-    return new DoubleViewBufferImpl (this, position (), remaining(), remaining (), 0, -1, isReadOnly (), order());
+    return new DoubleViewBufferImpl (this, remaining() >> 3);
   }
 
   public boolean isReadOnly ()
@@ -106,6 +103,13 @@ final class ByteBufferImpl extends ByteBuffer
     return new ByteBufferImpl (backing_buffer, array_offset, capacity (), limit (), position (), mark, true);
   }
   
+  void shiftDown (int dst_offset, int src_offset, int count)
+  {
+    System.arraycopy(backing_buffer, array_offset + src_offset,
+                    backing_buffer, array_offset + dst_offset,
+                    count);
+  }
+
   public ByteBuffer compact ()
   {
     int pos = position();
@@ -129,7 +133,7 @@ final class ByteBufferImpl extends ByteBuffer
    */
   final public byte get ()
   {
-    byte result = backing_buffer [position ()];
+    byte result = backing_buffer [position () + array_offset];
     position (position () + 1);
     return result;
   }
@@ -144,9 +148,10 @@ final class ByteBufferImpl extends ByteBuffer
   {
     if (readOnly)
       throw new ReadOnlyBufferException ();
-                   
-    backing_buffer [position ()] = value;
-    position (position () + 1);
+
+    int pos = position();
+    backing_buffer [pos + array_offset] = value;
+    position (pos + 1);
     return this;
   }
   
@@ -159,7 +164,7 @@ final class ByteBufferImpl extends ByteBuffer
    */
   final public byte get (int index)
   {
-    return backing_buffer [index];
+    return backing_buffer [index + array_offset];
   }
   
   /**
@@ -175,7 +180,7 @@ final class ByteBufferImpl extends ByteBuffer
     if (readOnly)
       throw new ReadOnlyBufferException ();
            
-    backing_buffer [index] = value;
+    backing_buffer [index + array_offset] = value;
     return this;
   }
   
index 37b96a7c02eb94c1bc61943aa0e64bdc0255ab3c..ef88d34a701fb4bf596eb142c7f4f7c45aaf5bf6 100644 (file)
@@ -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());
index f1d892f146fa8ce79db94347d529e06d451ced41..5b02ef3c9112b91738644b48e47da48fc052f823 100644 (file)
@@ -144,32 +144,32 @@ public class MappedByteBufferImpl extends MappedByteBuffer
 
   public CharBuffer asCharBuffer ()
   {
-    return new CharViewBufferImpl (this, position (), remaining(), remaining (), 0, -1, isReadOnly (), order());
+    return new CharViewBufferImpl (this, remaining() >> 1);
   }
 
   public ShortBuffer asShortBuffer ()
   {
-    return new ShortViewBufferImpl (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 FloatBuffer asFloatBuffer ()
   {
-    return new FloatViewBufferImpl (this, position (), remaining(), remaining (), 0, -1, isReadOnly (), order());
+    return new FloatViewBufferImpl (this, remaining() >> 2);
   }
 
   public DoubleBuffer asDoubleBuffer ()
   {
-    return new DoubleViewBufferImpl (this, position (), remaining(), remaining (), 0, -1, isReadOnly (), order());
+    return new DoubleViewBufferImpl (this, remaining() >> 3);
   }
 
   final public char getChar ()
index 7ff06ffa030849c8e1275d5534706983421309c0..94225c3988521e3d3d1b83343b3433035e0a6854 100644 (file)
@@ -1,6 +1,6 @@
 // natDirectByteBufferImpl.cc
 
-/* Copyright (C) 2003  Free Software Foundation
+/* Copyright (C) 2003, 2004  Free Software Foundation
 
    This file is part of libgcj.
 
@@ -18,7 +18,10 @@ details.  */
 #include <gnu/gcj/RawData.h>
 #include <java/nio/DirectByteBufferImpl.h>
 
-gnu::gcj::RawData*
+using gnu::gcj::RawData;
+using java::nio::DirectByteBufferImpl;
+
+RawData*
 java::nio::DirectByteBufferImpl::allocateImpl (jint capacity)
 {
   return reinterpret_cast<gnu::gcj::RawData*> (::malloc (capacity));
@@ -31,24 +34,40 @@ java::nio::DirectByteBufferImpl::freeImpl (gnu::gcj::RawData* address)
 }
 
 jbyte
-java::nio::DirectByteBufferImpl::getImpl (jint index)
+DirectByteBufferImpl::getImpl (RawData* address, jint index)
 {
-  jbyte* pointer = reinterpret_cast<jbyte*> (address) + offset + index;
+  jbyte* pointer = reinterpret_cast<jbyte*> (address) + index;
   return *pointer;
 }
 
 void
-java::nio::DirectByteBufferImpl::putImpl (jint index, jbyte value)
+DirectByteBufferImpl::getImpl (RawData* address, jint index,
+                              jbyteArray dst, jint offset, jint length)
+{
+  jbyte* src = reinterpret_cast<jbyte*> (address) + index;
+  memcpy (elements (dst) + offset, src, length);
+}
+
+void
+java::nio::DirectByteBufferImpl::putImpl (gnu::gcj::RawData* address,
+                                         jint index, jbyte value)
 {
-  jbyte* pointer = reinterpret_cast<jbyte*> (address) + offset + index;
+  jbyte* pointer = reinterpret_cast<jbyte*> (address) + index;
   *pointer = value;
 }
 
+RawData*
+java::nio::DirectByteBufferImpl::adjustAddress (RawData* address, jint offset)
+{
+  jbyte* start = reinterpret_cast<jbyte*> (address) + offset;
+  return reinterpret_cast<RawData*>(start);
+}
+
 void
 java::nio::DirectByteBufferImpl::shiftDown
 (jint dst_offset, jint src_offset, jint count)
 {
-  jbyte* dst = reinterpret_cast<jbyte*> (address) + offset + dst_offset;
-  jbyte* src = reinterpret_cast<jbyte*> (address) + offset + src_offset;
+  jbyte* dst = reinterpret_cast<jbyte*> (address) + array_offset + dst_offset;
+  jbyte* src = reinterpret_cast<jbyte*> (address) + array_offset + src_offset;
   ::memmove(dst, src, count);
 }