Message 287831 - Python tracker (original) (raw)

It looks like resolving https://bugs.python.org/issue20160 didn't fix all the issues. When a large struct is used as a parameter, a reference to the object itself is passed to the function, not a reference to a temporary copy, as it is required in https://msdn.microsoft.com/en-us/library/zthk2dkh.aspx.

Here is the reproduction sample:

=== Sample.c: === typedef struct { int v[3]; } Data;

__declspec(dllexport) void Cripple(Data data) { data.v[0] = 0; }

=== Sample.py === from ctypes import *

class Data(Structure): fields = [("v", c_int * 3)]

lib = cdll.LoadLibrary('Sample.dll') getattr(lib, 'Cripple').argtypes = [Data]

data = Data() data.v[0] = 42 lib.Cripple(data) assert data.v[0] == 42 print "OK"

=== repro.cmd === call "%VS140COMNTOOLS%/../../VC/vcvarsall.bat" x86_amd64 cl /LD Sample.c python Sample.py