cinvoke-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[cinvoke-svn] r75 - trunk/cinvoke/bindings/java/org/cinvoke


From: will
Subject: [cinvoke-svn] r75 - trunk/cinvoke/bindings/java/org/cinvoke
Date: 6 Jul 2006 18:21:23 -0400

Author: will
Date: 2006-07-06 18:21:17 -0400 (Thu, 06 Jul 2006)
New Revision: 75

Modified:
   trunk/cinvoke/bindings/java/org/cinvoke/CInvProxy.java
Log:
more marshaling code


Modified: trunk/cinvoke/bindings/java/org/cinvoke/CInvProxy.java
===================================================================
--- trunk/cinvoke/bindings/java/org/cinvoke/CInvProxy.java      2006-07-06 
03:36:27 UTC (rev 74)
+++ trunk/cinvoke/bindings/java/org/cinvoke/CInvProxy.java      2006-07-06 
22:21:17 UTC (rev 75)
@@ -109,7 +109,8 @@
                if (returncls.equals(String.class))
                        realretcls = Ptr.class;
 
-               Object[] params = marshalParams(method, args);
+               Class[] pclasses = method.getParameterTypes();
+               Object[] params = marshalParams(method, pclasses, args);
                try {
                        Object ret;
                        try {
@@ -123,6 +124,13 @@
                                        throw ex;
                        }
 
+                       for (int i = 0; i < pclasses.length; i++) {
+                               if (pclasses[i].isArray()) {
+                                       
unmarshalArray(((Ptr)params[i]).longValue(), args[i],
+                                               pclasses[i].getComponentType());
+                               }
+                       }
+
                        if (returncls != null)
                                return unmarshalReturnValue(ret, returncls);
                        else
@@ -136,6 +144,8 @@
                if (cls.isArray()) {
                        if (cls.isInterface())
                                throw new CInvokeError("Arrays of callbacks not 
supported");
+                       if (cls.equals(String.class))
+                               throw new CInvokeError("Arrays of strings not 
supported");
                        return Natives.T_PTR;
                } else {
                        if (cls.isInterface())
@@ -169,10 +179,13 @@
                                        throw new CInvokeError(
                                        "Passing or returning structures by 
value not supported");
                                else
-                                       return -999;
+                                       return STRUCT_TYPE;
                        }
                }
        }
+
+       private final static int STRUCT_TYPE = -999;
+       
        private char gettypechar(int type) {
                switch (type) {
                case Natives.T_JSHORT:
@@ -235,9 +248,9 @@
                return new NativeMethod(_ctx, func, ep, types, hasret, rettype);
        }
 
-       private Object[] marshalParams(Method method, Object[] rawparams) {
+       private Object[] marshalParams(Method method, Class[] pclasses,
+               Object[] rawparams) {
                Object[] ret = new Object[rawparams.length];
-               Class[] pclasses = method.getParameterTypes();
 
                for (int i = 0; i < ret.length; i++) {
                        if (pclasses[i].isArray())
@@ -258,24 +271,10 @@
                Object[] rawparams) {
                Class[] pclasses = method.getParameterTypes();
                for (int i = 0; i < params.length; i++) {
-                       if (pclasses[i].isArray()) {
-                               long l = ((Ptr)params[i]).longValue();
-                               if (l != 0) {
-                                       Class comp = 
pclasses[i].getComponentType();
-                                       if (comp.equals(String.class)) {
-                                               long incr = sizeof(comp);
-                                               long tmp = l;
-                                               int len = 
Array.getLength(rawparams[i]);
-                                               for (int j = 0; j < len; j++) {
-                                                       
Natives.freeIndirect(tmp);
-                                                       tmp += incr;
-                                               }
-                                       }
-                                       Natives.free(l);
-                               }
-                       } else if (pclasses[i].isInterface()) {
+                       if (pclasses[i].isInterface()) {
                                // XXX delete callback
-                       } else if (pclasses[i].equals(String.class)) {
+                       } else if (pclasses[i].isArray() ||
+                                       pclasses[i].equals(String.class)) {
                                Natives.free(((Ptr)params[i]).longValue());
                        }
                }
@@ -297,9 +296,43 @@
                        return ret;
        }
 
-       private Object unmarshalStruct(long p, Class eltype) {
-               // XXX
-               return null;
+       private Object unmarshalStruct(long ptr, Class cls) {
+               long st = getNativeStruct(cls).st;
+               Field[] fields = cls.getFields();
+               Object ret;
+
+               try {
+                       ret = cls.newInstance();
+               } catch (IllegalAccessException iae) {
+                       throw new CInvokeError("Cannot create new instance of 
class " +
+                               cls.getName() + " due a security error: " + 
iae.toString());
+               } catch (InstantiationException ie) {
+                       throw new CInvokeError("Cannot create new instance of 
class " +
+                               cls.getName() + " due to error: " + 
ie.toString());
+               }
+               for (int i = 0; i < fields.length; i++) {
+                       Field fld = fields[i];
+                       Class tcls = fld.getType();
+                       Object val;
+                       int type = gettypeint(tcls, false);
+                       if (type == STRUCT_TYPE) {
+                               long p = Natives.getMemberPtrStruct(_ctx, st, 
ptr,
+                                       fld.getName());
+                               if (p == 0) fail();
+                               val = unmarshalStruct(p, tcls);
+                       } else {
+                               val = Natives.getMemberValueStruct(_ctx, st, 
ptr,
+                                       fld.getName(), tcls, type);
+                       }
+                       try {
+                               fld.set(ret, val);
+                       } catch (IllegalAccessException iae) {
+                               throw new CInvokeError(cls.getName() +
+                                       " field access failed: " + 
iae.toString());
+                       }
+               }
+               
+               return ret;
        }
 
        private long marshalStruct(long outp, Object s, Class cls) {
@@ -315,15 +348,16 @@
                        try {
                                val = fld.get(s);
                        } catch (IllegalAccessException iae) {
-                               throw new CInvokeError("field access failed");
+                               throw new CInvokeError(cls.getName() +
+                                       " field access failed: " + 
iae.toString());
                        }
                        int type = gettypeint(tcls, false);
-                       if (type == -999) { // XXX fix all these
+                       if (type == STRUCT_TYPE) {
                                long p = Natives.getMemberPtrStruct(_ctx, st,
                                        outp, fld.getName());
                                if (p == 0) fail();
                                marshalStruct(p, val, tcls);
-                       } else { // XXX string struct members
+                       } else {
                                if (Natives.setMemberValueStruct(_ctx, st, outp,
                                        fld.getName(), val, type) == 0)
                                        fail();
@@ -368,21 +402,13 @@
                if (ret == 0)
                        throw new OutOfMemoryError();
                
-               boolean string = false;
-               boolean strct = false;
                int itype = gettypeint(eltype, false);
-               if (itype == -999)
-                       strct = true;
-               if (eltype.equals(String.class))
-                       string = true;
 
                long r = ret;
                for (int i = 0; i < numels; i++) {
                        Object o = Array.get(val, i);
-                       if (strct)
+                       if (itype == -909)
                                r = marshalStruct(r, o, eltype);
-                       else if (string)
-                               r = Natives.writeValue(r, 
marshalString((String)o), itype);
                        else
                                r = Natives.writeValue(r, marshalBasic(o, 
eltype), itype);
                }
@@ -395,22 +421,14 @@
                        throw new CInvokeError("Reading array from null 
pointer");
                int numels = Array.getLength(arr);
                
-               boolean string = false;
-               boolean strct = false;
                int itype = gettypeint(eltype, false);
-               if (itype == -999)
-                       strct = true;
-               if (eltype.equals(String.class))
-                       string = true;
                int elsize = sizeof(eltype);
 
                long p = ptr;
                for (int i = 0; i < numels; i++) {
                        Object toset;
-                       if (strct)
+                       if (itype == STRUCT_TYPE)
                                toset = unmarshalStruct(p, eltype);
-                       else if (string)
-                               toset = unmarshalString(p);
                        else
                                toset = Natives.readValue(p, eltype, itype);
                        Array.set(arr, i, toset);
@@ -439,8 +457,13 @@
                                        throw new CInvokeError(
                                                "Callback structure members not 
supported");
                                }
+                               if (tcls.equals(String.class)) {
+                                       Natives.deleteStruct(_ctx, st);
+                                       throw new CInvokeError(
+                                               "String structure members not 
supported");
+                               }
                                int type = gettypeint(tcls, false);
-                               if (type == -999) {
+                               if (type == STRUCT_TYPE) {
                                        if (Natives.addStructMemberStruct(_ctx, 
st,
                                                fields[i].getName(),
                                                getNativeStruct(tcls).st) == 0) 
{
@@ -483,7 +506,7 @@
        }
        public int sizeof(Class type) {
                int itype = gettypeint(type, false);
-               if (itype == -999) {
+               if (itype == STRUCT_TYPE) {
                        int ret = Natives.sizeStruct(_ctx, 
getNativeStruct(type).st);
                        if (ret == -1)
                                fail();





reply via email to

[Prev in Thread] Current Thread [Next in Thread]