From: <wme...@us...> - 2009-09-03 15:46:07
|
Revision: 6745 http://jython.svn.sourceforge.net/jython/?rev=6745&view=rev Author: wmeissner Date: 2009-09-03 15:45:59 +0000 (Thu, 03 Sep 2009) Log Message: ----------- Add _type_ attribute to basic ctypes classes, and add c_bool Modified Paths: -------------- branches/ctypes-jffi/Lib/ctypes/__init__.py branches/ctypes-jffi/src/org/python/modules/jffi/CType.java branches/ctypes-jffi/src/org/python/modules/jffi/MemoryOp.java branches/ctypes-jffi/src/org/python/modules/jffi/NativeType.java branches/ctypes-jffi/src/org/python/modules/jffi/jffi.java Modified: branches/ctypes-jffi/Lib/ctypes/__init__.py =================================================================== --- branches/ctypes-jffi/Lib/ctypes/__init__.py 2009-09-03 15:02:40 UTC (rev 6744) +++ branches/ctypes-jffi/Lib/ctypes/__init__.py 2009-09-03 15:45:59 UTC (rev 6745) @@ -1,5 +1,23 @@ import jffi +_TypeMap = { + 'b': jffi.Type.BYTE, + 'B': jffi.Type.UBYTE, + 'h': jffi.Type.SHORT, + 'H': jffi.Type.USHORT, + 'i': jffi.Type.INT, + 'I': jffi.Type.UINT, + 'l': jffi.Type.LONG, + 'L': jffi.Type.ULONG, + 'q': jffi.Type.LONGLONG, + 'Q': jffi.Type.ULONGLONG, + 'f': jffi.Type.FLOAT, + 'd': jffi.Type.DOUBLE, + '?': jffi.Type.BOOL, + 'z': jffi.Type.STRING, + 'P': jffi.Type.POINTER +} + class _CTypeMetaClass(type): def __new__(cls, name, bases, dict): @@ -89,7 +107,12 @@ __metaclass__ = _UnionMetaClass def sizeof(type): - return type._jffi_type.size + if isinstance(type, jffi.CData): + return type._jffi_type.size + elif hasattr(type, '_type_'): + return _TypeMap[type.__getattribute__('_type_')] + else: + raise TypeError("invalid ctype") def alignment(type): return type._jffi_type.alignment @@ -121,40 +144,56 @@ _pointer_type_cache[ctype] = ptype return ptype +class c_bool(_ScalarCData): + _type_ = "?" + _jffi_type = jffi.Type.BOOL + class c_byte(_ScalarCData): + _type_ = 'b' _jffi_type = jffi.Type.BYTE class c_ubyte(_ScalarCData): + _type_ = 'B' _jffi_type = jffi.Type.UBYTE class c_short(_ScalarCData): + _type_ = 'h' _jffi_type = jffi.Type.SHORT class c_ushort(_ScalarCData): + _type_ = 'H' _jffi_type = jffi.Type.USHORT class c_int(_ScalarCData): + _type_ = 'i' _jffi_type = jffi.Type.INT class c_uint(_ScalarCData): + _type_ = 'I' _jffi_type = jffi.Type.UINT class c_longlong(_ScalarCData): + _type_ = 'q' _jffi_type = jffi.Type.LONGLONG class c_ulonglong(_ScalarCData): + _type_ = 'Q' _jffi_type = jffi.Type.ULONGLONG class c_long(_ScalarCData): + _type_ = 'l' _jffi_type = jffi.Type.LONG class c_ulong(_ScalarCData): + _type_ = 'L' _jffi_type = jffi.Type.ULONG class c_float(_ScalarCData): + _type_ = 'f' _jffi_type = jffi.Type.FLOAT class c_double(_ScalarCData): + _type_ = 'd' _jffi_type = jffi.Type.DOUBLE c_int8 = c_byte @@ -170,9 +209,11 @@ c_ssize_t = c_long class c_char_p(_ScalarCData): + _type_ = 'z' _jffi_type = jffi.Type.STRING class c_void_p(_ScalarCData): + _type_ = 'P' _jffi_type = jffi.Type.POINTER class _Function(jffi.Function): Modified: branches/ctypes-jffi/src/org/python/modules/jffi/CType.java =================================================================== --- branches/ctypes-jffi/src/org/python/modules/jffi/CType.java 2009-09-03 15:02:40 UTC (rev 6744) +++ branches/ctypes-jffi/src/org/python/modules/jffi/CType.java 2009-09-03 15:45:59 UTC (rev 6745) @@ -20,6 +20,7 @@ TYPE.fastGetDict().__setitem__("Pointer", Pointer.TYPE); } public static final CType VOID = primitive(NativeType.VOID); + public static final CType BOOL = primitive(NativeType.BOOL); public static final CType BYTE = primitive(NativeType.BYTE); public static final CType UBYTE = primitive(NativeType.UBYTE); public static final CType SHORT = primitive(NativeType.SHORT); Modified: branches/ctypes-jffi/src/org/python/modules/jffi/MemoryOp.java =================================================================== --- branches/ctypes-jffi/src/org/python/modules/jffi/MemoryOp.java 2009-09-03 15:02:40 UTC (rev 6744) +++ branches/ctypes-jffi/src/org/python/modules/jffi/MemoryOp.java 2009-09-03 15:45:59 UTC (rev 6745) @@ -11,6 +11,7 @@ abstract class MemoryOp { public static final MemoryOp INVALID = new InvalidOp(); public static final MemoryOp VOID = new VoidOp(); + public static final MemoryOp BOOL = new BooleanOp(); public static final MemoryOp INT8 = new Signed8(); public static final MemoryOp UINT8 = new Unsigned8(); public static final MemoryOp INT16 = new Signed16(); @@ -58,6 +59,8 @@ return POINTER; case STRING: return STRING; + case BOOL: + return BOOL; default: throw new UnsupportedOperationException("No MemoryOp for " + type); } @@ -85,6 +88,17 @@ throw Py.TypeError("Attempting to read void from memory"); } } + + private static final class BooleanOp extends MemoryOp { + public final void put(Memory mem, long offset, PyObject value) { + mem.putInt(offset, value.__nonzero__() ? 1 : 0); + } + + public final PyObject get(Memory mem, long offset) { + return Py.newBoolean(mem.getInt(offset) != 0); + } + } + static final class Signed8 extends MemoryOp { public final void put(Memory mem, long offset, PyObject value) { mem.putByte(offset, Util.int8Value(value)); Modified: branches/ctypes-jffi/src/org/python/modules/jffi/NativeType.java =================================================================== --- branches/ctypes-jffi/src/org/python/modules/jffi/NativeType.java 2009-09-03 15:02:40 UTC (rev 6744) +++ branches/ctypes-jffi/src/org/python/modules/jffi/NativeType.java 2009-09-03 15:45:59 UTC (rev 6745) @@ -4,6 +4,7 @@ public enum NativeType { VOID, + BOOL, BYTE, UBYTE, SHORT, @@ -34,6 +35,7 @@ case USHORT: return com.kenai.jffi.Type.UINT16; case INT: + case BOOL: return com.kenai.jffi.Type.SINT32; case UINT: return com.kenai.jffi.Type.UINT32; Modified: branches/ctypes-jffi/src/org/python/modules/jffi/jffi.java =================================================================== --- branches/ctypes-jffi/src/org/python/modules/jffi/jffi.java 2009-09-03 15:02:40 UTC (rev 6744) +++ branches/ctypes-jffi/src/org/python/modules/jffi/jffi.java 2009-09-03 15:45:59 UTC (rev 6745) @@ -20,6 +20,7 @@ dict.__setitem__("DynamicLibrary", DynamicLibrary.TYPE); dict.__setitem__("Type", CType.TYPE); dict.__setitem__("Function", Function.TYPE); + dict.__setitem__("CData", CData.TYPE); dict.__setitem__("PointerCData", PointerCData.TYPE); dict.__setitem__("ScalarCData", ScalarCData.TYPE); dict.__setitem__("Structure", Structure.TYPE); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |