New submission from Ranger Harke: I have noticed that the automatic upcast mechanism which works for standard ctypes types does not appear to work for custom types with _as_parameter_ defined.
Consider the following example (written for Mac OS X but just change the LoadLibrary call to test on a different OS): # -- begin -- from ctypes import * libc = cdll.LoadLibrary('/usr/lib/libc.dylib') class Base(Structure): pass class Derived(Base): pass class Wrapper(object): pass printf = libc.printf printf.argtypes = [ c_char_p, POINTER(Base) ] printf.restype = c_int derived = Derived() derived_ptr = pointer(derived) derived_ptr_wrapper = Wrapper() derived_ptr_wrapper._as_parameter_ = pointer(derived) # Case 1 WORKS: Derived* is automatically upcast to Base* and passed to # printf printf(b'%p\n', derived_ptr) # Case 2 WORKS: The Wrapper can be explicitly upcast to a Base* and # passed to printf printf(b'%p\n', cast(derived_ptr_wrapper, POINTER(Base))) # Case 3 FAILS: Automatic upcast does NOT happen with the value in the # Wrapper: 'expected LP_Base instance instead of # LP_Derived' printf(b'%p\n', derived_ptr_wrapper) # -- end -- Here we have two types, Base which is a ctypes Structure, and Derived which derives from Base. A pointer to Derived can be passed to a function that expects a pointer to Base, and it will automatically be upcast. However, once the Wrapper type is introduced, which simply holds a pointer to Derived in its _as_parameter_ attribute, the automatic upcast no longer occurs. A manual upcast works, though. I believe this may be related to #27803, but that is talking about byref() whereas this is related to cast(). Perhaps the internal mechanism is the same; certainly it sounds like a similar problem. I've tested this in Python 2.7 and 3.6, and the result is the same. Not sure if this is a bug or an enhancement request- filing it as "behavior" for now since to me, this is something that I expected to implicitly work. Thanks! - Ranger Harke. ---------- components: ctypes messages: 296245 nosy: rharke priority: normal severity: normal status: open title: Automatic upcast does not occur for custom classes type: behavior versions: Python 2.7, Python 3.6 _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue30692> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com