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