Author: Armin Rigo <ar...@tunes.org>
Branch: ffi-backend
Changeset: r56524:3c7dcb2bfa73
Date: 2012-08-01 17:12 +0200
http://bitbucket.org/pypy/pypy/changeset/3c7dcb2bfa73/

Log:    Avoid passing via longlong to read a small-enough integer.

diff --git a/pypy/module/_cffi_backend/ctypeprim.py 
b/pypy/module/_cffi_backend/ctypeprim.py
--- a/pypy/module/_cffi_backend/ctypeprim.py
+++ b/pypy/module/_cffi_backend/ctypeprim.py
@@ -4,7 +4,7 @@
 
 from pypy.interpreter.error import operationerrfmt
 from pypy.rpython.lltypesystem import lltype, rffi
-from pypy.rlib.rarithmetic import intmask, r_ulonglong
+from pypy.rlib.rarithmetic import r_ulonglong
 from pypy.rlib.objectmodel import keepalive_until_here
 from pypy.rlib import jit
 
@@ -164,16 +164,17 @@
         if self.value_fits_long:
             # this case is to handle enums, but also serves as a slight
             # performance improvement for some other primitive types
-            value = intmask(misc.read_raw_signed_data(cdata, self.size))
+            value = misc.read_raw_long_data(cdata, self.size)
             return self.space.wrap(value)
         else:
             return self.convert_to_object(cdata)
 
     def convert_to_object(self, cdata):
-        value = misc.read_raw_signed_data(cdata, self.size)
         if self.value_fits_long:
-            return self.space.wrap(intmask(value))
+            value = misc.read_raw_long_data(cdata, self.size)
+            return self.space.wrap(value)
         else:
+            value = misc.read_raw_signed_data(cdata, self.size)
             return self.space.wrap(value)    # r_longlong => on 32-bit, 'long'
 
     def convert_from_object(self, cdata, w_ob):
@@ -214,10 +215,11 @@
         misc.write_raw_integer_data(cdata, value, self.size)
 
     def convert_to_object(self, cdata):
-        value = misc.read_raw_unsigned_data(cdata, self.size)
         if self.value_fits_long:
-            return self.space.wrap(intmask(value))
+            value = misc.read_raw_ulong_data(cdata, self.size)
+            return self.space.wrap(value)
         else:
+            value = misc.read_raw_unsigned_data(cdata, self.size)
             return self.space.wrap(value)    # r_ulonglong => 'long' object
 
     def get_vararg_type(self):
diff --git a/pypy/module/_cffi_backend/misc.py 
b/pypy/module/_cffi_backend/misc.py
--- a/pypy/module/_cffi_backend/misc.py
+++ b/pypy/module/_cffi_backend/misc.py
@@ -31,12 +31,26 @@
             return rffi.cast(lltype.SignedLongLong, rffi.cast(TPP, target)[0])
     raise NotImplementedError("bad integer size")
 
+def read_raw_long_data(target, size):
+    for TP, TPP in _prim_signed_types:
+        if size == rffi.sizeof(TP):
+            assert rffi.sizeof(TP) <= rffi.sizeof(lltype.Signed)
+            return rffi.cast(lltype.Signed, rffi.cast(TPP, target)[0])
+    raise NotImplementedError("bad integer size")
+
 def read_raw_unsigned_data(target, size):
     for TP, TPP in _prim_unsigned_types:
         if size == rffi.sizeof(TP):
             return rffi.cast(lltype.UnsignedLongLong, rffi.cast(TPP,target)[0])
     raise NotImplementedError("bad integer size")
 
+def read_raw_ulong_data(target, size):
+    for TP, TPP in _prim_unsigned_types:
+        if size == rffi.sizeof(TP):
+            assert rffi.sizeof(TP) < rffi.sizeof(lltype.Signed)
+            return rffi.cast(lltype.Signed, rffi.cast(TPP,target)[0])
+    raise NotImplementedError("bad integer size")
+
 def read_raw_float_data(target, size):
     for TP, TPP in _prim_float_types:
         if size == rffi.sizeof(TP):
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to