Author: Armin Rigo <[email protected]>
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
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit