You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by va...@apache.org on 2007/04/12 17:27:51 UTC

svn commit: r527979 - in /harmony/enhanced: classlib/trunk/modules/nio/src/main/java/java/nio/ classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/ classlib/trunk/modules/nio/src/main/native/nio/shared/ drlvm/trunk/src/test/regress...

Author: varlax
Date: Thu Apr 12 08:27:49 2007
New Revision: 527979

URL: http://svn.apache.org/viewvc?view=rev&rev=527979
Log:
Fixed HARMONY-3591, HARMONY-3638 [classlib][nio] Flawed JNI support for direct buffer views
Regression test is added to DRLVM module.

Modified:
    harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/CharToByteBufferAdapter.java
    harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/DirectByteBuffer.java
    harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/DoubleToByteBufferAdapter.java
    harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/FloatToByteBufferAdapter.java
    harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/IntToByteBufferAdapter.java
    harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/LongToByteBufferAdapter.java
    harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/MappedByteBufferAdapter.java
    harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/ShortToByteBufferAdapter.java
    harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/DirectBuffer.java
    harmony/enhanced/classlib/trunk/modules/nio/src/main/native/nio/shared/DirectBufferUtil.c
    harmony/enhanced/drlvm/trunk/src/test/regression/H0000/DirectByteBufferTest.c
    harmony/enhanced/drlvm/trunk/src/test/regression/H0000/DirectByteBufferTest.java

Modified: harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/CharToByteBufferAdapter.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/CharToByteBufferAdapter.java?view=diff&rev=527979&r1=527978&r2=527979
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/CharToByteBufferAdapter.java (original)
+++ harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/CharToByteBufferAdapter.java Thu Apr 12 08:27:49 2007
@@ -16,6 +16,8 @@
 
 package java.nio;
 
+import org.apache.harmony.nio.internal.DirectBuffer;
+import org.apache.harmony.luni.platform.PlatformAddress;
 
 
 /**
@@ -31,7 +33,7 @@
  * </p>
  * 
  */
-final class CharToByteBufferAdapter extends CharBuffer {
+final class CharToByteBufferAdapter extends CharBuffer implements DirectBuffer {
 
 	static CharBuffer wrap(ByteBuffer byteBuffer) {
 		return new CharToByteBufferAdapter(byteBuffer.slice());
@@ -44,6 +46,58 @@
 		this.byteBuffer = byteBuffer;
 		this.byteBuffer.clear();
 	}
+        
+        public int getByteCapacity() {
+            if (byteBuffer instanceof DirectBuffer) {
+                return ((DirectBuffer)byteBuffer).getByteCapacity();
+            } else {
+                assert false : byteBuffer;
+                return -1;
+            }            
+        }
+        
+        public PlatformAddress getEffectiveAddress() {
+            if (byteBuffer instanceof DirectBuffer) {
+                return ((DirectBuffer)byteBuffer).getEffectiveAddress();
+            } else {
+                assert false : byteBuffer;
+                return null;
+            }
+        }
+
+        public PlatformAddress getBaseAddress() {
+            if (byteBuffer instanceof DirectBuffer) {
+                return ((DirectBuffer)byteBuffer).getBaseAddress();
+            } else {
+                assert false : byteBuffer;
+                return null;
+            }
+        }
+            
+        public boolean isAddressValid() {
+            if (byteBuffer instanceof DirectBuffer) {
+                return ((DirectBuffer)byteBuffer).isAddressValid();
+            } else {
+                assert false : byteBuffer;
+                return false;
+            }
+        }
+
+        public void addressValidityCheck() {
+            if (byteBuffer instanceof DirectBuffer) {
+                ((DirectBuffer)byteBuffer).addressValidityCheck();
+            } else {
+                assert false : byteBuffer;
+            }
+        }
+            
+        public void free() {
+            if (byteBuffer instanceof DirectBuffer) {
+                ((DirectBuffer)byteBuffer).free();
+            } else {
+                assert false : byteBuffer;
+            }   
+        }
 
 	public CharBuffer asReadOnlyBuffer() {
 		CharToByteBufferAdapter buf = new CharToByteBufferAdapter(byteBuffer

Modified: harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/DirectByteBuffer.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/DirectByteBuffer.java?view=diff&rev=527979&r1=527978&r2=527979
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/DirectByteBuffer.java (original)
+++ harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/DirectByteBuffer.java Thu Apr 12 08:27:49 2007
@@ -269,4 +269,8 @@
     final protected boolean protectedHasArray() {
         return false;
     }
+    
+    public final int getByteCapacity() {
+        return capacity;
+    }
 }

Modified: harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/DoubleToByteBufferAdapter.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/DoubleToByteBufferAdapter.java?view=diff&rev=527979&r1=527978&r2=527979
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/DoubleToByteBufferAdapter.java (original)
+++ harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/DoubleToByteBufferAdapter.java Thu Apr 12 08:27:49 2007
@@ -16,6 +16,8 @@
 
 package java.nio;
 
+import org.apache.harmony.nio.internal.DirectBuffer;
+import org.apache.harmony.luni.platform.PlatformAddress;
 
 
 /**
@@ -31,7 +33,7 @@
  * </p>
  * 
  */
-final class DoubleToByteBufferAdapter extends DoubleBuffer {
+final class DoubleToByteBufferAdapter extends DoubleBuffer implements DirectBuffer {
 
 	static DoubleBuffer wrap(ByteBuffer byteBuffer) {
 		return new DoubleToByteBufferAdapter(byteBuffer.slice());
@@ -44,6 +46,58 @@
 		this.byteBuffer = byteBuffer;
 		this.byteBuffer.clear();
 	}
+
+        public int getByteCapacity() {
+            if (byteBuffer instanceof DirectBuffer) {
+                return ((DirectBuffer)byteBuffer).getByteCapacity();
+            } else {
+                assert false : byteBuffer;
+                return -1;
+            }            
+        }
+
+        public PlatformAddress getEffectiveAddress() {
+            if (byteBuffer instanceof DirectBuffer) {
+                return ((DirectBuffer)byteBuffer).getEffectiveAddress();
+            } else {
+                assert false : byteBuffer;
+                return null;
+            }
+        }
+
+        public PlatformAddress getBaseAddress() {
+            if (byteBuffer instanceof DirectBuffer) {
+                return ((DirectBuffer)byteBuffer).getBaseAddress();
+            } else {
+                assert false : byteBuffer;
+                return null;
+            }
+        }
+            
+        public boolean isAddressValid() {
+            if (byteBuffer instanceof DirectBuffer) {
+                return ((DirectBuffer)byteBuffer).isAddressValid();
+            } else {
+                assert false : byteBuffer;
+                return false;
+            }
+        }
+
+        public void addressValidityCheck() {
+            if (byteBuffer instanceof DirectBuffer) {
+                ((DirectBuffer)byteBuffer).addressValidityCheck();
+            } else {
+                assert false : byteBuffer;
+            }
+        }
+            
+        public void free() {
+            if (byteBuffer instanceof DirectBuffer) {
+                ((DirectBuffer)byteBuffer).free();
+            } else {
+                assert false : byteBuffer;
+            }   
+        }
 
 	public DoubleBuffer asReadOnlyBuffer() {
 		DoubleToByteBufferAdapter buf = new DoubleToByteBufferAdapter(

Modified: harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/FloatToByteBufferAdapter.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/FloatToByteBufferAdapter.java?view=diff&rev=527979&r1=527978&r2=527979
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/FloatToByteBufferAdapter.java (original)
+++ harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/FloatToByteBufferAdapter.java Thu Apr 12 08:27:49 2007
@@ -16,6 +16,8 @@
 
 package java.nio;
 
+import org.apache.harmony.nio.internal.DirectBuffer;
+import org.apache.harmony.luni.platform.PlatformAddress;
 
 
 /**
@@ -31,7 +33,7 @@
  * </p>
  * 
  */
-final class FloatToByteBufferAdapter extends FloatBuffer {
+final class FloatToByteBufferAdapter extends FloatBuffer implements DirectBuffer {
 
 	static FloatBuffer wrap(ByteBuffer byteBuffer) {
 		return new FloatToByteBufferAdapter(byteBuffer.slice());
@@ -44,6 +46,58 @@
 		this.byteBuffer = byteBuffer;
 		this.byteBuffer.clear();
 	}
+
+        public int getByteCapacity() {
+            if (byteBuffer instanceof DirectBuffer) {
+                return ((DirectBuffer)byteBuffer).getByteCapacity();
+            } else {
+                assert false : byteBuffer;
+                return -1;
+            }            
+        }
+
+        public PlatformAddress getEffectiveAddress() {
+            if (byteBuffer instanceof DirectBuffer) {
+                return ((DirectBuffer)byteBuffer).getEffectiveAddress();
+            } else {
+                assert false : byteBuffer;
+                return null;
+            }
+        }
+
+        public PlatformAddress getBaseAddress() {
+            if (byteBuffer instanceof DirectBuffer) {
+                return ((DirectBuffer)byteBuffer).getBaseAddress();
+            } else {
+                assert false : byteBuffer;
+                return null;
+            }
+        }
+            
+        public boolean isAddressValid() {
+            if (byteBuffer instanceof DirectBuffer) {
+                return ((DirectBuffer)byteBuffer).isAddressValid();
+            } else {
+                assert false : byteBuffer;
+                return false;
+            }
+        }
+
+        public void addressValidityCheck() {
+            if (byteBuffer instanceof DirectBuffer) {
+                ((DirectBuffer)byteBuffer).addressValidityCheck();
+            } else {
+                assert false : byteBuffer;
+            }
+        }
+            
+        public void free() {
+            if (byteBuffer instanceof DirectBuffer) {
+                ((DirectBuffer)byteBuffer).free();
+            } else {
+                assert false : byteBuffer;
+            }   
+        }
 
 	public FloatBuffer asReadOnlyBuffer() {
 		FloatToByteBufferAdapter buf = new FloatToByteBufferAdapter(byteBuffer

Modified: harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/IntToByteBufferAdapter.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/IntToByteBufferAdapter.java?view=diff&rev=527979&r1=527978&r2=527979
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/IntToByteBufferAdapter.java (original)
+++ harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/IntToByteBufferAdapter.java Thu Apr 12 08:27:49 2007
@@ -16,6 +16,8 @@
 
 package java.nio;
 
+import org.apache.harmony.nio.internal.DirectBuffer;
+import org.apache.harmony.luni.platform.PlatformAddress;
 
 
 /**
@@ -31,7 +33,7 @@
  * </p>
  * 
  */
-final class IntToByteBufferAdapter extends IntBuffer {
+final class IntToByteBufferAdapter extends IntBuffer implements DirectBuffer {
 
 	static IntBuffer wrap(ByteBuffer byteBuffer) {
 		return new IntToByteBufferAdapter(byteBuffer.slice());
@@ -44,6 +46,59 @@
 		this.byteBuffer = byteBuffer;
 		this.byteBuffer.clear();
 	}
+        
+        public int getByteCapacity() {
+            if (byteBuffer instanceof DirectBuffer) {
+                return ((DirectBuffer)byteBuffer).getByteCapacity();
+            } else {
+                assert false : byteBuffer;
+                return -1;
+            }            
+        }
+
+        public PlatformAddress getEffectiveAddress() {
+            if (byteBuffer instanceof DirectBuffer) {
+                return ((DirectBuffer)byteBuffer).getEffectiveAddress();
+            } else {
+                assert false : byteBuffer;
+                return null;
+            }
+        }
+            
+        public PlatformAddress getBaseAddress() {
+            if (byteBuffer instanceof DirectBuffer) {
+                return ((DirectBuffer)byteBuffer).getBaseAddress();
+            } else {
+                assert false : byteBuffer;
+                return null;
+            }
+        }
+            
+        public boolean isAddressValid() {
+            if (byteBuffer instanceof DirectBuffer) {
+                return ((DirectBuffer)byteBuffer).isAddressValid();
+            } else {
+                assert false : byteBuffer;
+                return false;
+            }
+        }
+
+        public void addressValidityCheck() {
+            if (byteBuffer instanceof DirectBuffer) {
+                ((DirectBuffer)byteBuffer).addressValidityCheck();
+            } else {
+                assert false : byteBuffer;
+            }
+        }
+            
+        public void free() {
+            if (byteBuffer instanceof DirectBuffer) {
+                ((DirectBuffer)byteBuffer).free();
+            } else {
+                assert false : byteBuffer;
+            }   
+        }
+
 
 	public IntBuffer asReadOnlyBuffer() {
 		IntToByteBufferAdapter buf = new IntToByteBufferAdapter(byteBuffer

Modified: harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/LongToByteBufferAdapter.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/LongToByteBufferAdapter.java?view=diff&rev=527979&r1=527978&r2=527979
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/LongToByteBufferAdapter.java (original)
+++ harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/LongToByteBufferAdapter.java Thu Apr 12 08:27:49 2007
@@ -16,6 +16,8 @@
 
 package java.nio;
 
+import org.apache.harmony.nio.internal.DirectBuffer;
+import org.apache.harmony.luni.platform.PlatformAddress;
 
 
 /**
@@ -31,7 +33,7 @@
  * </p>
  * 
  */
-final class LongToByteBufferAdapter extends LongBuffer {
+final class LongToByteBufferAdapter extends LongBuffer implements DirectBuffer {
 
 	static LongBuffer wrap(ByteBuffer byteBuffer) {
 		return new LongToByteBufferAdapter(byteBuffer.slice());
@@ -44,6 +46,58 @@
 		this.byteBuffer = byteBuffer;
 		this.byteBuffer.clear();
 	}
+        
+        public int getByteCapacity() {
+            if (byteBuffer instanceof DirectBuffer) {
+                return ((DirectBuffer)byteBuffer).getByteCapacity();
+            } else {
+                assert false : byteBuffer;
+                return -1;
+            }            
+        }
+
+        public PlatformAddress getEffectiveAddress() {
+            if (byteBuffer instanceof DirectBuffer) {
+                return ((DirectBuffer)byteBuffer).getEffectiveAddress();
+            } else {
+                assert false : byteBuffer;
+                return null;
+            }
+        }
+
+        public PlatformAddress getBaseAddress() {
+            if (byteBuffer instanceof DirectBuffer) {
+                return ((DirectBuffer)byteBuffer).getBaseAddress();
+            } else {
+                assert false : byteBuffer;
+                return null;
+            }
+        }
+            
+        public boolean isAddressValid() {
+            if (byteBuffer instanceof DirectBuffer) {
+                return ((DirectBuffer)byteBuffer).isAddressValid();
+            } else {
+                assert false : byteBuffer;
+                return false;
+            }
+        }
+
+        public void addressValidityCheck() {
+            if (byteBuffer instanceof DirectBuffer) {
+                ((DirectBuffer)byteBuffer).addressValidityCheck();
+            } else {
+                assert false : byteBuffer;
+            }
+        }
+            
+        public void free() {
+            if (byteBuffer instanceof DirectBuffer) {
+                ((DirectBuffer)byteBuffer).free();
+            } else {
+                assert false : byteBuffer;
+            }   
+        }
 
 	public LongBuffer asReadOnlyBuffer() {
 		LongToByteBufferAdapter buf = new LongToByteBufferAdapter(byteBuffer

Modified: harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/MappedByteBufferAdapter.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/MappedByteBufferAdapter.java?view=diff&rev=527979&r1=527978&r2=527979
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/MappedByteBufferAdapter.java (original)
+++ harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/MappedByteBufferAdapter.java Thu Apr 12 08:27:49 2007
@@ -360,4 +360,8 @@
 		((MappedPlatformAddress)this.wrapped.getBaseAddress()).free();
 		this.wrapped.free();
 	}
+        
+        public int getByteCapacity() {
+            return wrapped.getByteCapacity();
+        }
 }

Modified: harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/ShortToByteBufferAdapter.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/ShortToByteBufferAdapter.java?view=diff&rev=527979&r1=527978&r2=527979
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/ShortToByteBufferAdapter.java (original)
+++ harmony/enhanced/classlib/trunk/modules/nio/src/main/java/java/nio/ShortToByteBufferAdapter.java Thu Apr 12 08:27:49 2007
@@ -16,6 +16,8 @@
 
 package java.nio;
 
+import org.apache.harmony.nio.internal.DirectBuffer;
+import org.apache.harmony.luni.platform.PlatformAddress;
 
 
 /**
@@ -31,7 +33,7 @@
  * </p>
  * 
  */
-final class ShortToByteBufferAdapter extends ShortBuffer {
+final class ShortToByteBufferAdapter extends ShortBuffer implements DirectBuffer {
 
 	static ShortBuffer wrap(ByteBuffer byteBuffer) {
 		return new ShortToByteBufferAdapter(byteBuffer.slice());
@@ -44,6 +46,58 @@
 		this.byteBuffer = byteBuffer;
 		this.byteBuffer.clear();
 	}
+
+        public int getByteCapacity() {
+            if (byteBuffer instanceof DirectBuffer) {
+                return ((DirectBuffer)byteBuffer).getByteCapacity();
+            } else {
+                assert false : byteBuffer;
+                return -1;
+            }            
+        }
+
+        public PlatformAddress getEffectiveAddress() {
+            if (byteBuffer instanceof DirectBuffer) {
+                return ((DirectBuffer)byteBuffer).getEffectiveAddress();
+            } else {
+                assert false : byteBuffer;
+                return null;
+            }
+        }
+
+        public PlatformAddress getBaseAddress() {
+            if (byteBuffer instanceof DirectBuffer) {
+                return ((DirectBuffer)byteBuffer).getBaseAddress();
+            } else {
+                assert false : byteBuffer;
+                return null;
+            }
+        }
+            
+        public boolean isAddressValid() {
+            if (byteBuffer instanceof DirectBuffer) {
+                return ((DirectBuffer)byteBuffer).isAddressValid();
+            } else {
+                assert false : byteBuffer;
+                return false;
+            }
+        }
+
+        public void addressValidityCheck() {
+            if (byteBuffer instanceof DirectBuffer) {
+                ((DirectBuffer)byteBuffer).addressValidityCheck();
+            } else {
+                assert false : byteBuffer;
+            }
+        }
+            
+        public void free() {
+            if (byteBuffer instanceof DirectBuffer) {
+                ((DirectBuffer)byteBuffer).free();
+            } else {
+                assert false : byteBuffer;
+            }   
+        }
 
 	public ShortBuffer asReadOnlyBuffer() {
 		ShortToByteBufferAdapter buf = new ShortToByteBufferAdapter(byteBuffer

Modified: harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/DirectBuffer.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/DirectBuffer.java?view=diff&rev=527979&r1=527978&r2=527979
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/DirectBuffer.java (original)
+++ harmony/enhanced/classlib/trunk/modules/nio/src/main/java/org/apache/harmony/nio/internal/DirectBuffer.java Thu Apr 12 08:27:49 2007
@@ -18,13 +18,16 @@
 import org.apache.harmony.luni.platform.PlatformAddress;
 
 public interface DirectBuffer {
-	public PlatformAddress getEffectiveAddress();
     
-    public PlatformAddress getBaseAddress();
+    PlatformAddress getEffectiveAddress();
     
-    public boolean isAddressValid();
+    PlatformAddress getBaseAddress();
     
-    public void addressValidityCheck();
+    boolean isAddressValid();
     
-    public void free();
+    void addressValidityCheck();
+    
+    void free();
+    
+    int getByteCapacity();
 }

Modified: harmony/enhanced/classlib/trunk/modules/nio/src/main/native/nio/shared/DirectBufferUtil.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/nio/src/main/native/nio/shared/DirectBufferUtil.c?view=diff&rev=527979&r1=527978&r2=527979
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/nio/src/main/native/nio/shared/DirectBufferUtil.c (original)
+++ harmony/enhanced/classlib/trunk/modules/nio/src/main/native/nio/shared/DirectBufferUtil.c Thu Apr 12 08:27:49 2007
@@ -99,9 +99,8 @@
  */
 JNIEXPORT jlong JNICALL GetDirectBufferCapacity
   (JNIEnv * env, jobject buf){
-	  jfieldID fieldCapacity;
+	  jmethodID methodCapacity;
 	  jclass directBufferClass;
-	  jclass bufferClass;
           directBufferClass = (*env)->FindClass (env, "org/apache/harmony/nio/internal/DirectBuffer");
 	  if (!directBufferClass){
 	      	  return -1;
@@ -109,14 +108,10 @@
 	  if (JNI_FALSE == (*env)->IsInstanceOf(env, buf, directBufferClass)){
 		  return -1;
 	  }
-	  bufferClass = (*env)->FindClass (env, "java/nio/Buffer");
-	  if (!bufferClass){
+	  methodCapacity = (*env)->GetMethodID (env, directBufferClass, "getByteCapacity",
+             "()I");
+	  if (!methodCapacity){
 	      	  return -1;
 	  }
-	  fieldCapacity = (*env)->GetFieldID (env, bufferClass, "capacity",
-             "I");
-	  if (!fieldCapacity){
-	      	  return -1;
-	  }
-	  return (*env)->GetIntField(env, buf, fieldCapacity);
+	  return (jlong)(*env)->CallIntMethod(env, buf, methodCapacity);
   }

Modified: harmony/enhanced/drlvm/trunk/src/test/regression/H0000/DirectByteBufferTest.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H0000/DirectByteBufferTest.c?view=diff&rev=527979&r1=527978&r2=527979
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H0000/DirectByteBufferTest.c (original)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H0000/DirectByteBufferTest.c Thu Apr 12 08:27:49 2007
@@ -3,17 +3,15 @@
 #include <stdlib.h>
 #include <string.h>
 
-JNIEXPORT jstring JNICALL Java_org_apache_harmony_drlvm_tests_regression_h0000_DirectByteBufferTest_testValidBuffer0
-  (JNIEnv *, jobject);
+JNIEXPORT jstring JNICALL Java_org_apache_harmony_drlvm_tests_regression_h0000_DirectByteBufferTest_tryDirectBuffer
+  (JNIEnv *, jclass);
 
+JNIEXPORT jstring JNICALL Java_org_apache_harmony_drlvm_tests_regression_h0000_DirectByteBufferTest_checkSameDirectStorage
+(JNIEnv *, jclass, jobject, jobject);
 
-/*
- * Class:     DirectByteBufferTest
- * Method:    testValidBuffer0
- * Signature: ()Ljava/lang/String;
- */
-JNIEXPORT jstring JNICALL Java_org_apache_harmony_drlvm_tests_regression_h0000_DirectByteBufferTest_testValidBuffer0
-  (JNIEnv *jenv, jobject unused)
+
+JNIEXPORT jstring JNICALL Java_org_apache_harmony_drlvm_tests_regression_h0000_DirectByteBufferTest_tryDirectBuffer
+  (JNIEnv *jenv, jclass unused)
 {
     char* error = (char*)calloc(256, 1);
     const jlong BUF_SIZE = 100;
@@ -38,12 +36,35 @@
                 "GetDirectBufferAddress() returned %p\n"
                 "GetDirectBufferCapacity() returned %d\n", addr, size);
         } else {
-            sprintf(error, "no NIO support\n");
+            sprintf(error, "no JNI NIO support\n");
         }
     }
 
     jstr = strlen(error) ? (*jenv)->NewStringUTF(jenv, error) : NULL;
     free(buf);
+    free(error);
+
+    return jstr;
+}
+
+JNIEXPORT jstring JNICALL Java_org_apache_harmony_drlvm_tests_regression_h0000_DirectByteBufferTest_checkSameDirectStorage
+(JNIEnv *jenv, jclass unused, jobject jbuf1, jobject jbuf2)
+{
+    char* error = (char*)calloc(256, 1);
+    void* addr1 = (*jenv)->GetDirectBufferAddress(jenv, jbuf1);
+    void* addr2 = (*jenv)->GetDirectBufferAddress(jenv, jbuf2);
+    jlong size1 = (*jenv)->GetDirectBufferCapacity(jenv, jbuf1);
+    jlong size2 = (*jenv)->GetDirectBufferCapacity(jenv, jbuf2);
+    jstring jstr;
+    if (addr1 != addr2) {
+        sprintf(error, "buffer address is not the same: expected %p but was %p\n", addr1, addr2);
+    }
+    if (size1 != size2) {
+        sprintf(error + strlen(error), 
+            "buffer capacity is not the same: expected %d but was %d\n", size1, size2);
+    }
+
+    jstr = strlen(error) ? (*jenv)->NewStringUTF(jenv, error) : NULL;
     free(error);
 
     return jstr;

Modified: harmony/enhanced/drlvm/trunk/src/test/regression/H0000/DirectByteBufferTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H0000/DirectByteBufferTest.java?view=diff&rev=527979&r1=527978&r2=527979
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H0000/DirectByteBufferTest.java (original)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H0000/DirectByteBufferTest.java Thu Apr 12 08:27:49 2007
@@ -1,5 +1,7 @@
 package org.apache.harmony.drlvm.tests.regression.h0000;
 
+import java.nio.Buffer;
+import java.nio.ByteBuffer;
 import junit.framework.TestCase;
 
 public class DirectByteBufferTest extends TestCase {
@@ -10,9 +12,33 @@
         new DirectByteBufferTest().testValidBuffer();
     }
 
-    private native String testValidBuffer0();
+    private static native String tryDirectBuffer();
+    private static native String checkSameDirectStorage(Buffer b1, Buffer b2);
+    
+    private static void assertView(String message, ByteBuffer b1, Buffer b2, int capacityRatio) {
+        assertEquals(message + ":capacity", b1.capacity()/capacityRatio, b2.capacity());
+        String err = checkSameDirectStorage(b1, b2);
+        assertNull(message + " : " + err, err);
+    }
     
     public void testValidBuffer() {
-        assertNull(testValidBuffer0());
+        String err = tryDirectBuffer();
+        assertNull(err, err);
+    }
+
+    /**
+     * A regression test for HARMONY-3591: 
+     * JNI operations fail on non-byte views of a direct buffer.
+     */
+    public void testBufferView() {
+        ByteBuffer b = ByteBuffer.allocateDirect(100);
+        assertTrue(b.isDirect());
+        assertView("duplicate", b, b.duplicate(), 1);
+        assertView("char view", b, b.asCharBuffer(), 2);
+        assertView("short view", b, b.asShortBuffer(), 2);
+        assertView("int view", b, b.asIntBuffer(), 4);
+        assertView("float view", b, b.asFloatBuffer(), 4);
+        assertView("double view", b, b.asDoubleBuffer(), 8);
+        assertView("long view", b, b.asLongBuffer(), 8);
     }
 }