On Tue, Mar 24, 2015 at 11:31 PM, Paul Moore email@example.com wrote:
On 12 March 2015 at 17:44, Paul Moore firstname.lastname@example.org wrote:
On 12 March 2015 at 17:26, Brett Cannon email@example.com wrote:
I'm all for ditching our 'libffi_msvc' in favor of adding libffi as another 'external' for the Windows build. I have managed to get _ctypes to build on Windows using vanilla libffi sources, prepared using their configure script from within Git Bash and built with our usual Windows build system (properly patched). Unfortunately, making things usable will take some work on ctypes itself, which I'm not qualified to do. I'm happy to pass on my procedure and patches for getting to the point of successful compilation to anyone who feels up to fixing the things that are broken.
So it seems possible to use upstream libffi but will require some work.
I'd be willing to contemplate helping out on the Windows side of things, if nobody else steps up (with the proviso that I have little free time, and I'm saying this without much idea of what's involved :-)) If Zachary can give a bit more detail on what the work on ctypes is, and/or put what he has somewhere that I could have a look at, that might help.
One thing that seems to be an issue. On Windows, ctypes detects if the FFI call used the wrong number of arguments off the stack, and raises a ValueError if it does. The tests rely on that behaviour. But it's based on ffi_call() returning a value, which upstream libffi doesn't do. As far as I can tell (not that the libffi docs are exactly comprehensive...) there's no way of getting that information from upstream libffi.
What does Unix ctypes do when faced with a call being made with the wrong number of arguments? On Windows, using upstream libffi and omitting the existing check, it seems to crash the Python process, which obviously isn't good. But the test that fails is Windows-specific, and short of going through all the tests looking for one that checks passing the wrong number of arguments and isn't platform-specific, I don't know how Unix handles this.
Can anyone on Unix tell me if a ctypes call with the wrong number of arguments returns ValueError on Unix? Something like strcmp() (with no args) should do as a test, I guess...
If there's a way Unix handles this, I can see about replicating it on Windows. But if there isn't, I fear we could always need a patched libffi to maintain the interface we currently have...
Linux crashes. The mechanism for detecting the number of arguments is only available on windows (note that this is a band-aid anyway, since if your arguments are of the wrong kind you segfault anyway). We do have two copies of libffi one for windows one for unix anyway, don't we?