[Top][All Lists]
[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();
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [cinvoke-svn] r75 - trunk/cinvoke/bindings/java/org/cinvoke,
will <=