This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author aixtools@gmail.com
Recipients Michael.Felt, aixtools@gmail.com, martin.panter
Date 2016-08-16.10:57:29
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <b4352451-59fb-6e26-4c38-d648cfbf83e2@gmail.com>
In-reply-to <1470301084.91.0.959214688936.issue27643@psf.upfronthosting.co.za>
Content
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!
History
Date User Action Args
2016-08-16 10:57:30aixtools@gmail.comsetrecipients: + aixtools@gmail.com, martin.panter, Michael.Felt
2016-08-16 10:57:30aixtools@gmail.comlinkissue27643 messages
2016-08-16 10:57:29aixtools@gmail.comcreate