Author: Armin Rigo <[email protected]>
Branch:
Changeset: r85901:76db6bbbc6f6
Date: 2016-07-29 10:29 +0200
http://bitbucket.org/pypy/pypy/changeset/76db6bbbc6f6/
Log: Fix PyNumber_Check() to:
- match the behavior of CPython (it returns true for complex
numbers, for example)
- hopefully fix a numpy bug, which might be caused by
PyNumber_Check() causing unexpectedly more C calls, via
space.float_w()
diff --git a/pypy/module/cpyext/number.py b/pypy/module/cpyext/number.py
--- a/pypy/module/cpyext/number.py
+++ b/pypy/module/cpyext/number.py
@@ -20,16 +20,12 @@
def PyNumber_Check(space, w_obj):
"""Returns 1 if the object o provides numeric protocols, and false
otherwise.
This function always succeeds."""
- try:
- space.float_w(w_obj)
+ # According to CPython, this means: w_obj is not None, and
+ # the type of w_obj has got a method __int__ or __float__.
+ if w_obj is None:
+ return 0
+ if space.lookup(w_obj, '__int__') or space.lookup(w_obj, '__float__'):
return 1
- except OperationError:
- pass
- try:
- space.int_w(w_obj)
- return 1
- except OperationError:
- pass
return 0
@cpython_api([PyObject, PyObject], Py_ssize_t, error=-1)
diff --git a/pypy/module/cpyext/test/test_number.py
b/pypy/module/cpyext/test/test_number.py
--- a/pypy/module/cpyext/test/test_number.py
+++ b/pypy/module/cpyext/test/test_number.py
@@ -15,7 +15,7 @@
assert api.PyNumber_Check(space.wraplong(-12L))
assert api.PyNumber_Check(space.wrap(12.1))
assert not api.PyNumber_Check(space.wrap('12'))
- assert not api.PyNumber_Check(space.wrap(1+3j))
+ assert api.PyNumber_Check(space.wrap(1+3j))
def test_number_long(self, space, api):
w_l = api.PyNumber_Long(space.wrap(123))
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit