[New-bugs-announce] [issue34569] test__xxsubinterpreters.ShareableTypeTests._assert_values fails on AIX - 32-bit mode
Michael Felt
report at bugs.python.org
Mon Sep 3 09:47:59 EDT 2018
New submission from Michael Felt <aixtools at felt.demon.nl>:
+364 def _assert_values(self, values):
+365 for obj in values:
+366 with self.subTest(obj):
+367 interpreters.channel_send(self.cid, obj)
+368 got = interpreters.channel_recv(self.cid)
+369
+370 self.assertEqual(got, obj)
+371 self.assertIs(type(got), type(obj))
+372 # XXX Check the following in the channel tests?
+373 #self.assertIsNot(got, obj)
+374
+395 def test_int(self):
+396 self._assert_values(range(-1, 258))
+397
The assert fails on -1 with:
======================================================================
FAIL: test_int (test.test__xxsubinterpreters.ShareableTypeTests) [-1]
----------------------------------------------------------------------
Traceback (most recent call last):
File "/data/prj/python/python3-3.8.0/Lib/test/test__xxsubinterpreters.py", line 371, in _assert_values
self.assertEqual(got, obj)
AssertionError: 4294967295 != -1
Note that this value is the unsigned value for 32-bit int as -1
root at x066:[/data/prj/python/python3-3.8.0]grep 4294967295 /usr/include/sys/*.h
/usr/include/sys/limits.h:#define ULONG_MAX (4294967295UL)
/usr/include/sys/limits.h:#define UINT_MAX (4294967295U)
/usr/include/sys/stdint.h:#define UINT32_MAX (4294967295U)
After quite a lot of "learning", I narrow the issue to:
+1432 static int
+1433 _long_shared(PyObject *obj, _PyCrossInterpreterData *data)
+1434 {
+1435 int64_t value = PyLong_AsLongLong(obj);
+1436 if (value == -1 && PyErr_Occurred()) {
+1437 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
+1438 PyErr_SetString(PyExc_OverflowError, "try sending as bytes");
+1439 }
+1440 return -1;
+1441 }
+1442 data->data = (void *)value;
+1443 data->obj = NULL;
+1444 data->new_object = _new_long_object;
+1445 data->free = NULL;
+1446 return 0;
+1447 }
+1448
+1426 static PyObject *
+1427 _new_long_object(_PyCrossInterpreterData *data)
+1428 {
+1429 return PyLong_FromLongLong((int64_t)(data->data));
+1430 }
The "value" is stored as a void data type, and the high-order 64-bits are zero. When it gets returned as a PyLong... it goes positive.
I do not dare touch anything here without some "mentoring".
Or, we change the test so that it knows it is in 32-bit mode, and compares with something else.
In short, "mentoring" requested.
p.s. not had time to test in 64-bit mode. Will post on that later.
----------
messages: 324519
nosy: Michael.Felt
priority: normal
severity: normal
status: open
title: test__xxsubinterpreters.ShareableTypeTests._assert_values fails on AIX - 32-bit mode
_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue34569>
_______________________________________
More information about the New-bugs-announce
mailing list