New submission from Serhiy Storchaka: This issue is taken out of the discussion of issue16277.
PyLong_FromVoidPtr() has special case which maps null pointer to zero integer. On platforms where (uintptr_t)(void *)0 is 0, this code has no effect and is redundant. But on hypothetic platforms where (uintptr_t)(void *)0 is not 0, PyLong_FromVoidPtr() maps NULL to 0 and then PyLong_AsVoidPtr() maps 0 to non-NULL. Also PyLong_FromVoidPtr() is multivalued, it maps to 0 NULL and may be some other pointer. PyLong_FromVoidPtr() in 2.7 has special case only on platform where sizeof(void*) > sizeof(long). It commented as "optimize null pointers". In 3.x branch such optimization non needed because PyLong_FromUnsignedLongLong() already has special case for short integers. The solution of this issue is getting rid of a special case, or adding a special case in PyLong_FromVoidPtr(). It is desirable to make it avoiding multivaluedity. ---------- components: Interpreter Core messages: 173295 nosy: mark.dickinson, serhiy.storchaka priority: normal severity: normal status: open title: Inconsistency with PyLong_FromVoidPtr() and PyLong_AsVoidPtr() type: resource usage versions: Python 2.7, Python 3.2, Python 3.3, Python 3.4 _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue16280> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com