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

Reply via email to