@@ -844,17 +844,22 @@ protected ArgumentClinicProvider getArgumentClinic() {
844844 Object doit (CDataObject obj , int offset ,
845845 @ Cached PyTypeCheck pyTypeCheck ,
846846 @ Cached PyObjectStgDictNode pyObjectStgDictNode ) {
847-
848847 if (!pyTypeCheck .isCDataObject (obj )) {
849848 return error (null , obj , offset );
850849 }
851-
850+ FFIType ffiType = pyObjectStgDictNode . execute ( obj ). ffi_type_pointer ;
852851 PyCArgObject parg = factory ().createCArgObject ();
853852 parg .tag = 'P' ;
854853 // parg.pffi_type = FFIType.ffi_type_pointer;
855- parg .pffi_type = pyObjectStgDictNode . execute ( obj ). ffi_type_pointer ;
854+ parg .pffi_type = ffiType . getAsArray () ;
856855 parg .obj = obj ;
856+ if (parg .pffi_type != ffiType && !obj .b_ptr .isManagedBytes ()) {
857+ parg .value = PtrValue .allocate (parg .pffi_type , ffiType .size );
858+ parg .value .writeArrayElement (ffiType , 0 , obj .b_ptr .getPrimitiveValue (ffiType ));
859+ obj .b_ptr .ptr = parg .value .ptr ;
860+ }
857861 parg .value = obj .b_ptr .ref (offset );
862+
858863 return parg ;
859864 }
860865
@@ -1083,6 +1088,29 @@ Object _ctypes_callproc(VirtualFrame frame,
10831088 } else {
10841089 throw raise (NotImplementedError , "Returned object is not supported." );
10851090 }
1091+ } else {
1092+ try {
1093+ switch (rtype .type ) {
1094+ case FFI_TYPE_UINT8 :
1095+ case FFI_TYPE_SINT8 :
1096+ result = ilib .asByte (result );
1097+ break ;
1098+ case FFI_TYPE_UINT16 :
1099+ case FFI_TYPE_SINT16 :
1100+ result = ilib .asShort (result );
1101+ break ;
1102+ case FFI_TYPE_UINT32 :
1103+ case FFI_TYPE_SINT32 :
1104+ result = ilib .asInt (result );
1105+ break ;
1106+ case FFI_TYPE_SINT64 :
1107+ case FFI_TYPE_UINT64 :
1108+ result = ilib .asLong (result );
1109+ break ;
1110+ }
1111+ } catch (UnsupportedMessageException e ) {
1112+ // pass through.
1113+ }
10861114 }
10871115
10881116 if (!PGuards .isPNone (checker )) {
0 commit comments