# HG changeset patch # User Hong Minhee # Date 1339450107 -32400 # Node ID 2be1bb9cece35d8126eeadab4fcf957b317e2f3d # Parent b0a3bea03ca23b9384602460e5ef073fb2f531d9 Add ctypes.c_char. Fixes #1917 diff -r b0a3bea03ca2 -r 2be1bb9cece3 Lib/ctypes/__init__.py --- a/Lib/ctypes/__init__.py Sat Jun 09 01:56:14 2012 +0100 +++ b/Lib/ctypes/__init__.py Tue Jun 12 06:28:27 2012 +0900 @@ -5,6 +5,7 @@ _TypeMap = { 'b': jffi.Type.BYTE, 'B': jffi.Type.UBYTE, + 'c': jffi.Type.CHAR, 'h': jffi.Type.SHORT, 'H': jffi.Type.USHORT, 'i': jffi.Type.INT, @@ -190,6 +191,10 @@ _type_ = 'B' _jffi_type = jffi.Type.UBYTE +class c_char(_ScalarCData): + _type_ = 'c' + _jffi_type = jffi.Type.CHAR + class c_short(_ScalarCData): _type_ = 'h' _jffi_type = jffi.Type.SHORT diff -r b0a3bea03ca2 -r 2be1bb9cece3 src/org/python/modules/jffi/CType.java --- a/src/org/python/modules/jffi/CType.java Sat Jun 09 01:56:14 2012 +0100 +++ b/src/org/python/modules/jffi/CType.java Tue Jun 12 06:28:27 2012 +0900 @@ -24,6 +24,7 @@ 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 CHAR = primitive(NativeType.CHAR); public static final CType SHORT = primitive(NativeType.SHORT); public static final CType USHORT = primitive(NativeType.USHORT); public static final CType INT = primitive(NativeType.INT); diff -r b0a3bea03ca2 -r 2be1bb9cece3 src/org/python/modules/jffi/DefaultInvokerFactory.java --- a/src/org/python/modules/jffi/DefaultInvokerFactory.java Sat Jun 09 01:56:14 2012 +0100 +++ b/src/org/python/modules/jffi/DefaultInvokerFactory.java Tue Jun 12 06:28:27 2012 +0900 @@ -69,6 +69,9 @@ case UBYTE: return new Unsigned8Invoker(function, marshallers); + case CHAR: + return new CharInvoker(function, marshallers); + case SHORT: return new Signed16Invoker(function, marshallers); @@ -144,6 +147,9 @@ return Platform.getPlatform().longSize() == 32 ? Unsigned32Marshaller.INSTANCE : Unsigned64Marshaller.INSTANCE; + case CHAR: + return CharMarshaller.INSTANCE; + case FLOAT: return FloatMarshaller.INSTANCE; @@ -341,6 +347,17 @@ } } + private static final class CharInvoker extends BaseInvoker { + + public CharInvoker(Function function, ParameterMarshaller[] marshallers) { + super(function, marshallers); + } + + public final PyObject invoke(PyObject[] args) { + return Util.newChar(jffiInvoker.invokeInt(jffiFunction, convertArguments(args))); + } + } + private static final class FloatInvoker extends BaseInvoker { public FloatInvoker(Function function, ParameterMarshaller[] marshallers) { @@ -453,6 +470,19 @@ } } + private static class CharMarshaller extends BaseMarshaller { + public static final ParameterMarshaller INSTANCE = new CharMarshaller(); + + public void marshal(HeapInvocationBuffer buffer, PyObject arg) { + String string = arg.asString(); + int length = string.length(); + if (length != 1) { + throw Py.TypeError(String.format("expected a character, but string of length %d found", length)); + } + buffer.putByte((byte) string.charAt(0)); + } + } + private static class FloatMarshaller extends BaseMarshaller { public static final ParameterMarshaller INSTANCE = new FloatMarshaller(); diff -r b0a3bea03ca2 -r 2be1bb9cece3 src/org/python/modules/jffi/MemoryOp.java --- a/src/org/python/modules/jffi/MemoryOp.java Sat Jun 09 01:56:14 2012 +0100 +++ b/src/org/python/modules/jffi/MemoryOp.java Tue Jun 12 06:28:27 2012 +0900 @@ -30,6 +30,7 @@ case VOID: return VOID; case BYTE: + case CHAR: return INT8; case UBYTE: return UINT8; diff -r b0a3bea03ca2 -r 2be1bb9cece3 src/org/python/modules/jffi/NativeType.java --- a/src/org/python/modules/jffi/NativeType.java Sat Jun 09 01:56:14 2012 +0100 +++ b/src/org/python/modules/jffi/NativeType.java Tue Jun 12 06:28:27 2012 +0900 @@ -7,6 +7,7 @@ BOOL, BYTE, UBYTE, + CHAR, SHORT, USHORT, INT, @@ -30,6 +31,7 @@ case VOID: return com.kenai.jffi.Type.VOID; case BYTE: + case CHAR: return com.kenai.jffi.Type.SINT8; case UBYTE: return com.kenai.jffi.Type.UINT8; diff -r b0a3bea03ca2 -r 2be1bb9cece3 src/org/python/modules/jffi/Util.java --- a/src/org/python/modules/jffi/Util.java Sat Jun 09 01:56:14 2012 +0100 +++ b/src/org/python/modules/jffi/Util.java Tue Jun 12 06:28:27 2012 +0900 @@ -51,6 +51,10 @@ : Py.newInteger(value); } + public static final PyObject newChar(int value) { + return Py.newString((char) value); + } + public static final PyObject newString(long address) { return address != 0 ? Py.newString(new String(IO.getZeroTerminatedByteArray(address)))