[pypy-commit] pypy ffi-backend: Fix.

arigo noreply at buildbot.pypy.org
Mon Jun 25 18:19:48 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: ffi-backend
Changeset: r55818:5479367b4f5b
Date: 2012-06-25 17:19 +0200
http://bitbucket.org/pypy/pypy/changeset/5479367b4f5b/

Log:	Fix.

diff --git a/pypy/module/_ffi_backend/ctypeobj.py b/pypy/module/_ffi_backend/ctypeobj.py
--- a/pypy/module/_ffi_backend/ctypeobj.py
+++ b/pypy/module/_ffi_backend/ctypeobj.py
@@ -3,7 +3,7 @@
 from pypy.interpreter.gateway import interp2app, unwrap_spec
 from pypy.interpreter.typedef import TypeDef, interp_attrproperty
 from pypy.rpython.lltypesystem import lltype, llmemory, rffi
-from pypy.rlib.rarithmetic import intmask, ovfcheck
+from pypy.rlib.rarithmetic import intmask, ovfcheck, r_ulonglong
 from pypy.rlib.objectmodel import keepalive_until_here, we_are_translated
 
 from pypy.module._ffi_backend import cdataobj, misc
@@ -355,6 +355,10 @@
     def __init__(self, *args):
         W_CTypePrimitive.__init__(self, *args)
         self.value_fits_long = self.size <= rffi.sizeof(lltype.Signed)
+        if self.size < rffi.sizeof(lltype.SignedLongLong):
+            sh = self.size * 8
+            self.vmin = r_ulonglong(-1) << (sh - 1)
+            self.vrangemax = (r_ulonglong(1) << sh) - 1
 
     def int(self, cdata):
         if self.value_fits_long:
@@ -376,10 +380,8 @@
     def convert_from_object(self, cdata, w_ob):
         value = misc.as_long_long(self.space, w_ob)
         # xxx enums
-        if self.value_fits_long:
-            vmin = (-1) << (self.size * 8 - 1)
-            vmax = ~vmin
-            if not (vmin <= value <= vmax):
+        if self.size < rffi.sizeof(lltype.SignedLongLong):
+            if r_ulonglong(value) + self.vmin > self.vrangemax:
                 self._overflow(w_ob)
         misc.write_raw_integer_data(cdata, value, self.size)
 
@@ -389,14 +391,19 @@
     def __init__(self, *args):
         W_CTypePrimitive.__init__(self, *args)
         self.value_fits_long = self.size < rffi.sizeof(lltype.Signed)
+        if self.size < rffi.sizeof(lltype.SignedLongLong):
+            sh = self.size * 8
+            self.vrangemax = (r_ulonglong(1) << sh) - 1
 
     def int(self, cdata):
         return self.convert_to_object(cdata)
 
     def convert_from_object(self, cdata, w_ob):
         value = misc.as_unsigned_long_long(self.space, w_ob, strict=True)
+        if self.size < rffi.sizeof(lltype.SignedLongLong):
+            if value > self.vrangemax:
+                self._overflow(w_ob)
         misc.write_raw_integer_data(cdata, value, self.size)
-        # xxx overflow
 
     def convert_to_object(self, cdata):
         value = misc.read_raw_unsigned_data(cdata, self.size)


More information about the pypy-commit mailing list