[pypy-commit] pypy default: Backed out changeset d420391a020a
arigo
pypy.commits at gmail.com
Wed Oct 18 15:05:24 EDT 2017
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r92790:bd1d07287bb4
Date: 2017-10-18 21:04 +0200
http://bitbucket.org/pypy/pypy/changeset/bd1d07287bb4/
Log: Backed out changeset d420391a020a
A few problems: 'b // 0' fails an internal asserts now; and 'n /
int(-n)' gives bogus results if n == sys.maxint+1.
Moreover, it disables the replacement of 'long_num // 2' with a
simple shift, which costs a lot of performance in some cases.
diff --git a/pypy/objspace/std/longobject.py b/pypy/objspace/std/longobject.py
--- a/pypy/objspace/std/longobject.py
+++ b/pypy/objspace/std/longobject.py
@@ -491,18 +491,17 @@
"long division or modulo by zero")
return newlong(space, z)
- def _int_floordiv(self, space, w_other):
+ def _floordiv(self, space, w_other):
try:
- z = self.num.int_floordiv(w_other)
+ z = self.num.floordiv(w_other.asbigint())
except ZeroDivisionError:
raise oefmt(space.w_ZeroDivisionError,
"long division or modulo by zero")
return newlong(space, z)
- descr_floordiv, descr_rfloordiv = _make_descr_binop(_floordiv, _int_floordiv)
+ descr_floordiv, descr_rfloordiv = _make_descr_binop(_floordiv)
_div = func_with_new_name(_floordiv, '_div')
- _int_div = func_with_new_name(_int_floordiv, '_int_div')
- descr_div, descr_rdiv = _make_descr_binop(_div, _int_div)
+ descr_div, descr_rdiv = _make_descr_binop(_div)
def _mod(self, space, w_other):
try:
@@ -528,16 +527,7 @@
raise oefmt(space.w_ZeroDivisionError,
"long division or modulo by zero")
return space.newtuple([newlong(space, div), newlong(space, mod)])
-
- def _int_divmod(self, space, w_other):
- try:
- div, mod = self.num.int_divmod(w_other)
- except ZeroDivisionError:
- raise oefmt(space.w_ZeroDivisionError,
- "long division or modulo by zero")
- return space.newtuple([newlong(space, div), newlong(space, mod)])
-
- descr_divmod, descr_rdivmod = _make_descr_binop(_divmod, _int_divmod)
+ descr_divmod, descr_rdivmod = _make_descr_binop(_divmod)
def newlong(space, bigint):
diff --git a/pypy/objspace/std/test/test_longobject.py b/pypy/objspace/std/test/test_longobject.py
--- a/pypy/objspace/std/test/test_longobject.py
+++ b/pypy/objspace/std/test/test_longobject.py
@@ -70,17 +70,6 @@
a = x // 10000000L
assert a == 3L
- def test_int_floordiv(self):
- x = 3000L
- a = x // 1000
- assert a == 3L
-
- x = 3000L
- a = x // -1000
- assert a == -3L
-
-
-
def test_numerator_denominator(self):
assert (1L).numerator == 1L
assert (1L).denominator == 1L
@@ -219,11 +208,6 @@
check_division(x, y)
raises(ZeroDivisionError, "x // 0L")
- def test_int_divmod(self):
- q, r = divmod(100L, 11)
- assert q == 9L
- assert r == 1L
-
def test_format(self):
assert repr(12345678901234567890) == '12345678901234567890L'
assert str(12345678901234567890) == '12345678901234567890'
@@ -402,4 +386,3 @@
n = "a" * size
expected = (2 << (size * 4)) // 3
assert long(n, 16) == expected
-
diff --git a/rpython/rlib/rbigint.py b/rpython/rlib/rbigint.py
--- a/rpython/rlib/rbigint.py
+++ b/rpython/rlib/rbigint.py
@@ -781,34 +781,7 @@
def div(self, other):
return self.floordiv(other)
-
- @jit.elidable
- def int_floordiv(self, b):
- if not int_in_valid_range(b):
- # Fallback to long.
- return self.mul(rbigint.fromint(b))
-
- digit = abs(b)
- assert digit > 0
-
- if self.sign == 1 and b > 0:
- if digit == 1:
- return self
- """elif digit & (digit - 1) == 0:
- return self.rshift(ptwotable[digit])
- """
- div, mod = _divrem1(self, digit)
-
- if mod != 0 and self.sign * (-1 if b < 0 else 1) == -1:
- if div.sign == 0:
- return ONENEGATIVERBIGINT
- div = div.int_add(1)
- div.sign = self.sign * (-1 if b < 0 else 1)
- return div
-
- def int_div(self, other):
- return self.int_floordiv(other)
-
+
@jit.elidable
def mod(self, other):
if self.sign == 0:
@@ -915,30 +888,6 @@
return div, mod
@jit.elidable
- def int_divmod(v, w):
- """ Divmod with int """
-
- if w == 0:
- raise ZeroDivisionError("long division or modulo by zero")
-
- wsign = (-1 if w < 0 else 1)
- if not int_in_valid_range(w) or v.sign != wsign:
- # Divrem1 doesn't deal with the sign difference. Instead of having yet another copy,
- # Just fallback.
- return v.divmod(rbigint.fromint(w))
-
- digit = abs(w)
- assert digit > 0
-
- div, mod = _divrem1(v, digit)
- mod = rbigint.fromint(mod)
-
- mod.sign = wsign
- div.sign = v.sign * wsign
-
- return div, mod
-
- @jit.elidable
def pow(a, b, c=None):
negativeOutput = False # if x<0 return negative output
More information about the pypy-commit
mailing list