Author: Lars Wassermann <lars.wasserm...@gmail.com>
Branch: 
Changeset: r421:5b8f06f0ec25
Date: 2013-05-29 21:18 +0200
http://bitbucket.org/pypy/lang-smalltalk/changeset/5b8f06f0ec25/

Log:    fixed overlow-error in primitive float_times_two_raised

diff --git a/spyvm/model.py b/spyvm/model.py
--- a/spyvm/model.py
+++ b/spyvm/model.py
@@ -387,6 +387,7 @@
         if n0 == 0:
             return space.wrap_uint(r_uint(intmask(r >> 32)))
         else:
+            # bounds-check for primitive access is done in the primitive
             assert n0 == 1
             return space.wrap_uint(r_uint(intmask(r)))
 
diff --git a/spyvm/primitives.py b/spyvm/primitives.py
--- a/spyvm/primitives.py
+++ b/spyvm/primitives.py
@@ -296,8 +296,14 @@
 
 @expose_primitive(FLOAT_TIMES_TWO_POWER, unwrap_spec=[float, int])
 def func(interp, s_frame, rcvr, arg):
-    w_res = interp.space.wrap_float(math.ldexp(rcvr, arg))
-    return w_res
+    # http://www.python.org/dev/peps/pep-0754/
+    try:
+        return interp.space.wrap_float(math.ldexp(rcvr, arg))
+    except OverflowError:
+        if rcvr >= 0.0:
+            return model.W_Float(float('inf'))
+        else:
+            return model.W_Float(float('-inf'))
 
 @expose_primitive(FLOAT_SQUARE_ROOT, unwrap_spec=[float])
 def func(interp, s_frame, f):
diff --git a/spyvm/test/test_primitives.py b/spyvm/test/test_primitives.py
--- a/spyvm/test/test_primitives.py
+++ b/spyvm/test/test_primitives.py
@@ -206,6 +206,11 @@
     assert prim(primitives.FLOAT_TRUNCATED, [4.5]).value == 4
     assert prim(primitives.FLOAT_TRUNCATED, [4.6]).value == 4
 
+def test_float_times_two_power():
+    assert prim(primitives.FLOAT_TIMES_TWO_POWER, [2.0, 10]).value == 2.0 ** 11
+    assert prim(primitives.FLOAT_TIMES_TWO_POWER, [-213.0, 1020]).value == 
float('-inf')
+    assert prim(primitives.FLOAT_TIMES_TWO_POWER, [213.0, 1020]).value == 
float('inf')
+
 def test_at():
     w_obj = mockclass(space, 0, 
varsized=True).as_class_get_shadow(space).new(1)
     foo = wrap("foo")
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to