Skip to content

Commit 63e2746

Browse files
committed
improve return type and byref compatibility
1 parent 120de27 commit 63e2746

File tree

1 file changed

+31
-3
lines changed

1 file changed

+31
-3
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CtypesModuleBuiltins.java

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)