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