Michael Felt added the comment: On 8/4/2016 10:58 AM, Martin Panter wrote: > Can you figure out a way to test for XLC (but not GCC, which the AIX buildbot > uses), and then try my patch out? Hopefully you see no more compiler > warnings, test_ints() should now pass, and test_shorts() should be skipped.
Was not as simple as it sounds. I could not find a specific parameter provided by xlc and as you wanted something that would only skip on AIX - testing for __GNUC__ (in the positive sense) will not work either. What I am thinking of now is #if defined(__GNUC__) || !defined(_AIX) ... #endif As this will pass on AIX when GCC is used, but only be skipped on AIX when GCC is not used. +++++++++++++++++++++++++++++++++++++++++++++++++++++ More TESTS ++++ Summary - maybe the problem is with the "byref()" routine... ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ My initial test of the patch confused me, so I went back to the original code - and started again. I have three partitions I am testing on - x064 (AIX 5.3 TL7, vac v.11); x065 (AIX 5.3 TL7, gcc 4.7.4), and x067 ( Debian 3.16.7-ckt9-3 (2015-04-23) ppc64, gcc (Debian 5.3.1-21) 5.3.1 20160528) My working directory is /data/prj/aixtools/python/python-2.7.12.0 which is a copy of the extracted Python-2.7.12. This directory is on NFS, so each system is using the same files as source: The first builds - no changes - expect to test_bitfields.py: ##for n in "ABCDEFGHIMNOPQRS": ## print n, hex(getattr(BITS, n).size), getattr(BITS, n).offset for n in "ABCDEFGHIMNOPQRS": b = BITS() print n, hex(getattr(BITS, n).size), getattr(BITS, n).offset, func(byref(b), n) x065: root@x065:[/data/prj/aixtools/python/python-2.7.12.0]./python Lib/ctypes/test/test_bitfields.py A 0x1001f 0 0 B 0x2001d 0 0 C 0x3001a 0 0 D 0x40016 0 0 E 0x50011 0 0 F 0x6000b 0 0 G 0x70004 0 0 H 0x80018 4 0 I 0x9000f 4 0 M 0x1000e 6 0 N 0x2000c 6 0 O 0x30009 6 0 P 0x40005 6 0 Q 0x50000 6 0 R 0x6000a 8 0 S 0x70003 8 0 root@x067:/data/prj/aixtools/python/python-2.7.12.0# ./python Lib/ctypes/test/test_bitfields.py A 0x1001f 0 0 B 0x2001d 0 0 C 0x3001a 0 0 D 0x40016 0 0 E 0x50011 0 0 F 0x6000b 0 0 G 0x70004 0 0 H 0x80018 4 0 I 0x9000f 4 0 M 0x1000e 6 0 N 0x2000c 6 0 O 0x30009 6 0 P 0x40005 6 0 Q 0x50000 6 0 R 0x6000a 8 0 S 0x70003 8 0 ................... ---------------------------------------------------------------------- Ran 19 tests in 0.087s OK root@x064:[/data/prj/aixtools/python/python-2.7.12.0]./python Lib/ctypes/test/test_bitfields.py A 0x1001f 0 0 B 0x2001d 0 0 C 0x3001a 0 0 D 0x40016 0 0 E 0x50011 0 0 F 0x6000b 0 0 G 0x70004 0 0 H 0x80018 4 0 I 0x9000f 4 0 M 0x1000e 6 0 N 0x2000c 6 0 O 0x30009 6 0 P 0x40005 6 0 Q 0x50000 6 0 R 0x6000a 8 0 S 0x70003 8 0 .................FF ====================================================================== FAIL: test_ints (__main__.C_Test) ---------------------------------------------------------------------- Traceback (most recent call last): File "Lib/ctypes/test/test_bitfields.py", line 45, in test_ints self.assertEqual((name, i, getattr(b, name)), (name, i, func(byref(b), name))) AssertionError: Tuples differ: ('A', 1, -1) != ('A', 1, 1) First differing element 2: -1 1 - ('A', 1, -1) ? - + ('A', 1, 1) ====================================================================== FAIL: test_shorts (__main__.C_Test) ---------------------------------------------------------------------- Traceback (most recent call last): File "Lib/ctypes/test/test_bitfields.py", line 52, in test_shorts self.assertEqual((name, i, getattr(b, name)), (name, i, func(byref(b), name))) AssertionError: Tuples differ: ('M', 1, -1) != ('M', 1, 1) First differing element 2: -1 1 - ('M', 1, -1) ? - + ('M', 1, 1) ---------------------------------------------------------------------- Ran 19 tests in 0.010s FAILED (failures=2) root@x064:[/data/prj/aixtools/python/python-2.7.12.0] Changed the test again to include: ##for n in "ABCDEFGHIMNOPQRS": ## print n, hex(getattr(BITS, n).size), getattr(BITS, n).offset for n in "ABCDEFGHIMNOPQRS": b = BITS() print n, hex(getattr(BITS, n).size), getattr(BITS, n).offset, getattr(b,n), func(byref(b), n) root@x064:[/data/prj/aixtools/python/python-2.7.12.0]./python Lib/ctypes/test/test_bitfields.py A 0x1001f 0 0 0 B 0x2001d 0 0 0 C 0x3001a 0 0 0 D 0x40016 0 0 0 E 0x50011 0 0 0 F 0x6000b 0 0 0 G 0x70004 0 0 0 H 0x80018 4 0 0 I 0x9000f 4 0 0 M 0x1000e 6 0 0 N 0x2000c 6 0 0 O 0x30009 6 0 0 P 0x40005 6 0 0 Q 0x50000 6 0 0 R 0x6000a 8 0 0 S 0x70003 8 0 0 .................FF ====================================================================== FAIL: test_ints (__main__.C_Test) ---------------------------------------------------------------------- Traceback (most recent call last): File "Lib/ctypes/test/test_bitfields.py", line 45, in test_ints self.assertEqual((name, i, getattr(b, name)), (name, i, func(byref(b), name))) AssertionError: Tuples differ: ('A', 1, -1) != ('A', 1, 1) First differing element 2: -1 1 - ('A', 1, -1) ? - + ('A', 1, 1) ====================================================================== FAIL: test_shorts (__main__.C_Test) ---------------------------------------------------------------------- Traceback (most recent call last): File "Lib/ctypes/test/test_bitfields.py", line 52, in test_shorts self.assertEqual((name, i, getattr(b, name)), (name, i, func(byref(b), name))) AssertionError: Tuples differ: ('M', 1, -1) != ('M', 1, 1) First differing element 2: -1 1 - ('M', 1, -1) ? - + ('M', 1, 1) ---------------------------------------------------------------------- Ran 19 tests in 0.010s FAILED (failures=2) ********************************************************************** So, I am wondering if the problem could be better repaired in setattr(b, name, i) And changed the test again: 1) comment out the initial changes 2) the following changes (note range limited to 5 for both, rather 512 for first and 256 for second) class C_Test(unittest.TestCase): def test_ints(self): for i in range(5): for name in "ABCDEFGHI": b = BITS() setattr(b, name, i) print "name:", name, "range:", i, "getattr():", getattr(b,name), "byref():", func(byref(b), name) # self.assertEqual((name, i, getattr(b, name)), (name, i, func(byref(b), name))) def test_shorts(self): for i in range(5): for name in "MNOPQRS": b = BITS() setattr(b, name, i) print "name:", name, "range:", i, "getattr():", getattr(b,name), "byref():", func(byref(b), name) # self.assertEqual((name, i, getattr(b, name)), (name, i, func(byref(b), name))) *************************** And for most tests (remember the range is 5 now) - all is fine root@x064:[/data/prj/aixtools/python/python-2.7.12.0]./python Lib/ctypes/test/test_bitfields.py .................name: A range: 0 getattr(): 0 byref(): 0 name: B range: 0 getattr(): 0 byref(): 0 name: C range: 0 getattr(): 0 byref(): 0 name: D range: 0 getattr(): 0 byref(): 0 name: E range: 0 getattr(): 0 byref(): 0 name: F range: 0 getattr(): 0 byref(): 0 name: G range: 0 getattr(): 0 byref(): 0 name: H range: 0 getattr(): 0 byref(): 0 name: I range: 0 getattr(): 0 byref(): 0 name: A range: 1 getattr(): -1 byref(): 1 name: B range: 1 getattr(): 1 byref(): 1 name: C range: 1 getattr(): 1 byref(): 1 name: D range: 1 getattr(): 1 byref(): 1 name: E range: 1 getattr(): 1 byref(): 1 name: F range: 1 getattr(): 1 byref(): 1 name: G range: 1 getattr(): 1 byref(): 1 name: H range: 1 getattr(): 1 byref(): 1 name: I range: 1 getattr(): 1 byref(): 1 name: A range: 2 getattr(): 0 byref(): 0 name: B range: 2 getattr(): -2 byref(): 2 name: C range: 2 getattr(): 2 byref(): 2 name: D range: 2 getattr(): 2 byref(): 2 name: E range: 2 getattr(): 2 byref(): 2 name: F range: 2 getattr(): 2 byref(): 2 name: G range: 2 getattr(): 2 byref(): 2 name: H range: 2 getattr(): 2 byref(): 2 name: I range: 2 getattr(): 2 byref(): 2 name: A range: 3 getattr(): -1 byref(): 1 name: B range: 3 getattr(): -1 byref(): 3 name: C range: 3 getattr(): 3 byref(): 3 name: D range: 3 getattr(): 3 byref(): 3 name: E range: 3 getattr(): 3 byref(): 3 name: F range: 3 getattr(): 3 byref(): 3 name: G range: 3 getattr(): 3 byref(): 3 name: H range: 3 getattr(): 3 byref(): 3 name: I range: 3 getattr(): 3 byref(): 3 name: A range: 4 getattr(): 0 byref(): 0 name: B range: 4 getattr(): 0 byref(): 0 name: C range: 4 getattr(): -4 byref(): 4 name: D range: 4 getattr(): 4 byref(): 4 name: E range: 4 getattr(): 4 byref(): 4 name: F range: 4 getattr(): 4 byref(): 4 name: G range: 4 getattr(): 4 byref(): 4 Back to x065... root@x065:[/data/prj/aixtools/python/python-2.7.12.0]./python Lib .................name: A range: 0 getattr(): 0 byref(): 0 name: B range: 0 getattr(): 0 byref(): 0 name: C range: 0 getattr(): 0 byref(): 0 name: D range: 0 getattr(): 0 byref(): 0 name: E range: 0 getattr(): 0 byref(): 0 name: F range: 0 getattr(): 0 byref(): 0 name: G range: 0 getattr(): 0 byref(): 0 name: H range: 0 getattr(): 0 byref(): 0 name: I range: 0 getattr(): 0 byref(): 0 name: A range: 1 getattr(): -1 byref(): -1 name: B range: 1 getattr(): 1 byref(): 1 name: C range: 1 getattr(): 1 byref(): 1 name: D range: 1 getattr(): 1 byref(): 1 name: E range: 1 getattr(): 1 byref(): 1 name: F range: 1 getattr(): 1 byref(): 1 name: G range: 1 getattr(): 1 byref(): 1 name: H range: 1 getattr(): 1 byref(): 1 name: I range: 1 getattr(): 1 byref(): 1 name: A range: 2 getattr(): 0 byref(): 0 name: B range: 2 getattr(): -2 byref(): -2 name: C range: 2 getattr(): 2 byref(): 2 name: D range: 2 getattr(): 2 byref(): 2 name: E range: 2 getattr(): 2 byref(): 2 name: F range: 2 getattr(): 2 byref(): 2 name: G range: 2 getattr(): 2 byref(): 2 name: H range: 2 getattr(): 2 byref(): 2 name: I range: 2 getattr(): 2 byref(): 2 name: A range: 3 getattr(): -1 byref(): -1 name: B range: 3 getattr(): -1 byref(): -1 name: C range: 3 getattr(): 3 byref(): 3 name: D range: 3 getattr(): 3 byref(): 3 name: E range: 3 getattr(): 3 byref(): 3 name: F range: 3 getattr(): 3 byref(): 3 name: G range: 3 getattr(): 3 byref(): 3 name: H range: 3 getattr(): 3 byref(): 3 name: I range: 3 getattr(): 3 byref(): 3 name: A range: 4 getattr(): 0 byref(): 0 name: B range: 4 getattr(): 0 byref(): 0 name: C range: 4 getattr(): -4 byref(): -4 name: D range: 4 getattr(): 4 byref(): 4 name: E range: 4 getattr(): 4 byref(): 4 name: F range: 4 getattr(): 4 byref(): 4 name: G range: 4 getattr(): 4 byref(): 4 name: H range: 4 getattr(): 4 byref(): 4 name: I range: 4 getattr(): 4 byref(): 4 .name: M range: 0 getattr(): 0 byref(): 0 name: N range: 0 getattr(): 0 byref(): 0 name: O range: 0 getattr(): 0 byref(): 0 name: P range: 0 getattr(): 0 byref(): 0 name: Q range: 0 getattr(): 0 byref(): 0 name: R range: 0 getattr(): 0 byref(): 0 name: S range: 0 getattr(): 0 byref(): 0 name: M range: 1 getattr(): -1 byref(): -1 name: N range: 1 getattr(): 1 byref(): 1 name: O range: 1 getattr(): 1 byref(): 1 name: P range: 1 getattr(): 1 byref(): 1 name: Q range: 1 getattr(): 1 byref(): 1 name: R range: 1 getattr(): 1 byref(): 1 name: S range: 1 getattr(): 1 byref(): 1 name: M range: 2 getattr(): 0 byref(): 0 name: N range: 2 getattr(): -2 byref(): -2 name: O range: 2 getattr(): 2 byref(): 2 name: P range: 2 getattr(): 2 byref(): 2 name: Q range: 2 getattr(): 2 byref(): 2 name: R range: 2 getattr(): 2 byref(): 2 name: S range: 2 getattr(): 2 byref(): 2 name: M range: 3 getattr(): -1 byref(): -1 name: N range: 3 getattr(): -1 byref(): -1 name: O range: 3 getattr(): 3 byref(): 3 name: P range: 3 getattr(): 3 byref(): 3 name: Q range: 3 getattr(): 3 byref(): 3 name: R range: 3 getattr(): 3 byref(): 3 name: S range: 3 getattr(): 3 byref(): 3 name: M range: 4 getattr(): 0 byref(): 0 name: N range: 4 getattr(): 0 byref(): 0 name: O range: 4 getattr(): -4 byref(): -4 name: P range: 4 getattr(): 4 byref(): 4 name: Q range: 4 getattr(): 4 byref(): 4 name: R range: 4 getattr(): 4 byref(): 4 name: S range: 4 getattr(): 4 byref(): 4 . ----------------------------------------------------------------- Ran 19 tests in 0.056s OK Now looking at the results - it seems the byref() function is where the difference lies - as getattr() returns the same value for both x064/xlc and x065/gcc Hope this helps! ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue27643> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com