Skip to content

Commit

Permalink
bpo-16575: Disabled checks for union types being passed by value. (py…
Browse files Browse the repository at this point in the history
…thonGH-17960)

Although the underlying libffi issue remains open, adding these
checks have caused problems in third-party projects which are in
widespread use. See the issue for examples.

The corresponding tests have also been skipped.
  • Loading branch information
vsajip committed Jan 12, 2020
1 parent 100fafc commit c12440c
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 1 deletion.
3 changes: 2 additions & 1 deletion Lib/ctypes/test/test_structures.py
Original file line number Diff line number Diff line change
Expand Up @@ -576,6 +576,7 @@ class U(Union):
self.assertEqual(f2, [0x4567, 0x0123, 0xcdef, 0x89ab,
0x3210, 0x7654, 0xba98, 0xfedc])

@unittest.skipIf(True, 'Test disabled for now - see bpo-16575/bpo-16576')
def test_union_by_value(self):
# See bpo-16575

Expand Down Expand Up @@ -656,7 +657,7 @@ class Test5(Structure):
self.assertEqual(test5.nested.an_int, 0)
self.assertEqual(test5.another_int, 0)

#@unittest.skipIf('s390' in MACHINE, 'Test causes segfault on S390')
@unittest.skipIf(True, 'Test disabled for now - see bpo-16575/bpo-16576')
def test_bitfield_by_value(self):
# See bpo-16576

Expand Down
18 changes: 18 additions & 0 deletions Modules/_ctypes/_ctypes.c
Original file line number Diff line number Diff line change
Expand Up @@ -2401,6 +2401,23 @@ converters_from_argtypes(PyObject *ob)
for (i = 0; i < nArgs; ++i) {
PyObject *cnv;
PyObject *tp = PyTuple_GET_ITEM(ob, i);
/*
* The following checks, relating to bpo-16575 and bpo-16576, have been
* disabled. The reason is that, although there is a definite problem with
* how libffi handles unions (https://github.com/libffi/libffi/issues/33),
* there are numerous libraries which pass structures containing unions
* by values - especially on Windows but examples also exist on Linux
* (https://bugs.python.org/msg359834).
*
* It may not be possible to get proper support for unions and bitfields
* until support is forthcoming in libffi, but for now, adding the checks
* has caused problems in otherwise-working software, which suggests it
* is better to disable the checks.
*
* Although specific examples reported relate specifically to unions and
* not bitfields, the bitfields check is also being disabled as a
* precaution.
StgDictObject *stgdict = PyType_stgdict(tp);
if (stgdict != NULL) {
Expand Down Expand Up @@ -2428,6 +2445,7 @@ converters_from_argtypes(PyObject *ob)
return NULL;
}
}
*/

if (_PyObject_LookupAttrId(tp, &PyId_from_param, &cnv) <= 0) {
Py_DECREF(converters);
Expand Down

0 comments on commit c12440c

Please sign in to comment.