You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2009/12/07 13:01:12 UTC

svn commit: r887896 - in /commons/sandbox/runtime/trunk/src/main: java/org/apache/commons/runtime/Memory.java native/shared/memory.c

Author: mturk
Date: Mon Dec  7 12:01:12 2009
New Revision: 887896

URL: http://svn.apache.org/viewvc?rev=887896&view=rev
Log:
Use native Pointer address instead calling back into JVM

Modified:
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Memory.java
    commons/sandbox/runtime/trunk/src/main/native/shared/memory.c

Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Memory.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Memory.java?rev=887896&r1=887895&r2=887896&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Memory.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Memory.java Mon Dec  7 12:01:12 2009
@@ -476,7 +476,7 @@
         set0(ptr.POINTER + offset, length, val);
     }
 
-    private static native byte[] array0(Pointer ptr, long offset, int length)
+    private static native byte[] array0(long ptr, int length)
         throws IndexOutOfBoundsException, OutOfMemoryError;
     /**
      * Return the {@code ptr} memory area from {@code src} to {@code byte} array.
@@ -498,13 +498,17 @@
         throws IndexOutOfBoundsException, IllegalArgumentException,
                NullPointerException, OutOfMemoryError
     {
+        if (ptr == null || ptr.POINTER == 0L)
+            throw new NullPointerException();
         if (offset < 0L || length < 1)
             throw new IllegalArgumentException();
+        if (offset + length > ptr.PLENGTH)
+            throw new IndexOutOfBoundsException();
 
-        return array0(ptr, offset, length);
+        return array0(ptr.POINTER + offset, length);
     }
 
-    private static native char[] array1(Pointer ptr, long offset, int length)
+    private static native char[] array1(long ptr, int length)
         throws IndexOutOfBoundsException, OutOfMemoryError;
     /**
      * Return the {@code ptr} memory area from {@code src} to {@code char} array.
@@ -526,13 +530,17 @@
         throws IndexOutOfBoundsException, IllegalArgumentException,
                NullPointerException, OutOfMemoryError
     {
+        if (ptr == null || ptr.POINTER == 0L)
+            throw new NullPointerException();
         if (offset < 0L || length < 1)
             throw new IllegalArgumentException();
+        if (((offset + length) * 2) > ptr.PLENGTH)
+            throw new IndexOutOfBoundsException();
 
-        return array1(ptr, offset, length);
+        return array1(ptr.POINTER + offset * 2, length);
     }
 
-    private static native short[] array2(Pointer ptr, long offset, int length)
+    private static native short[] array2(long ptr, int length)
         throws IndexOutOfBoundsException, OutOfMemoryError;
     /**
      * Return the {@code ptr} memory area from {@code src} to {@code short} array.
@@ -554,13 +562,17 @@
         throws IndexOutOfBoundsException, IllegalArgumentException,
                NullPointerException, OutOfMemoryError
     {
+        if (ptr == null || ptr.POINTER == 0L)
+            throw new NullPointerException();
         if (offset < 0L || length < 1)
             throw new IllegalArgumentException();
+        if (((offset + length) * 2) > ptr.PLENGTH)
+            throw new IndexOutOfBoundsException();
 
-        return array2(ptr, offset, length);
+        return array2(ptr.POINTER + offset * 2, length);
     }
 
-    private static native int[] array3(Pointer ptr, long offset, int length)
+    private static native int[] array3(long ptr, int length)
         throws IndexOutOfBoundsException, OutOfMemoryError;
     /**
      * Return the {@code ptr} memory area from {@code src} to {@code int} array.
@@ -582,13 +594,17 @@
         throws IndexOutOfBoundsException, IllegalArgumentException,
                NullPointerException, OutOfMemoryError
     {
+        if (ptr == null || ptr.POINTER == 0L)
+            throw new NullPointerException();
         if (offset < 0L || length < 1)
             throw new IllegalArgumentException();
+        if (((offset + length) * 4) > ptr.PLENGTH)
+            throw new IndexOutOfBoundsException();
 
-        return array3(ptr, offset, length);
+        return array3(ptr.POINTER + offset * 4, length);
     }
 
-    private static native long[] array4(Pointer ptr, long offset, int length)
+    private static native long[] array4(long ptr, int length)
         throws IndexOutOfBoundsException, OutOfMemoryError;
     /**
      * Return the {@code ptr} memory area from {@code src} to
@@ -611,13 +627,17 @@
         throws IndexOutOfBoundsException, IllegalArgumentException,
                NullPointerException, OutOfMemoryError
     {
+        if (ptr == null || ptr.POINTER == 0L)
+            throw new NullPointerException();
         if (offset < 0L || length < 1)
             throw new IllegalArgumentException();
+        if (((offset + length) * 8) > ptr.PLENGTH)
+            throw new IndexOutOfBoundsException();
 
-        return array4(ptr, offset, length);
+        return array4(ptr.POINTER + offset * 8, length);
     }
 
-    private static native float[] array5(Pointer ptr, long offset, int length)
+    private static native float[] array5(long ptr, int length)
         throws IndexOutOfBoundsException, OutOfMemoryError;
     /**
      * Return the {@code ptr} memory area from {@code src} to
@@ -640,13 +660,17 @@
         throws IndexOutOfBoundsException, IllegalArgumentException,
                NullPointerException, OutOfMemoryError
     {
+        if (ptr == null || ptr.POINTER == 0L)
+            throw new NullPointerException();
         if (offset < 0L || length < 1)
             throw new IllegalArgumentException();
+        if (((offset + length) * 4) > ptr.PLENGTH)
+            throw new IndexOutOfBoundsException();
 
-        return array5(ptr, offset, length);
+        return array5(ptr.POINTER + offset * 4, length);
     }
 
-    private static native double[] array6(Pointer ptr, long offset, int length)
+    private static native double[] array6(long ptr, int length)
         throws IndexOutOfBoundsException, OutOfMemoryError;
     /**
      * Return the {@code ptr} memory area from {@code src} to
@@ -669,15 +693,51 @@
         throws IndexOutOfBoundsException, IllegalArgumentException,
                NullPointerException, OutOfMemoryError
     {
+        if (ptr == null || ptr.POINTER == 0L)
+            throw new NullPointerException();
         if (offset < 0L || length < 1)
             throw new IllegalArgumentException();
+        if (((offset + length) * 8) > ptr.PLENGTH)
+            throw new IndexOutOfBoundsException();
 
-        return array6(ptr, offset, length);
+        return array6(ptr.POINTER + offset * 8, length);
     }
 
-    private static native void acpy0(Pointer src, long srcPos, byte[] dst,
+    private static native boolean[] array7(long ptr, int length)
+        throws IndexOutOfBoundsException, OutOfMemoryError;
+    /**
+     * Return the {@code ptr} memory area from {@code src} to {@code boolean} array.
+     *
+     * @param ptr {@code Pointer} whose content to use.
+     * @param offset starting position in the memory.
+     * @param length the number of bytes use.
+     * @return new {@code byte} array with values from {@code src} memory area.
+     *
+     * @throws IllegalArgumentException if the {@code offset}
+     *          is {@code negative} or {@code length}
+     *          is {@code zero}.
+     * @throws IndexOutOfBoundsException if the operation would cause
+     *          access of data outside allocated memory bounds.
+     * @throws NullPointerException if {@code ptr} is {@code null}.
+     * @throws OutOfMemoryError if memory cannot be dipicated.
+     */
+    public static boolean[] toBooleanArray(Pointer ptr, long offset, int length)
+        throws IndexOutOfBoundsException, IllegalArgumentException,
+               NullPointerException, OutOfMemoryError
+    {
+        if (ptr == null || ptr.POINTER == 0L)
+            throw new NullPointerException();
+        if (offset < 0L || length < 1)
+            throw new IllegalArgumentException();
+        if (offset + length > ptr.PLENGTH)
+            throw new IndexOutOfBoundsException();
+
+        return array7(ptr.POINTER + offset, length);
+    }
+
+    private static native void acpy0(long src, byte[] dst,
                                      int dstPos, int length)
-        throws IndexOutOfBoundsException;
+        throws ArrayIndexOutOfBoundsException;
     /**
      * Copy the memory area from {@code src} pointer to array
      * pointed by {@code dst}.
@@ -701,16 +761,21 @@
         throws IndexOutOfBoundsException, IllegalArgumentException,
                NullPointerException
     {
+        if (src == null || src.POINTER == 0L)
+            throw new NullPointerException();
         if (srcPos < 0L || dstPos < 0 || length == 0)
             throw new IllegalArgumentException();
-        else if ((dstPos + length) > dst.length)
+        if (dstPos + length > dst.length)
+            throw new ArrayIndexOutOfBoundsException();
+        if (srcPos + length > src.PLENGTH)
             throw new IndexOutOfBoundsException();
-        acpy0(src, srcPos, dst, dstPos, length);
+
+        acpy0(src.POINTER + srcPos, dst, dstPos, length);
     }
 
-    private static native void acpy1(Pointer src, long srcPos, char[] dst,
+    private static native void acpy1(long src, char[] dst,
                                      int dstPos, int length)
-        throws IndexOutOfBoundsException;
+        throws ArrayIndexOutOfBoundsException;
     /**
      * Copy the memory area from {@code src} pointer to array
      * pointed by {@code dst}.
@@ -734,16 +799,21 @@
         throws IndexOutOfBoundsException, IllegalArgumentException,
                NullPointerException
     {
+        if (src == null || src.POINTER == 0L)
+            throw new NullPointerException();
         if (srcPos < 0L || dstPos < 0 || length == 0)
             throw new IllegalArgumentException();
-        else if ((dstPos + length) > dst.length)
+        if (dstPos + length > dst.length)
+            throw new ArrayIndexOutOfBoundsException();
+        if (((srcPos + length) * 2) > src.PLENGTH)
             throw new IndexOutOfBoundsException();
-        acpy1(src, srcPos, dst, dstPos, length);
+
+        acpy1(src.POINTER + srcPos * 2, dst, dstPos, length);
     }
 
-    private static native void acpy2(Pointer src, long srcPos, short[] dst,
+    private static native void acpy2(long src, short[] dst,
                                      int dstPos, int length)
-        throws IndexOutOfBoundsException;
+        throws ArrayIndexOutOfBoundsException;
     /**
      * Copy the memory area from {@code src} pointer to array
      * pointed by {@code dst}.
@@ -767,16 +837,21 @@
         throws IndexOutOfBoundsException, IllegalArgumentException,
                NullPointerException
     {
+        if (src == null || src.POINTER == 0L)
+            throw new NullPointerException();
         if (srcPos < 0L || dstPos < 0 || length == 0)
             throw new IllegalArgumentException();
-        else if ((dstPos + length) > dst.length)
+        if (dstPos + length > dst.length)
+            throw new ArrayIndexOutOfBoundsException();
+        if (((srcPos + length) * 2) > src.PLENGTH)
             throw new IndexOutOfBoundsException();
-        acpy2(src, srcPos, dst, dstPos, length);
+
+        acpy2(src.POINTER + srcPos * 2, dst, dstPos, length);
     }
 
-    private static native void acpy3(Pointer src, long srcPos, int[] dst,
+    private static native void acpy3(long src, int[] dst,
                                      int dstPos, int length)
-        throws IndexOutOfBoundsException;
+        throws ArrayIndexOutOfBoundsException;
     /**
      * Copy the memory area from {@code src} pointer to array
      * pointed by {@code dst}.
@@ -800,16 +875,21 @@
         throws IndexOutOfBoundsException, IllegalArgumentException,
                NullPointerException
     {
+        if (src == null || src.POINTER == 0L)
+            throw new NullPointerException();
         if (srcPos < 0L || dstPos < 0 || length == 0)
             throw new IllegalArgumentException();
-        else if ((dstPos + length) > dst.length)
+        if (dstPos + length > dst.length)
+            throw new ArrayIndexOutOfBoundsException();
+        if (((srcPos + length) * 4) > src.PLENGTH)
             throw new IndexOutOfBoundsException();
-        acpy3(src, srcPos, dst, dstPos, length);
+
+        acpy3(src.POINTER + srcPos * 4, dst, dstPos, length);
     }
 
-    private static native void acpy4(Pointer src, long srcPos, long[] dst,
+    private static native void acpy4(long src, long[] dst,
                                      int dstPos, int length)
-        throws IndexOutOfBoundsException;
+        throws ArrayIndexOutOfBoundsException;
     /**
      * Copy the memory area from {@code src} pointer to array
      * pointed by {@code dst}.
@@ -833,16 +913,21 @@
         throws IndexOutOfBoundsException, IllegalArgumentException,
                NullPointerException
     {
+        if (src == null || src.POINTER == 0L)
+            throw new NullPointerException();
         if (srcPos < 0L || dstPos < 0 || length == 0)
             throw new IllegalArgumentException();
-        else if ((dstPos + length) > dst.length)
+        if (dstPos + length > dst.length)
+            throw new ArrayIndexOutOfBoundsException();
+        if (((srcPos + length) * 8) > src.PLENGTH)
             throw new IndexOutOfBoundsException();
-        acpy4(src, srcPos, dst, dstPos, length);
+
+        acpy4(src.POINTER + srcPos * 8, dst, dstPos, length);
     }
 
-    private static native void acpy5(Pointer src, long srcPos, float[] dst,
+    private static native void acpy5(long src, float[] dst,
                                      int dstPos, int length)
-        throws IndexOutOfBoundsException;
+        throws ArrayIndexOutOfBoundsException;
     /**
      * Copy the memory area from {@code src} pointer to array
      * pointed by {@code dst}.
@@ -866,16 +951,21 @@
         throws IndexOutOfBoundsException, IllegalArgumentException,
                NullPointerException
     {
+        if (src == null || src.POINTER == 0L)
+            throw new NullPointerException();
         if (srcPos < 0L || dstPos < 0 || length == 0)
             throw new IllegalArgumentException();
-        else if ((dstPos + length) > dst.length)
+        if (dstPos + length > dst.length)
+            throw new ArrayIndexOutOfBoundsException();
+        if (((srcPos + length) * 4) > src.PLENGTH)
             throw new IndexOutOfBoundsException();
-        acpy5(src, srcPos, dst, dstPos, length);
+
+        acpy5(src.POINTER + srcPos * 4, dst, dstPos, length);
     }
 
-    private static native void acpy6(Pointer src, long srcPos, double[] dst,
+    private static native void acpy6(long src, double[] dst,
                                      int dstPos, int length)
-        throws IndexOutOfBoundsException;
+        throws ArrayIndexOutOfBoundsException;
     /**
      * Copy the memory area from {@code src} pointer to array
      * pointed by {@code dst}.
@@ -899,16 +989,59 @@
         throws IndexOutOfBoundsException, IllegalArgumentException,
                NullPointerException
     {
+        if (src == null || src.POINTER == 0L)
+            throw new NullPointerException();
+        if (srcPos < 0L || dstPos < 0 || length == 0)
+            throw new IllegalArgumentException();
+        if (dstPos + length > dst.length)
+            throw new ArrayIndexOutOfBoundsException();
+        if (((srcPos + length) * 8) > src.PLENGTH)
+            throw new IndexOutOfBoundsException();
+
+        acpy6(src.POINTER + srcPos * 8, dst, dstPos, length);
+    }
+
+    private static native void acpy7(long src, boolean[] dst,
+                                     int dstPos, int length)
+        throws ArrayIndexOutOfBoundsException;
+    /**
+     * Copy the memory area from {@code src} pointer to array
+     * pointed by {@code dst}.
+     *
+     * @param src source memory {@code Pointer}.
+     * @param srcPos starting position in the source memory.
+     * @param dst destination {@code array}.
+     * @param dstPos starting position in the destination array.
+     * @param length the number of bytes to be copied.
+     *
+     * @throws IllegalArgumentException if the {@code srcPos} or
+     *          {@code dstPos} is {@code negative} or {@code length}
+     *          is {@code zero}.
+     * @throws IndexOutOfBoundsException if the operation would cause
+     *          access of data outside allocated memory bounds.
+     * @throws NullPointerException if {@code src} or {@code dst} is
+     *          {@code null}.
+     */
+    public static void copy(Pointer src, long srcPos, boolean[] dst,
+                            int dstPos, int length)
+        throws IndexOutOfBoundsException, IllegalArgumentException,
+               NullPointerException
+    {
+        if (src == null || src.POINTER == 0L)
+            throw new NullPointerException();
         if (srcPos < 0L || dstPos < 0 || length == 0)
             throw new IllegalArgumentException();
-        else if ((dstPos + length) > dst.length)
+        if (dstPos + length > dst.length)
+            throw new ArrayIndexOutOfBoundsException();
+        if (srcPos + length > src.PLENGTH)
             throw new IndexOutOfBoundsException();
-        acpy6(src, srcPos, dst, dstPos, length);
+
+        acpy7(src.POINTER + srcPos, dst, dstPos, length);
     }
 
-    private static native void pcpy0(byte[] src, int srcPos, Pointer dst,
-                                     long dstPos, int length)
-        throws IndexOutOfBoundsException;
+    private static native void pcpy0(byte[] src, int srcPos, long dst,
+                                     int length)
+        throws ArrayIndexOutOfBoundsException;
     /**
      * Copy the array pointed by {@code src} to the memory area
      * pointed by {@code dst} pointer.
@@ -934,18 +1067,22 @@
         throws IndexOutOfBoundsException, IllegalArgumentException,
                NullPointerException, UnsupportedOperationException
     {
+        if (dst == null || dst.POINTER == 0L)
+            throw new NullPointerException();
         if (srcPos < 0 || dstPos < 0L || length == 0)
             throw new IllegalArgumentException();
-        else if ((dstPos + length) > src.length)
+        if (dstPos + length > src.length)
+            throw new ArrayIndexOutOfBoundsException();
+        if (dstPos + length > dst.PLENGTH)
             throw new IndexOutOfBoundsException();
-        else if (dst instanceof ConstPointer)
+        if (dst.ISCONST)
             throw new UnsupportedOperationException();
-        pcpy0(src, srcPos, dst, dstPos, length);
+        pcpy0(src, srcPos, dst.POINTER + dstPos, length);
     }
 
-    private static native void pcpy1(char[] src, int srcPos, Pointer dst,
-                                     long dstPos, int length)
-        throws IndexOutOfBoundsException;
+    private static native void pcpy1(char[] src, int srcPos, long dst,
+                                     int length)
+        throws ArrayIndexOutOfBoundsException;
     /**
      * Copy the array pointed by {@code src} to the memory area
      * pointed by {@code dst} pointer.
@@ -971,18 +1108,22 @@
         throws IndexOutOfBoundsException, IllegalArgumentException,
                NullPointerException, UnsupportedOperationException
     {
+        if (dst == null || dst.POINTER == 0L)
+            throw new NullPointerException();
         if (srcPos < 0 || dstPos < 0L || length == 0)
             throw new IllegalArgumentException();
-        else if ((dstPos + length) > src.length)
+        if (dstPos + length > src.length)
+            throw new ArrayIndexOutOfBoundsException();
+        if (((dstPos + length) * 2) > dst.PLENGTH)
             throw new IndexOutOfBoundsException();
-        else if (dst instanceof ConstPointer)
+        if (dst.ISCONST)
             throw new UnsupportedOperationException();
-        pcpy1(src, srcPos, dst, dstPos, length);
+        pcpy1(src, srcPos, dst.POINTER + dstPos * 2, length);
     }
 
-    private static native void pcpy2(short[] src, int srcPos, Pointer dst,
-                                     long dstPos, int length)
-        throws IndexOutOfBoundsException;
+    private static native void pcpy2(short[] src, int srcPos, long dst,
+                                     int length)
+        throws ArrayIndexOutOfBoundsException;
     /**
      * Copy the array pointed by {@code src} to the memory area
      * pointed by {@code dst} pointer.
@@ -1008,18 +1149,22 @@
         throws IndexOutOfBoundsException, IllegalArgumentException,
                NullPointerException, UnsupportedOperationException
     {
+        if (dst == null || dst.POINTER == 0L)
+            throw new NullPointerException();
         if (srcPos < 0 || dstPos < 0L || length == 0)
             throw new IllegalArgumentException();
-        else if ((dstPos + length) > src.length)
+        if (dstPos + length > src.length)
+            throw new ArrayIndexOutOfBoundsException();
+        if (((dstPos + length) * 2) > dst.PLENGTH)
             throw new IndexOutOfBoundsException();
-        else if (dst instanceof ConstPointer)
+        if (dst.ISCONST)
             throw new UnsupportedOperationException();
-        pcpy2(src, srcPos, dst, dstPos, length);
+        pcpy2(src, srcPos, dst.POINTER + dstPos * 2, length);
     }
 
-    private static native void pcpy3(int[] src, int srcPos, Pointer dst,
-                                     long dstPos, int length)
-        throws IndexOutOfBoundsException;
+    private static native void pcpy3(int[] src, int srcPos, long dst,
+                                     int length)
+        throws ArrayIndexOutOfBoundsException;
     /**
      * Copy the array pointed by {@code src} to the memory area
      * pointed by {@code dst} pointer.
@@ -1045,18 +1190,22 @@
         throws IndexOutOfBoundsException, IllegalArgumentException,
                NullPointerException, UnsupportedOperationException
     {
+        if (dst == null || dst.POINTER == 0L)
+            throw new NullPointerException();
         if (srcPos < 0 || dstPos < 0L || length == 0)
             throw new IllegalArgumentException();
-        else if ((dstPos + length) > src.length)
+        if (dstPos + length > src.length)
+            throw new ArrayIndexOutOfBoundsException();
+        if (((dstPos + length) * 4) > dst.PLENGTH)
             throw new IndexOutOfBoundsException();
-        else if (dst instanceof ConstPointer)
+        if (dst.ISCONST)
             throw new UnsupportedOperationException();
-        pcpy3(src, srcPos, dst, dstPos, length);
+        pcpy3(src, srcPos, dst.POINTER + dstPos * 4, length);
     }
 
-    private static native void pcpy4(long[] src, int srcPos, Pointer dst,
-                                     long dstPos, int length)
-        throws IndexOutOfBoundsException;
+    private static native void pcpy4(long[] src, int srcPos, long dst,
+                                     int length)
+        throws ArrayIndexOutOfBoundsException;
     /**
      * Copy the array pointed by {@code src} to the memory area
      * pointed by {@code dst} pointer.
@@ -1082,18 +1231,22 @@
         throws IndexOutOfBoundsException, IllegalArgumentException,
                NullPointerException, UnsupportedOperationException
     {
+        if (dst == null || dst.POINTER == 0L)
+            throw new NullPointerException();
         if (srcPos < 0 || dstPos < 0L || length == 0)
             throw new IllegalArgumentException();
-        else if ((dstPos + length) > src.length)
+        if (dstPos + length > src.length)
+            throw new ArrayIndexOutOfBoundsException();
+        if (((dstPos + length) * 8) > dst.PLENGTH)
             throw new IndexOutOfBoundsException();
-        else if (dst instanceof ConstPointer)
+        if (dst.ISCONST)
             throw new UnsupportedOperationException();
-        pcpy4(src, srcPos, dst, dstPos, length);
+        pcpy4(src, srcPos, dst.POINTER + dstPos * 8, length);
     }
 
-    private static native void pcpy5(float[] src, int srcPos, Pointer dst,
-                                     long dstPos, int length)
-        throws IndexOutOfBoundsException;
+    private static native void pcpy5(float[] src, int srcPos, long dst,
+                                     int length)
+        throws ArrayIndexOutOfBoundsException;
     /**
      * Copy the array pointed by {@code src} to the memory area
      * pointed by {@code dst} pointer.
@@ -1119,18 +1272,22 @@
         throws IndexOutOfBoundsException, IllegalArgumentException,
                NullPointerException, UnsupportedOperationException
     {
+        if (dst == null || dst.POINTER == 0L)
+            throw new NullPointerException();
         if (srcPos < 0 || dstPos < 0L || length == 0)
             throw new IllegalArgumentException();
-        else if ((dstPos + length) > src.length)
+        if (dstPos + length > src.length)
+            throw new ArrayIndexOutOfBoundsException();
+        if (((dstPos + length) * 4) > dst.PLENGTH)
             throw new IndexOutOfBoundsException();
-        else if (dst instanceof ConstPointer)
+        if (dst.ISCONST)
             throw new UnsupportedOperationException();
-        pcpy5(src, srcPos, dst, dstPos, length);
+        pcpy5(src, srcPos, dst.POINTER + dstPos * 4, length);
     }
 
-    private static native void pcpy6(double[] src, int srcPos, Pointer dst,
-                                     long dstPos, int length)
-        throws IndexOutOfBoundsException;
+    private static native void pcpy6(double[] src, int srcPos, long dst,
+                                     int length)
+        throws ArrayIndexOutOfBoundsException;
     /**
      * Copy the array pointed by {@code src} to the memory area
      * pointed by {@code dst} pointer.
@@ -1156,13 +1313,58 @@
         throws IndexOutOfBoundsException, IllegalArgumentException,
                NullPointerException, UnsupportedOperationException
     {
+        if (dst == null || dst.POINTER == 0L)
+            throw new NullPointerException();
+        if (srcPos < 0 || dstPos < 0L || length == 0)
+            throw new IllegalArgumentException();
+        if (dstPos + length > src.length)
+            throw new ArrayIndexOutOfBoundsException();
+        if (((dstPos + length) * 8) > dst.PLENGTH)
+            throw new IndexOutOfBoundsException();
+        if (dst.ISCONST)
+            throw new UnsupportedOperationException();
+        pcpy6(src, srcPos, dst.POINTER + dstPos * 8, length);
+    }
+
+    private static native void pcpy7(boolean[] src, int srcPos, long dst,
+                                     int length)
+        throws ArrayIndexOutOfBoundsException;
+    /**
+     * Copy the array pointed by {@code src} to the memory area
+     * pointed by {@code dst} pointer.
+     *
+     * @param src source {@code array}.
+     * @param srcPos starting position in the source array.
+     * @param dst source memory {@code Pointer}.
+     * @param dstPos starting position in the source memory.
+     * @param length the number of bytes to be copied.
+     *
+     * @throws IllegalArgumentException if the {@code srcPos} or
+     *          {@code dstPos} is {@code negative} or {@code length}
+     *          is {@code zero}.
+     * @throws IndexOutOfBoundsException if the operation would cause
+     *          access of data outside allocated memory bounds.
+     * @throws NullPointerException if {@code src} or {@code dst} is
+     *          {@code null}.
+     * @throws UnsupportedOperationException if {@code dst} is
+     *          instance of {@code ConstPointer}.
+     */
+    public static void copy(boolean[] src, int srcPos, Pointer dst,
+                            long dstPos, int length)
+        throws IndexOutOfBoundsException, IllegalArgumentException,
+               NullPointerException, UnsupportedOperationException
+    {
+        if (dst == null || dst.POINTER == 0L)
+            throw new NullPointerException();
         if (srcPos < 0 || dstPos < 0L || length == 0)
             throw new IllegalArgumentException();
-        else if ((dstPos + length) > src.length)
+        if (dstPos + length > src.length)
+            throw new ArrayIndexOutOfBoundsException();
+        if (dstPos + length > dst.PLENGTH)
             throw new IndexOutOfBoundsException();
-        else if (dst instanceof ConstPointer)
+        if (dst.ISCONST)
             throw new UnsupportedOperationException();
-        pcpy6(src, srcPos, dst, dstPos, length);
+        pcpy7(src, srcPos, dst.POINTER + dstPos, length);
     }
 
 }

Modified: commons/sandbox/runtime/trunk/src/main/native/shared/memory.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/memory.c?rev=887896&r1=887895&r2=887896&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/memory.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/memory.c Mon Dec  7 12:01:12 2009
@@ -568,479 +568,295 @@
     __ENDTRY
 }
 
-ACR_JNI_EXPORT_DECLARE(jbyteArray, Memory, array0)(ACR_JNISTDARGS, jobject ptr,
-                                                   jlong poff, jint size)
+ACR_JNI_EXPORT_DECLARE(jbyteArray, Memory, array0)(ACR_JNISTDARGS, jlong ptr,
+                                                   jint size)
 {
     jbyteArray ba;
-    size_t  pl;
-    size_t  dn = (size_t)poff;
-    size_t  cs = (size_t)size;
-    jbyte   *p = (jbyte *)ACR_PointerGet(_E, ptr, &pl);
+    jsize   cs = (jsize)size;
+    jbyte   *p = J2P(ptr, jbyte *);
 
-    if (!p) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return NULL;
-    }
-    if ((poff + cs) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return NULL;
-    }
-    ba = (*_E)->NewByteArray(_E, (jsize)cs);
+    ba = (*_E)->NewByteArray(_E, cs);
     if (ba) {
-        (*_E)->SetByteArrayRegion(_E, ba, 0, (jsize)cs, p + dn);
+        (*_E)->SetByteArrayRegion(_E, ba, 0, cs, p);
     }
     return ba;
 }
 
-ACR_JNI_EXPORT_DECLARE(jcharArray, Memory, array1)(ACR_JNISTDARGS, jobject ptr,
-                                                   jlong poff, jint size)
+ACR_JNI_EXPORT_DECLARE(jcharArray, Memory, array1)(ACR_JNISTDARGS, jlong ptr,
+                                                   jint size)
 {
     jcharArray oa;
-    size_t  pl;
-    size_t  dn = (size_t)poff;
-    size_t  cs = (size_t)size;
-    jchar   *p = (jchar *)ACR_PointerGet(_E, ptr, &pl);
+    jsize   cs = (jsize)size;
+    jchar   *p = J2P(ptr, jchar *);
 
-    if (!p) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return NULL;
-    }
-    if (((poff + cs) * sizeof(jchar)) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return NULL;
-    }
-    oa = (*_E)->NewCharArray(_E, (jsize)cs);
+    oa = (*_E)->NewCharArray(_E, cs);
     if (oa) {
-        (*_E)->SetCharArrayRegion(_E, oa, 0, (jsize)cs, p + dn);
+        (*_E)->SetCharArrayRegion(_E, oa, 0, cs, p);
     }
     return oa;
 }
 
-ACR_JNI_EXPORT_DECLARE(jshortArray, Memory, array2)(ACR_JNISTDARGS, jobject ptr,
-                                                    jlong poff, jint size)
+ACR_JNI_EXPORT_DECLARE(jshortArray, Memory, array2)(ACR_JNISTDARGS, jlong ptr,
+                                                    jint size)
 {
-    jshortArray oa;
-    size_t  pl;
-    size_t  dn = (size_t)poff;
-    size_t  cs = (size_t)size;
-    jshort  *p = (jshort *)ACR_PointerGet(_E, ptr, &pl);
+    jcharArray oa;
+    jsize   cs = (jsize)size;
+    jshort  *p = J2P(ptr, jshort *);
 
-    if (!p) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return NULL;
-    }
-    if (((poff + cs) * sizeof(jshort)) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return NULL;
-    }
-    oa = (*_E)->NewShortArray(_E, (jsize)cs);
+    oa = (*_E)->NewShortArray(_E, cs);
     if (oa) {
-        (*_E)->SetShortArrayRegion(_E, oa, 0, (jsize)cs, p + dn);
+        (*_E)->SetShortArrayRegion(_E, oa, 0, cs, p);
     }
     return oa;
 }
 
-ACR_JNI_EXPORT_DECLARE(jintArray, Memory, array3)(ACR_JNISTDARGS, jobject ptr,
-                                                  jlong poff, jint size)
+ACR_JNI_EXPORT_DECLARE(jintArray, Memory, array3)(ACR_JNISTDARGS, jlong ptr,
+                                                  jint size)
 {
     jintArray oa;
-    size_t  pl;
-    size_t  dn = (size_t)poff;
-    size_t  cs = (size_t)size;
-    jint    *p = (jint *)ACR_PointerGet(_E, ptr, &pl);
+    jsize   cs = (jsize)size;
+    jint    *p = J2P(ptr, jint *);
 
     if (!p) {
         ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
         return NULL;
     }
-    if (((poff + cs) * sizeof(jint)) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return NULL;
-    }
-    oa = (*_E)->NewIntArray(_E, (jsize)cs);
+    oa = (*_E)->NewIntArray(_E, cs);
     if (oa) {
-        (*_E)->SetIntArrayRegion(_E, oa, 0, (jsize)cs, p + dn);
+        (*_E)->SetIntArrayRegion(_E, oa, 0, cs, p);
     }
     return oa;
 }
 
-ACR_JNI_EXPORT_DECLARE(jlongArray, Memory, array4)(ACR_JNISTDARGS, jobject ptr,
-                                                   jlong poff, jint size)
+ACR_JNI_EXPORT_DECLARE(jlongArray, Memory, array4)(ACR_JNISTDARGS, jlong ptr,
+                                                   jint size)
 {
     jlongArray oa;
-    size_t  pl;
-    size_t  dn = (size_t)poff;
-    size_t  cs = (size_t)size;
-    jlong   *p = (jlong *)ACR_PointerGet(_E, ptr, &pl);
+    jsize   cs = (jsize)size;
+    jlong   *p = J2P(ptr, jlong *);
 
-    if (!p) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return NULL;
-    }
-    if (((poff + cs) * sizeof(jlong)) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return NULL;
-    }
-    oa = (*_E)->NewLongArray(_E, (jsize)cs);
+    oa = (*_E)->NewLongArray(_E, cs);
     if (oa) {
-        (*_E)->SetLongArrayRegion(_E, oa, 0, (jsize)cs, p + dn);
+        (*_E)->SetLongArrayRegion(_E, oa, 0, cs, p);
     }
     return oa;
 }
 
-ACR_JNI_EXPORT_DECLARE(jfloatArray, Memory, array5)(ACR_JNISTDARGS, jobject ptr,
-                                                    jlong poff, jint size)
+ACR_JNI_EXPORT_DECLARE(jfloatArray, Memory, array5)(ACR_JNISTDARGS, jlong ptr,
+                                                    jint size)
 {
     jlongArray oa;
-    size_t  pl;
-    size_t  dn = (size_t)poff;
-    size_t  cs = (size_t)size;
-    jfloat  *p = (jfloat *)ACR_PointerGet(_E, ptr, &pl);
+    jsize   cs = (jsize)size;
+    jfloat  *p = J2P(ptr, jfloat *);
 
-    if (!p) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return NULL;
-    }
-    if (((poff + cs) * sizeof(jfloat)) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return NULL;
-    }
-    oa = (*_E)->NewFloatArray(_E, (jsize)cs);
+    oa = (*_E)->NewFloatArray(_E, cs);
     if (oa) {
-        (*_E)->SetFloatArrayRegion(_E, oa, 0, (jsize)cs, p + dn);
+        (*_E)->SetFloatArrayRegion(_E, oa, 0, cs, p);
     }
     return oa;
 }
 
-ACR_JNI_EXPORT_DECLARE(jdoubleArray, Memory, array6)(ACR_JNISTDARGS, jobject ptr,
-                                                     jlong poff, jint size)
+ACR_JNI_EXPORT_DECLARE(jdoubleArray, Memory, array6)(ACR_JNISTDARGS, jlong ptr,
+                                                     jint size)
 {
     jlongArray oa;
-    size_t  pl;
-    size_t  dn = (size_t)poff;
-    size_t  cs = (size_t)size;
-    jdouble *p = (jdouble *)ACR_PointerGet(_E, ptr, &pl);
+    jsize   cs = (jsize)size;
+    jdouble *p = J2P(ptr, jdouble *);
 
-    if (!p) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return NULL;
-    }
-    if (((poff + cs) * sizeof(jdouble)) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return NULL;
+    oa = (*_E)->NewDoubleArray(_E, cs);
+    if (oa) {
+        (*_E)->SetDoubleArrayRegion(_E, oa, 0, cs, p);
     }
-    oa = (*_E)->NewDoubleArray(_E, (jsize)cs);
+    return oa;
+}
+
+ACR_JNI_EXPORT_DECLARE(jdoubleArray, Memory, array7)(ACR_JNISTDARGS, jlong ptr,
+                                                     jint size)
+{
+    jlongArray oa;
+    jsize   cs = (jsize)size;
+    jboolean *p = J2P(ptr, jboolean *);
+
+    oa = (*_E)->NewBooleanArray(_E, cs);
     if (oa) {
-        (*_E)->SetDoubleArrayRegion(_E, oa, 0, (jsize)cs, p + dn);
+        (*_E)->SetBooleanArrayRegion(_E, oa, 0, cs, p);
     }
     return oa;
 }
 
 
-ACR_JNI_EXPORT_DECLARE(void, Memory, acpy0)(ACR_JNISTDARGS, jobject ptr,
-                                            jlong poff, jbyteArray dst,
+ACR_JNI_EXPORT_DECLARE(void, Memory, acpy0)(ACR_JNISTDARGS, jlong ptr,
+                                            jbyteArray dst,
                                             jint off, jint len)
 {
-    size_t  pl;
-    size_t  po = (size_t)poff;
-    size_t  cs = (size_t)len;
-    jbyte   *p = (jbyte *)ACR_PointerGet(_E, ptr, &pl);
+    jbyte   *p = J2P(ptr, jbyte *);
 
     UNREFERENCED_O;
 
-    if (!p) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return;
-    }
-    if (((po + cs) * sizeof(jbyte)) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return;
-    }
-    (*_E)->SetByteArrayRegion(_E, dst, (jsize)off, (jsize)len, p + po);
+    (*_E)->SetByteArrayRegion(_E, dst, (jsize)off, (jsize)len, p);
 }
 
-ACR_JNI_EXPORT_DECLARE(void, Memory, acpy1)(ACR_JNISTDARGS, jobject ptr,
-                                            jlong poff, jcharArray dst,
+ACR_JNI_EXPORT_DECLARE(void, Memory, acpy1)(ACR_JNISTDARGS, jlong ptr,
+                                            jcharArray dst,
                                             jint off, jint len)
 {
-    size_t  pl;
-    size_t  po = (size_t)poff;
-    size_t  cs = (size_t)len;
-    jchar   *p = (jchar *)ACR_PointerGet(_E, ptr, &pl);
+    jchar   *p = J2P(ptr, jchar *);
 
     UNREFERENCED_O;
 
-    if (!p) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return;
-    }
-    if (((po + cs) * sizeof(jchar)) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return;
-    }
-    (*_E)->SetCharArrayRegion(_E, dst, (jsize)off, (jsize)len, p + po);
+    (*_E)->SetCharArrayRegion(_E, dst, (jsize)off, (jsize)len, p);
 }
 
-ACR_JNI_EXPORT_DECLARE(void, Memory, acpy2)(ACR_JNISTDARGS, jobject ptr,
-                                            jlong poff, jshortArray dst,
+ACR_JNI_EXPORT_DECLARE(void, Memory, acpy2)(ACR_JNISTDARGS, jlong ptr,
+                                            jshortArray dst,
                                             jint off, jint len)
 {
-    size_t  pl;
-    size_t  po = (size_t)poff;
-    size_t  cs = (size_t)len;
-    jshort  *p = (jshort *)ACR_PointerGet(_E, ptr, &pl);
+    jshort  *p = J2P(ptr, jshort *);
 
     UNREFERENCED_O;
 
-    if (!p) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return;
-    }
-    if (((po + cs) * sizeof(jshort)) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return;
-    }
-    (*_E)->SetShortArrayRegion(_E, dst, (jsize)off, (jsize)len, p + po);
+    (*_E)->SetShortArrayRegion(_E, dst, (jsize)off, (jsize)len, p);
 }
 
-ACR_JNI_EXPORT_DECLARE(void, Memory, acpy3)(ACR_JNISTDARGS, jobject ptr,
-                                            jlong poff, jintArray dst,
+ACR_JNI_EXPORT_DECLARE(void, Memory, acpy3)(ACR_JNISTDARGS, jlong ptr,
+                                            jintArray dst,
                                             jint off, jint len)
 {
-    size_t  pl;
-    size_t  po = (size_t)poff;
-    size_t  cs = (size_t)len;
-    jint    *p = (jint *)ACR_PointerGet(_E, ptr, &pl);
+    jint    *p = J2P(ptr, jint *);
 
     UNREFERENCED_O;
 
-    if (!p) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return;
-    }
-    if (((po + cs) * sizeof(jint)) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return;
-    }
-    (*_E)->SetIntArrayRegion(_E, dst, (jsize)off, (jsize)len, p + po);
+    (*_E)->SetIntArrayRegion(_E, dst, (jsize)off, (jsize)len, p);
 }
 
-ACR_JNI_EXPORT_DECLARE(void, Memory, acpy4)(ACR_JNISTDARGS, jobject ptr,
-                                            jlong poff, jlongArray dst,
+ACR_JNI_EXPORT_DECLARE(void, Memory, acpy4)(ACR_JNISTDARGS, jlong ptr,
+                                            jlongArray dst,
                                             jint off, jint len)
 {
-    size_t  pl;
-    size_t  po = (size_t)poff;
-    size_t  cs = (size_t)len;
-    jlong   *p = (jlong *)ACR_PointerGet(_E, ptr, &pl);
+    jlong   *p = J2P(ptr, jlong *);
 
     UNREFERENCED_O;
 
-    if (!p) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return;
-    }
-    if (((po + cs) * sizeof(jlong)) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return;
-    }
-    (*_E)->SetLongArrayRegion(_E, dst, (jsize)off, (jsize)len, p + po);
+    (*_E)->SetLongArrayRegion(_E, dst, (jsize)off, (jsize)len, p);
 }
 
-ACR_JNI_EXPORT_DECLARE(void, Memory, acpy5)(ACR_JNISTDARGS, jobject ptr,
-                                            jlong poff, jfloatArray dst,
+ACR_JNI_EXPORT_DECLARE(void, Memory, acpy5)(ACR_JNISTDARGS, jlong ptr,
+                                            jfloatArray dst,
                                             jint off, jint len)
 {
-    size_t  pl;
-    size_t  po = (size_t)poff;
-    size_t  cs = (size_t)len;
-    jfloat  *p = (jfloat *)ACR_PointerGet(_E, ptr, &pl);
+    jfloat  *p = J2P(ptr, jfloat *);
 
     UNREFERENCED_O;
 
-    if (!p) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return;
-    }
-    if (((po + cs) * sizeof(jfloat)) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return;
-    }
-    (*_E)->SetFloatArrayRegion(_E, dst, (jsize)off, (jsize)len, p + po);
+    (*_E)->SetFloatArrayRegion(_E, dst, (jsize)off, (jsize)len, p);
 }
 
-ACR_JNI_EXPORT_DECLARE(void, Memory, acpy6)(ACR_JNISTDARGS, jobject ptr,
-                                            jlong poff, jdoubleArray dst,
+ACR_JNI_EXPORT_DECLARE(void, Memory, acpy6)(ACR_JNISTDARGS, jlong ptr,
+                                            jdoubleArray dst,
                                             jint off, jint len)
 {
-    size_t  pl;
-    size_t  po = (size_t)poff;
-    size_t  cs = (size_t)len;
-    jdouble *p = (jdouble *)ACR_PointerGet(_E, ptr, &pl);
+    jdouble *p = J2P(ptr, jdouble *);
 
     UNREFERENCED_O;
 
-    if (!p) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return;
-    }
-    if (((po + cs) * sizeof(jdouble)) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return;
-    }
-    (*_E)->SetDoubleArrayRegion(_E, dst, (jsize)off, (jsize)len, p + po);
+    (*_E)->SetDoubleArrayRegion(_E, dst, (jsize)off, (jsize)len, p);
+}
+
+ACR_JNI_EXPORT_DECLARE(void, Memory, acpy7)(ACR_JNISTDARGS, jlong ptr,
+                                            jbooleanArray dst,
+                                            jint off, jint len)
+{
+    jboolean *p = J2P(ptr, jboolean *);
+
+    UNREFERENCED_O;
+
+    (*_E)->SetBooleanArrayRegion(_E, dst, (jsize)off, (jsize)len, p);
 }
 
 ACR_JNI_EXPORT_DECLARE(void, Memory, pcpy0)(ACR_JNISTDARGS, jbyteArray src,
-                                            jint off,  jobject ptr,
-                                            jlong poff, jint len)
+                                            jint off,  jlong ptr,
+                                            jint len)
 {
-    size_t  pl;
-    size_t  po = (size_t)poff;
-    size_t  cs = (size_t)len;
-    jbyte   *p = (jbyte *)ACR_PointerGet(_E, ptr, &pl);
+    jbyte   *p = J2P(ptr, jbyte *);
 
     UNREFERENCED_O;
 
-    if (!p) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return;
-    }
-    if (((po + cs) * sizeof(jbyte)) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return;
-    }
-    (*_E)->GetByteArrayRegion(_E, src, (jsize)off, (jsize)len, p + po);
+    (*_E)->GetByteArrayRegion(_E, src, (jsize)off, (jsize)len, p);
 }
 
 ACR_JNI_EXPORT_DECLARE(void, Memory, pcpy1)(ACR_JNISTDARGS, jcharArray src,
-                                            jint off,  jobject ptr,
-                                            jlong poff, jint len)
+                                            jint off,  jlong ptr,
+                                            jint len)
 {
-    size_t  pl;
-    size_t  po = (size_t)poff;
-    size_t  cs = (size_t)len;
-    jchar   *p = (jchar *)ACR_PointerGet(_E, ptr, &pl);
+    jchar   *p = J2P(ptr, jchar *);
 
     UNREFERENCED_O;
 
-    if (!p) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return;
-    }
-    if (((po + cs) * sizeof(jchar)) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return;
-    }
-    (*_E)->GetCharArrayRegion(_E, src, (jsize)off, (jsize)len, p + po);
+    (*_E)->GetCharArrayRegion(_E, src, (jsize)off, (jsize)len, p);
 }
 
 ACR_JNI_EXPORT_DECLARE(void, Memory, pcpy2)(ACR_JNISTDARGS, jshortArray src,
-                                            jint off,  jobject ptr,
-                                            jlong poff, jint len)
+                                            jint off,  jlong ptr,
+                                            jint len)
 {
-    size_t  pl;
-    size_t  po = (size_t)poff;
-    size_t  cs = (size_t)len;
-    jshort  *p = (jshort *)ACR_PointerGet(_E, ptr, &pl);
+    jshort   *p = J2P(ptr, jshort *);
 
     UNREFERENCED_O;
 
-    if (!p) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return;
-    }
-    if (((po + cs) * sizeof(jshort)) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return;
-    }
-    (*_E)->GetShortArrayRegion(_E, src, (jsize)off, (jsize)len, p + po);
+    (*_E)->GetShortArrayRegion(_E, src, (jsize)off, (jsize)len, p);
 }
 
 ACR_JNI_EXPORT_DECLARE(void, Memory, pcpy3)(ACR_JNISTDARGS, jintArray src,
-                                            jint off,  jobject ptr,
-                                            jlong poff, jint len)
+                                            jint off,  jlong ptr,
+                                            jint len)
 {
-    size_t  pl;
-    size_t  po = (size_t)poff;
-    size_t  cs = (size_t)len;
-    jint    *p = (jint *)ACR_PointerGet(_E, ptr, &pl);
+    jint    *p = J2P(ptr, jint *);
 
     UNREFERENCED_O;
 
-    if (!p) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return;
-    }
-    if (((po + cs) * sizeof(jint)) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return;
-    }
-    (*_E)->GetIntArrayRegion(_E, src, (jsize)off, (jsize)len, p + po);
+    (*_E)->GetIntArrayRegion(_E, src, (jsize)off, (jsize)len, p);
 }
 
 ACR_JNI_EXPORT_DECLARE(void, Memory, pcpy4)(ACR_JNISTDARGS, jlongArray src,
-                                            jint off,  jobject ptr,
-                                            jlong poff, jint len)
+                                            jint off,  jlong ptr,
+                                            jint len)
 {
-    size_t  pl;
-    size_t  po = (size_t)poff;
-    size_t  cs = (size_t)len;
-    jlong   *p = (jlong *)ACR_PointerGet(_E, ptr, &pl);
+    jlong   *p = J2P(ptr, jlong *);
 
     UNREFERENCED_O;
 
-    if (!p) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return;
-    }
-    if (((po + cs) * sizeof(jlong)) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return;
-    }
-    (*_E)->GetLongArrayRegion(_E, src, (jsize)off, (jsize)len, p + po);
+    (*_E)->GetLongArrayRegion(_E, src, (jsize)off, (jsize)len, p);
 }
 
 ACR_JNI_EXPORT_DECLARE(void, Memory, pcpy5)(ACR_JNISTDARGS, jfloatArray src,
-                                            jint off,  jobject ptr,
-                                            jlong poff, jint len)
+                                            jint off,  jlong ptr,
+                                            jint len)
 {
-    size_t  pl;
-    size_t  po = (size_t)poff;
-    size_t  cs = (size_t)len;
-    jfloat  *p = (jfloat *)ACR_PointerGet(_E, ptr, &pl);
+    jfloat   *p = J2P(ptr, jfloat *);
 
     UNREFERENCED_O;
 
-    if (!p) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return;
-    }
-    if (((po + cs) * sizeof(jfloat)) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return;
-    }
-    (*_E)->GetFloatArrayRegion(_E, src, (jsize)off, (jsize)len, p + po);
+    (*_E)->GetFloatArrayRegion(_E, src, (jsize)off, (jsize)len, p);
 }
 
 ACR_JNI_EXPORT_DECLARE(void, Memory, pcpy6)(ACR_JNISTDARGS, jdoubleArray src,
-                                            jint off,  jobject ptr,
-                                            jlong poff, jint len)
+                                            jint off,  jlong ptr,
+                                            jint len)
 {
-    size_t  pl;
-    size_t  po = (size_t)poff;
-    size_t  cs = (size_t)len;
-    jdouble *p = (jdouble *)ACR_PointerGet(_E, ptr, &pl);
+    jdouble  *p = J2P(ptr, jdouble *);
 
     UNREFERENCED_O;
 
-    if (!p) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return;
-    }
-    if (((po + cs) * sizeof(jdouble)) > pl) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
-        return;
-    }
-    (*_E)->GetDoubleArrayRegion(_E, src, (jsize)off, (jsize)len, p + po);
+    (*_E)->GetDoubleArrayRegion(_E, src, (jsize)off, (jsize)len, p);
+}
+
+ACR_JNI_EXPORT_DECLARE(void, Memory, pcpy7)(ACR_JNISTDARGS, jbooleanArray src,
+                                            jint off,  jlong ptr,
+                                            jint len)
+{
+    jboolean *p = J2P(ptr, jboolean *);
+
+    UNREFERENCED_O;
+
+    (*_E)->GetBooleanArrayRegion(_E, src, (jsize)off, (jsize)len, p);
 }