[pypy-commit] pypy faster-rstruct-2: we cannot use the fastpath for '<f' or '>f', because we need to check for overflow in that case. It is fine to use the fastpath for doubles though, because there is no risk of overflow

antocuni pypy.commits at gmail.com
Sun May 14 19:05:07 EDT 2017


Author: Antonio Cuni <anto.cuni at gmail.com>
Branch: faster-rstruct-2
Changeset: r91286:6c228d591ce8
Date: 2017-05-15 00:06 +0200
http://bitbucket.org/pypy/pypy/changeset/6c228d591ce8/

Log:	we cannot use the fastpath for '<f' or '>f', because we need to
	check for overflow in that case. It is fine to use the fastpath for
	doubles though, because there is no risk of overflow

diff --git a/rpython/rlib/rstruct/standardfmttable.py b/rpython/rlib/rstruct/standardfmttable.py
--- a/rpython/rlib/rstruct/standardfmttable.py
+++ b/rpython/rlib/rstruct/standardfmttable.py
@@ -106,7 +106,7 @@
     size = rffi.sizeof(TYPE)
     def packer(fmtiter):
         fl = fmtiter.accept_float_arg()
-        if pack_fastpath(TYPE)(fmtiter, fl):
+        if TYPE is not rffi.FLOAT and pack_fastpath(TYPE)(fmtiter, fl):
             return
         # slow path
         try:
diff --git a/rpython/rlib/rstruct/test/test_pack.py b/rpython/rlib/rstruct/test/test_pack.py
--- a/rpython/rlib/rstruct/test/test_pack.py
+++ b/rpython/rlib/rstruct/test/test_pack.py
@@ -1,6 +1,7 @@
 import pytest
 from rpython.rlib.rarithmetic import r_ulonglong
 from rpython.rlib.rstruct import standardfmttable, nativefmttable
+from rpython.rlib.rstruct.error import StructOverflowError
 from rpython.rlib.mutbuffer import MutableStringBuffer
 import struct
 
@@ -93,6 +94,14 @@
         self.check('f', 123.456)
         self.check('d', 123.456789)
 
+    def test_float_overflow(self):
+        if self.fmt_prefix == '@':
+            # native packing, no overflow
+            self.check('f', 10e100)
+        else:
+            # non-native packing, should raise
+            pytest.raises(StructOverflowError, "self.mypack('f', 10e100)")
+
     def test_pack_char(self):
         self.check('c', 'a')
 


More information about the pypy-commit mailing list