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/06/20 19:44:03 UTC

svn commit: r786868 - in /commons/sandbox/runtime/trunk/src: main/java/org/apache/commons/runtime/ main/java/org/apache/commons/runtime/exception/ main/native/shared/ test/org/apache/commons/runtime/

Author: mturk
Date: Sat Jun 20 17:44:02 2009
New Revision: 786868

URL: http://svn.apache.org/viewvc?rev=786868&view=rev
Log:
Add structure wrap/unwrap mathods

Added:
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/exception/InvalidStructureElementException.java   (with props)
Modified:
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/AbstractStructure.java
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Memory.java
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer.java
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure.java
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure32.java
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure64.java
    commons/sandbox/runtime/trunk/src/main/native/shared/structure.c
    commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestStructure.java

Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/AbstractStructure.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/AbstractStructure.java?rev=786868&r1=786867&r2=786868&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/AbstractStructure.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/AbstractStructure.java Sat Jun 20 17:44:02 2009
@@ -15,6 +15,7 @@
  */
 
 package org.apache.commons.runtime;
+import org.apache.commons.runtime.exception.InvalidStructureElementException;
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.util.Arrays;
@@ -47,6 +48,7 @@
     }
 
     private void init()
+        throws InvalidStructureElementException
     {
         if (inited)
             return;
@@ -77,6 +79,11 @@
                         if (offset[i] == o.value()) {
                             fields[i] = f;
                             esizes[i] = getElementSize(f, this);
+                            if (esizes[i] == 0) {
+                                throw new InvalidStructureElementException(
+                                        "Field " + f.getName() +
+                                        " has invalid class signature");
+                            }
                             asizes[i] = getArrayElementLength(f, this);
                             align     = Math.max(align, esizes[i]);
                         }
@@ -85,7 +92,16 @@
             }
             sizeof = 0;
             for (i = 0; i < count; i++) {
-                sizeof += (sizeof + esizes[i]) % esizes[i];
+                //
+                // padding    = (align - (offset % align)) % align
+                // new offset = offset + ((align - (offset % align)) % align)
+                // or
+                // padding    = (align + ((offset - 1) & ~(align - 1))) - offset
+                // new offset =  align + ((offset - 1) & ~(align - 1))
+                // where align is primitive element size
+                //
+                // sizeof += (sizeof + esizes[i]) % esizes[i];
+                sizeof = esizes[i] + ((sizeof - 1) & ~(esizes[i] - 1));
                 offset[i] = sizeof;
                 if (asizes[i] > 0)
                     sizeof += (esizes[i] * asizes[i]);
@@ -93,11 +109,11 @@
                     sizeof += esizes[i];
             }
             if (align > Pointer.SIZEOF) {
-            	// Align to the pointer size except
-            	// for the structures which elements are not
-            	// larger the size of a pointer.
-            	align = Pointer.SIZEOF;
-			}
+                // Align to the pointer size except
+                // for the structures which elements are not
+                // larger then a size of a pointer.
+                align = Pointer.SIZEOF;
+            }
             sizeof = align(sizeof, align);
         }
     }
@@ -124,8 +140,10 @@
             n = 8;
         else if (c == double.class)
             n = 8;
-        else
+        else if (c == Pointer.class)
             n = Pointer.SIZEOF;
+        else
+            n = 0;
         return n;
     }
 
@@ -174,6 +192,7 @@
      *         not found.
      */
     public final int offsetof(String name)
+        throws InvalidStructureElementException
     {
         init();
         for (int i = 0; i < count; i++) {
@@ -192,6 +211,7 @@
      * @return element count.
      */
     public final int count()
+        throws InvalidStructureElementException
     {
         init();
         return count;
@@ -203,6 +223,7 @@
      * @return structure size.
      */
     public final int sizeof()
+        throws InvalidStructureElementException
     {
         init();
         return sizeof;
@@ -219,7 +240,7 @@
      * @return structure size.
      */
     public final int sizeof(int index)
-        throws IndexOutOfBoundsException
+        throws IndexOutOfBoundsException, InvalidStructureElementException
     {
         init();
         if (index < 0 || index >= count)
@@ -240,9 +261,98 @@
      * @return structure alignment in bytes.
      */
     public final int alignment()
-    {
+         throws InvalidStructureElementException
+   {
         init();
         return align;
     }
 
+    /**
+     * Wrap {@code this} abstract structure elements to {@code struct}.
+     *
+     * @param struct Structure into which to copy {@code} this
+     *        structure data.
+     *
+     */
+    public final void wrap(Structure struct)
+        throws IndexOutOfBoundsException, IllegalAccessException,
+               InvalidStructureElementException, NullPointerException
+    {
+        init();
+        if (struct == null)
+            throw new NullPointerException();
+        if (sizeof > struct.sizeof())
+            throw new IndexOutOfBoundsException();
+        for (int i = 0; i < count; i++) {
+            Field f = fields[i];
+            Class c = f.getType();
+            if (c.isArray()) {
+
+            }
+            else {
+                if (c == byte.class)
+                    struct.poke(offset[i], f.getByte(this));
+                else if (c == char.class)
+                    struct.poke16(offset[i], f.getChar(this));
+                else if (c == short.class)
+                    struct.poke16(offset[i], f.getShort(this));
+                else if (c == int.class)
+                    struct.poke32(offset[i], f.getInt(this));
+                else if (c == float.class)
+                    struct.poke32(offset[i], f.getFloat(this));
+                else if (c == long.class)
+                    struct.poke64(offset[i], f.getLong(this));
+                else if (c == double.class)
+                    struct.poke64(offset[i], f.getDouble(this));
+                else {
+                    struct.poke(offset[i], (Pointer)f.get(this));
+                }
+            }
+        }
+    }
+
+    /**
+     * Unwrap {@code struct} to {@code this} abstract structure.
+     *
+     * @param struct Structure from which to copy {@code data} to
+     *        {@code this} structure elements.
+     *
+     */
+    public final void unwrap(Structure struct)
+        throws IndexOutOfBoundsException, IllegalAccessException,
+               InvalidStructureElementException, NullPointerException
+    {
+        init();
+        if (struct == null)
+            throw new NullPointerException();
+        if (sizeof > struct.sizeof())
+            throw new IndexOutOfBoundsException();
+        for (int i = 0; i < count; i++) {
+            Field f = fields[i];
+            Class c = f.getType();
+            if (c.isArray()) {
+
+            }
+            else {
+                if (c == byte.class)
+                    f.setByte(this, (byte)struct.peek(offset[i]));
+                else if (c == char.class)
+                    f.setChar(this, (char)struct.peek16(offset[i]));
+                else if (c == short.class)
+                    f.setShort(this, (short)struct.peek16(offset[i]));
+                else if (c == int.class)
+                    f.setInt(this, struct.peek32(offset[i]));
+                else if (c == float.class)
+                    f.setFloat(this, struct.peek32f(offset[i]));
+                else if (c == long.class)
+                    f.setLong(this, struct.peek64(offset[i]));
+                else if (c == double.class)
+                    f.setDouble(this, struct.peek64f(offset[i]));
+                else {
+                    f.set(this, struct.get(offset[i]));
+                }
+            }
+        }
+    }
+
 }

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=786868&r1=786867&r2=786868&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 Sat Jun 20 17:44:02 2009
@@ -313,7 +313,7 @@
             throw new NullPointerException();
         if (offset < 0L || length < 1L)
             throw new IllegalArgumentException();
-            
+
         clear0(ptr, offset, length);
     }
 
@@ -343,7 +343,7 @@
             throw new NullPointerException();
         if (offset < 0L || length < 1L)
             throw new IllegalArgumentException();
-            
+
         set0(ptr, offset, length, val);
     }
 
@@ -373,7 +373,7 @@
             throw new NullPointerException();
         if (offset < 0L || length < 1)
             throw new IllegalArgumentException();
-            
+
         return array0(ptr, offset, length);
     }
 
@@ -403,7 +403,7 @@
             throw new NullPointerException();
         if (offset < 0L || length < 1)
             throw new IllegalArgumentException();
-            
+
         return array1(ptr, offset, length);
     }
 
@@ -433,7 +433,7 @@
             throw new NullPointerException();
         if (offset < 0L || length < 1)
             throw new IllegalArgumentException();
-            
+
         return array2(ptr, offset, length);
     }
 
@@ -463,7 +463,7 @@
             throw new NullPointerException();
         if (offset < 0L || length < 1)
             throw new IllegalArgumentException();
-            
+
         return array3(ptr, offset, length);
     }
 
@@ -493,7 +493,7 @@
             throw new NullPointerException();
         if (offset < 0L || length < 1)
             throw new IllegalArgumentException();
-            
+
         return array4(ptr, offset, length);
     }
 

Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer.java?rev=786868&r1=786867&r2=786868&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer.java Sat Jun 20 17:44:02 2009
@@ -64,7 +64,7 @@
      */
     public static final int align(int size, int boundary)
     {
-        return (((size) + ((boundary) - 1)) & ~((boundary) - 1));
+        return ((size + (boundary - 1)) & ~(boundary - 1));
     }
 
     /** Alignment to default {@code boundary} function.
@@ -80,7 +80,7 @@
      */
     public static final long align(long size, int boundary)
     {
-        return (((size) + ((boundary) - 1)) & ~((boundary) - 1));
+        return ((size + (boundary - 1)) & ~(boundary - 1));
     }
 
     /** Alignment to default {@code boundary} function.

Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure.java?rev=786868&r1=786867&r2=786868&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure.java Sat Jun 20 17:44:02 2009
@@ -42,6 +42,21 @@
     public abstract int sizeof();
 
     /**
+     * Create a new {@code Pointer} object with value this {@code structure}
+     * contains at the {@code index}.
+     *
+     * @return a {@code Pointer} at {@code index}.
+     * @throws IndexOutOfBoundsException if {@code index} would cause access
+     *          outside the structure address space.
+     * @throws NullPointerException if structure pointer is {@code null}.
+     * @throws UnalignedParameterException if attempt is made to access the
+     *          address that is aligned to the {@code value} primitive type.
+     */
+    public abstract Pointer get(int index)
+        throws IndexOutOfBoundsException, UnalignedParameterException,
+               NullPointerException;
+
+    /**
      * Get a {@code byte} value this {@code structure} contains at the
      * {@code index}.
      *
@@ -129,6 +144,23 @@
                NullPointerException;
 
     /**
+     * Set a {@code Pointer} value to this {@code structure} at the
+     * {@code index} location.
+     *
+     * @param value Value to set at {@code index}.
+     *
+     * @return a {@code Pointer} at {@code index}.
+     * @throws IndexOutOfBoundsException if {@code index} would cause access
+     *          outside the structure address space.
+     * @throws NullPointerException if structure pointer is {@code null}.
+     * @throws UnalignedParameterException if attempt is made to access the
+     *          address that is aligned to the {@code value} primitive type.
+     */
+    public abstract void poke(int index, Pointer v)
+        throws IndexOutOfBoundsException, UnalignedParameterException,
+               NullPointerException;
+
+    /**
      * Set a {@code byte} value to this {@code structure} at the
      * {@code index} location.
      *

Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure32.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure32.java?rev=786868&r1=786867&r2=786868&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure32.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure32.java Sat Jun 20 17:44:02 2009
@@ -46,6 +46,8 @@
     private static native void   poke4(int addr, float  v);
     private static native void   poke5(int addr, double v);
 
+    private static native Pointer get0(int addr);
+
     public int sizeof()
     {
         return POINTER.PLENGTH;
@@ -62,6 +64,32 @@
         return POINTER.equals(((Structure32)other).POINTER);
     }
 
+    public Pointer get(int index)
+        throws IndexOutOfBoundsException, UnalignedParameterException,
+               NullPointerException
+    {
+        if (POINTER.POINTER == 0)
+            throw new NullPointerException();
+        else if (index < 0 || (index + 4) > POINTER.PLENGTH)
+            throw new IndexOutOfBoundsException();
+        else if ((index & 0x03) != 0)
+            throw new UnalignedParameterException();
+        return get0(POINTER.POINTER + index);
+	}
+
+    public void poke(int index, Pointer v)
+        throws IndexOutOfBoundsException, UnalignedParameterException,
+               NullPointerException
+    {
+        if (POINTER.POINTER == 0)
+            throw new NullPointerException();
+        else if (index < 0 || (index + 4) > POINTER.PLENGTH)
+            throw new IndexOutOfBoundsException();
+        else if ((index & 0x03) != 0)
+            throw new UnalignedParameterException();
+        poke2(POINTER.POINTER + index, ((Pointer32)v).POINTER);
+	}
+
     public int peek(int index)
         throws IndexOutOfBoundsException, NullPointerException
     {

Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure64.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure64.java?rev=786868&r1=786867&r2=786868&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure64.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Structure64.java Sat Jun 20 17:44:02 2009
@@ -46,6 +46,8 @@
     private static native void   poke4(long addr, float  v);
     private static native void   poke5(long addr, double v);
 
+    private static native Pointer get0(long addr);
+
     public int sizeof()
     {
         return (int)POINTER.PLENGTH;
@@ -62,6 +64,32 @@
         return POINTER.equals(((Structure64)other).POINTER);
     }
 
+    public Pointer get(int index)
+        throws IndexOutOfBoundsException, UnalignedParameterException,
+               NullPointerException
+    {
+        if (POINTER.POINTER == 0L)
+            throw new NullPointerException();
+        else if (index < 0L || (index + 8) > POINTER.PLENGTH)
+            throw new IndexOutOfBoundsException();
+        else if ((index & 0x07) != 0)
+            throw new UnalignedParameterException();
+        return get0(POINTER.POINTER + index);
+	}
+
+    public void poke(int index, Pointer v)
+        throws IndexOutOfBoundsException, UnalignedParameterException,
+               NullPointerException
+    {
+        if (POINTER.POINTER == 0L)
+            throw new NullPointerException();
+        else if (index < 0L || (index + 8) > POINTER.PLENGTH)
+            throw new IndexOutOfBoundsException();
+        else if ((index & 0x07) != 0)
+            throw new UnalignedParameterException();
+        poke3(POINTER.POINTER + index, ((Pointer64)v).POINTER);
+	}
+
     public int peek(int index)
         throws IndexOutOfBoundsException, UnalignedParameterException
     {
@@ -82,7 +110,7 @@
             throw new IndexOutOfBoundsException();
         else if ((index & 0x01) != 0)
             throw new UnalignedParameterException();
-        return peek1(POINTER.POINTER + index / 2);
+        return peek1(POINTER.POINTER + index);
     }
 
     public int peek32(int index)
@@ -95,7 +123,7 @@
             throw new IndexOutOfBoundsException();
         else if ((index & 0x03) != 0)
             throw new UnalignedParameterException();
-        return peek2(POINTER.POINTER + index / 4);
+        return peek2(POINTER.POINTER + index);
     }
 
     public long peek64(int index)
@@ -108,7 +136,7 @@
             throw new IndexOutOfBoundsException();
         else if ((index & 0x07) != 0)
             throw new UnalignedParameterException();
-        return peek3(POINTER.POINTER + index / 8);
+        return peek3(POINTER.POINTER + index);
     }
 
     public float peek32f(int index)
@@ -121,7 +149,7 @@
             throw new IndexOutOfBoundsException();
         else if ((index & 0x03) != 0)
             throw new UnalignedParameterException();
-        return peek4(POINTER.POINTER + index / 4);
+        return peek4(POINTER.POINTER + index);
     }
 
     public double peek64f(int index)
@@ -134,7 +162,7 @@
             throw new IndexOutOfBoundsException();
         else if ((index & 0x07) != 0)
             throw new UnalignedParameterException();
-        return peek5(POINTER.POINTER + index / 8);
+        return peek5(POINTER.POINTER + index);
     }
 
     public void poke(int index, int value)
@@ -157,7 +185,7 @@
             throw new IndexOutOfBoundsException();
         else if ((index & 0x01) != 0)
             throw new UnalignedParameterException();
-        poke1(POINTER.POINTER + index / 2, value);
+        poke1(POINTER.POINTER + index, value);
     }
 
     public void poke32(int index, int value)
@@ -170,7 +198,7 @@
             throw new IndexOutOfBoundsException();
         else if ((index & 0x03) != 0)
             throw new UnalignedParameterException();
-        poke2(POINTER.POINTER + index / 4, value);
+        poke2(POINTER.POINTER + index, value);
     }
 
     public void poke32(int index, float value)
@@ -183,7 +211,7 @@
             throw new IndexOutOfBoundsException();
         else if ((index & 0x03) != 0)
             throw new UnalignedParameterException();
-        poke4(POINTER.POINTER + index / 4, value);
+        poke4(POINTER.POINTER + index, value);
     }
 
     public void poke64(int index, long value)
@@ -196,7 +224,7 @@
             throw new IndexOutOfBoundsException();
         else if ((index & 0x07) != 0)
             throw new UnalignedParameterException();
-        poke3(POINTER.POINTER + index / 8, value);
+        poke3(POINTER.POINTER + index, value);
     }
 
     public void poke64(int index, double value)
@@ -209,7 +237,7 @@
             throw new IndexOutOfBoundsException();
         else if ((index & 0x07) != 0)
             throw new UnalignedParameterException();
-        poke5(POINTER.POINTER + index / 8, value);
+        poke5(POINTER.POINTER + index, value);
     }
 
     public String toString()
@@ -223,3 +251,4 @@
     }
 
 }
+

Added: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/exception/InvalidStructureElementException.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/exception/InvalidStructureElementException.java?rev=786868&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/exception/InvalidStructureElementException.java (added)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/exception/InvalidStructureElementException.java Sat Jun 20 17:44:02 2009
@@ -0,0 +1,39 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.runtime.exception;
+
+/**
+ * InvalidStructureElementException is thrown when an
+ * {@code AbstractStructure} field is invalid.
+ *
+ * @author Mladen Turk
+ *
+ */
+
+public class InvalidStructureElementException extends RuntimeException
+{
+
+    public InvalidStructureElementException()
+    {
+        super();
+    }
+
+    public InvalidStructureElementException(String msg)
+    {
+        super(msg);
+    }
+}

Propchange: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/exception/InvalidStructureElementException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: commons/sandbox/runtime/trunk/src/main/native/shared/structure.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/structure.c?rev=786868&r1=786867&r2=786868&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/structure.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/structure.c Sat Jun 20 17:44:02 2009
@@ -120,3 +120,13 @@
 
     *(N2P(a, jdouble *)) = v;
 }
+
+ACR_STR_EXPORT_DECLARE(jobject, get0)(ACR_JNISTDARGS, jniptr a)
+{
+	jniptr p;
+    UNREFERENCED_O;
+
+	p = *(N2P(a, jniptr *));
+    return ACR_PointerCreate(_E, (void *)p, sizeof(void *), NULL);
+}
+

Modified: commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestStructure.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestStructure.java?rev=786868&r1=786867&r2=786868&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestStructure.java (original)
+++ commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestStructure.java Sat Jun 20 17:44:02 2009
@@ -16,6 +16,7 @@
 
 package org.apache.commons.runtime;
 
+import org.apache.commons.runtime.exception.*;
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.lang.System;
@@ -39,14 +40,14 @@
     {
         System.loadLibrary("acr");
     }
-    
+
 
     protected class My1Structure extends AbstractStructure
     {
 
         @OffsetOf(0)
         public int IFIELD;
-        
+
         // This field has no annotation, so not visible
         public int SFIELD;
 
@@ -58,8 +59,8 @@
     {
 
         @OffsetOf(0)
-        public int IFIELD;
-        
+        public int I1FIELD;
+
         @OffsetOf(4)
         public Pointer P1FIELD;
 
@@ -73,11 +74,11 @@
         @OffsetOf(0)
         public int   I1FIELD;
         @OffsetOf(4)  // 8
-        public long  L1FIELD;        
+        public long  L1FIELD;
         @OffsetOf(8)  // 16
-        public long  L2FIELD;        
+        public long  L2FIELD;
         @OffsetOf(12) // 20
-        public char  C1FIELD;        
+        public char  C1FIELD;
     }
 
     protected class MyAStructure extends AbstractStructure
@@ -86,9 +87,19 @@
         @OffsetOf(0)
         public int      I1FIELD;
         @OffsetOf(1)
-        public byte []  BAFIELD = new byte[10];        
+        public byte []  BAFIELD = new byte[10];
         @OffsetOf(2)
-        public int  []  AAFIELD;        
+        public int  []  AAFIELD;
+    }
+
+    protected class MyInvalidStructure extends AbstractStructure
+    {
+
+        @OffsetOf(0)
+        public int I1FIELD;
+
+        @OffsetOf(4)
+        public String P1FIELD;
     }
 
     public void testAnnotation()
@@ -99,6 +110,24 @@
         assertEquals("Sizeof", 4, s.sizeof());
     }
 
+    public void testInvalidStructure()
+        throws Throwable
+    {
+        MyInvalidStructure s = new MyInvalidStructure();
+        try {
+        	int c = s.count();
+        	fail("Exception not thrown");
+        }
+        catch (InvalidStructureElementException i)
+        {
+        	// OK.
+        }
+        catch (Exception e)
+        {
+        	fail("Wrong exception thrown : " + e);
+        }
+    }
+
     public void testSize()
         throws Throwable
     {
@@ -108,7 +137,7 @@
             assertEquals("Sizeof", 12, s.sizeof());
         }
         else {
-            assertEquals("Sizeof", 24, s.sizeof());        
+            assertEquals("Sizeof", 24, s.sizeof());
         }
     }
 
@@ -137,5 +166,51 @@
         assertEquals("Fields",  3, s.count());
     }
 
+    public void testWrap()
+        throws Throwable
+    {
+        MyUStructure a = new MyUStructure();
+        MyUStructure b = new MyUStructure();
+        assertEquals("Fields",  4, a.count());
+
+        Pointer p = Memory.calloc(1000);
+        assertNotNull("Pointer", p);
+        Structure s = p.asStructure();
+
+        a.I1FIELD = 2303;
+        a.L1FIELD = 23031964;
+        a.L2FIELD = 27111970;
+        a.C1FIELD = 'M';
+        a.wrap(s);
+        b.unwrap(s);
+        assertEquals("Int  Value",  a.I1FIELD, b.I1FIELD);
+        assertEquals("Long Value",  a.L1FIELD, b.L1FIELD);
+        assertEquals("Long Value",  a.L2FIELD, b.L2FIELD);
+        assertEquals("Char Value",  a.C1FIELD, b.C1FIELD);
+
+   }
+
+    public void testWrapPointer()
+        throws Throwable
+    {
+        My2Structure a = new My2Structure();
+        My2Structure b = new My2Structure();
+        assertEquals("Fields",  3, a.count());
+
+        Pointer p = Memory.calloc(1000);
+        assertNotNull("Pointer", p);
+        Structure s = p.asStructure();
+
+        a.I1FIELD = 2303;
+        a.P1FIELD = Memory.slice(p, 128, Pointer.SIZEOF);
+        a.P2FIELD = Pointer.NULL;
+        a.wrap(s);
+        b.unwrap(s);
+        assertEquals("Int  Value",  a.I1FIELD, b.I1FIELD);
+        assertTrue("Pointer Value",  a.P1FIELD.equals(b.P1FIELD));
+        assertTrue("Null Value",  a.P2FIELD.equals(b.P2FIELD));
+
+   }
+
 }