[pypy-commit] pypy py3k: clarify UINT handling

pjenvey pypy.commits at gmail.com
Fri Apr 15 17:07:47 EDT 2016


Author: Philip Jenvey <pjenvey at underboss.org>
Branch: py3k
Changeset: r83693:34627b5368d9
Date: 2016-04-15 13:46 -0700
http://bitbucket.org/pypy/pypy/changeset/34627b5368d9/

Log:	clarify UINT handling (grafted from
	2a98879d41935b018e38646f5a2c48f5d4736e77)

diff --git a/pypy/module/array/interp_array.py b/pypy/module/array/interp_array.py
--- a/pypy/module/array/interp_array.py
+++ b/pypy/module/array/interp_array.py
@@ -593,13 +593,6 @@
         self.w_class = None
         self.method = method
 
-        if self.canoverflow:
-            if self.bytes == rffi.sizeof(rffi.ULONG) and not signed and \
-                    self.unwrap == 'int_w':
-                # Treat this type as a ULONG
-                self.unwrap = 'bigint_w'
-                self.canoverflow = False
-
     def _freeze_(self):
         # hint for the annotator: track individual constant instances
         return True
@@ -608,6 +601,14 @@
         return self.unwrap == 'int_w' or self.unwrap == 'bigint_w'
 
 
+if rffi.sizeof(rffi.UINT) == rffi.sizeof(rffi.ULONG):
+    # 32 bits: UINT can't safely overflow into a C long (rpython int)
+    # via int_w, handle it like ULONG below
+    _UINTTypeCode = \
+         TypeCode(rffi.UINT,          'bigint_w')
+else:
+    _UINTTypeCode = \
+         TypeCode(rffi.UINT,          'int_w', True)
 types = {
     'u': TypeCode(lltype.UniChar,     'unicode_w', method=''),
     'b': TypeCode(rffi.SIGNEDCHAR,    'int_w', True, True),
@@ -615,7 +616,7 @@
     'h': TypeCode(rffi.SHORT,         'int_w', True, True),
     'H': TypeCode(rffi.USHORT,        'int_w', True),
     'i': TypeCode(rffi.INT,           'int_w', True, True),
-    'I': TypeCode(rffi.UINT,          'int_w', True),
+    'I': _UINTTypeCode,
     'l': TypeCode(rffi.LONG,          'int_w', True, True),
     'L': TypeCode(rffi.ULONG,         'bigint_w.touint'),
     'q': TypeCode(rffi.LONGLONG,      'bigint_w.tolonglong', True, True),


More information about the pypy-commit mailing list