[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