Author: Armin Rigo <ar...@tunes.org> Branch: py3.5 Changeset: r95125:3b0f38d2f3e8 Date: 2018-09-15 23:53 +0200 http://bitbucket.org/pypy/pypy/changeset/3b0f38d2f3e8/
Log: hg merge default diff --git a/pypy/module/_cffi_backend/misc.py b/pypy/module/_cffi_backend/misc.py --- a/pypy/module/_cffi_backend/misc.py +++ b/pypy/module/_cffi_backend/misc.py @@ -135,21 +135,14 @@ # This version accepts a Python int too, and does convertions from # other types of objects. It refuses floats. try: - value = space.int_w(w_ob) + return space.int_w(w_ob, allow_conversion=False) except OperationError as e: if not (e.match(space, space.w_OverflowError) or e.match(space, space.w_TypeError)): raise - else: - return value - try: - bigint = space.bigint_w(w_ob, allow_conversion=False) - except OperationError as e: - if not e.match(space, space.w_TypeError): - raise if _is_a_float(space, w_ob): raise - bigint = space.bigint_w(space.int(w_ob), allow_conversion=False) + bigint = space.bigint_w(w_ob, allow_conversion=True) try: return bigint.tolonglong() except OverflowError: @@ -157,20 +150,15 @@ def as_long(space, w_ob): # Same as as_long_long(), but returning an int instead. - if space.isinstance_w(w_ob, space.w_int): # shortcut - return space.int_w(w_ob) try: - bigint = space.bigint_w(w_ob, allow_conversion=False) + return space.int_w(w_ob, allow_conversion=False) except OperationError as e: - if not e.match(space, space.w_TypeError): + if not (e.match(space, space.w_OverflowError) or + e.match(space, space.w_TypeError)): raise if _is_a_float(space, w_ob): raise - bigint = space.bigint_w(space.int(w_ob), allow_conversion=False) - try: - return bigint.toint() - except OverflowError: - raise OperationError(space.w_OverflowError, space.newtext(ovf_msg)) + return space.int_w(w_ob, allow_conversion=True) def as_unsigned_long_long(space, w_ob, strict): # (possibly) convert and cast a Python object to an unsigned long long. @@ -178,23 +166,19 @@ # objects. If 'strict', complains with OverflowError; if 'not strict', # mask the result and round floats. try: - value = space.int_w(w_ob) + value = space.int_w(w_ob, allow_conversion=False) except OperationError as e: if not (e.match(space, space.w_OverflowError) or e.match(space, space.w_TypeError)): raise + if strict and _is_a_float(space, w_ob): + raise else: if strict and value < 0: raise OperationError(space.w_OverflowError, space.newtext(neg_msg)) return r_ulonglong(value) - try: - bigint = space.bigint_w(w_ob, allow_conversion=False) - except OperationError as e: - if not e.match(space, space.w_TypeError): - raise - if strict and _is_a_float(space, w_ob): - raise - bigint = space.bigint_w(space.int(w_ob), allow_conversion=False) + # note that if not 'strict', then space.int() will round down floats + bigint = space.bigint_w(space.int(w_ob), allow_conversion=False) if strict: try: return bigint.toulonglong() @@ -208,13 +192,19 @@ def as_unsigned_long(space, w_ob, strict): # same as as_unsigned_long_long(), but returning just an Unsigned try: - bigint = space.bigint_w(w_ob, allow_conversion=False) + value = space.int_w(w_ob, allow_conversion=False) except OperationError as e: - if not e.match(space, space.w_TypeError): + if not (e.match(space, space.w_OverflowError) or + e.match(space, space.w_TypeError)): raise if strict and _is_a_float(space, w_ob): raise - bigint = space.bigint_w(space.int(w_ob), allow_conversion=False) + else: + if strict and value < 0: + raise OperationError(space.w_OverflowError, space.newtext(neg_msg)) + return r_uint(value) + # note that if not 'strict', then space.int() will round down floats + bigint = space.bigint_w(space.int(w_ob), allow_conversion=False) if strict: try: return bigint.touint() @@ -247,7 +237,12 @@ def _standard_object_as_bool(space, w_ob): if space.isinstance_w(w_ob, space.w_int): - return space.bigint_w(w_ob).tobool() + try: + return space.int_w(w_ob) != 0 + except OperationError as e: + if not e.match(space, space.w_OverflowError): + raise + return space.bigint_w(w_ob).tobool() if space.isinstance_w(w_ob, space.w_float): return space.float_w(w_ob) != 0.0 raise _NotStandardObject diff --git a/pypy/module/_cffi_backend/test/_backend_test_c.py b/pypy/module/_cffi_backend/test/_backend_test_c.py --- a/pypy/module/_cffi_backend/test/_backend_test_c.py +++ b/pypy/module/_cffi_backend/test/_backend_test_c.py @@ -334,8 +334,22 @@ max = (1 << (8*size-1)) - 1 assert newp(pp, min)[0] == min assert newp(pp, max)[0] == max + py.test.raises(OverflowError, newp, pp, min - 2 ** 32) + py.test.raises(OverflowError, newp, pp, min - 2 ** 64) + py.test.raises(OverflowError, newp, pp, max + 2 ** 32) + py.test.raises(OverflowError, newp, pp, max + 2 ** 64) py.test.raises(OverflowError, newp, pp, min - 1) py.test.raises(OverflowError, newp, pp, max + 1) + py.test.raises(OverflowError, newp, pp, min - 1 - 2 ** 32) + py.test.raises(OverflowError, newp, pp, min - 1 - 2 ** 64) + py.test.raises(OverflowError, newp, pp, min - 1 + 2 ** 32) + py.test.raises(OverflowError, newp, pp, min - 1 + 2 ** 64) + py.test.raises(OverflowError, newp, pp, max + 1) + py.test.raises(OverflowError, newp, pp, max + 1 - 2 ** 32) + py.test.raises(OverflowError, newp, pp, max + 1 - 2 ** 64) + py.test.raises(OverflowError, newp, pp, max + 1 + 2 ** 32) + py.test.raises(OverflowError, newp, pp, max + 1 + 2 ** 64) + py.test.raises(TypeError, newp, pp, 1.0) for name in ['char', 'short', 'int', 'long', 'long long']: p = new_primitive_type('unsigned ' + name) pp = new_pointer_type(p) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit