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