Author: Stefan H. Muller <[email protected]>
Branch: pypy-pyarray
Changeset: r66336:eba88c40cdfa
Date: 2013-07-30 20:24 +0200
http://bitbucket.org/pypy/pypy/changeset/eba88c40cdfa/
Log: - cpyext/number.py, cpyext/test/test_number.py: Implement
PyNumber_CoerceEx() and PyNumber_Coerce().
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
@@ -1,6 +1,6 @@
from pypy.interpreter.error import OperationError
from pypy.module.cpyext.api import cpython_api, CANNOT_FAIL, Py_ssize_t
-from pypy.module.cpyext.pyobject import PyObject
+from pypy.module.cpyext.pyobject import PyObject, PyObjectP, from_ref,
make_ref, Py_DecRef
from rpython.rtyper.lltypesystem import rffi, lltype
from rpython.tool.sourcetools import func_with_new_name
@@ -56,6 +56,38 @@
"""
return space.index(w_obj)
+@cpython_api([PyObjectP, PyObjectP], rffi.INT_real, error=-1)
+def PyNumber_CoerceEx(space, pp1, pp2):
+ """
+ """
+ w_obj1 = from_ref(space, pp1[0])
+ w_obj2 = from_ref(space, pp2[0])
+ w_res = space.try_coerce(w_obj1, w_obj2)
+ if w_res is None:
+ return 1
+ else:
+ Py_DecRef(space, pp1[0])
+ Py_DecRef(space, pp2[0])
+ pp1[0] = make_ref(space, space.getitem(w_res, space.wrap(0)))
+ pp2[0] = make_ref(space, space.getitem(w_res, space.wrap(1)))
+ return 0
+
+@cpython_api([PyObjectP, PyObjectP], rffi.INT_real, error=-1)
+def PyNumber_Coerce(space, pp1, pp2):
+ """
+ """
+ w_obj1 = from_ref(space, pp1[0])
+ w_obj2 = from_ref(space, pp2[0])
+ w_res = space.coerce(w_obj1, w_obj2)
+ if w_res is None:
+ return 1
+ else:
+ Py_DecRef(space, pp1[0])
+ Py_DecRef(space, pp2[0])
+ pp1[0] = make_ref(space, space.getitem(w_res, space.wrap(0)))
+ pp2[0] = make_ref(space, space.getitem(w_res, space.wrap(1)))
+ return 0
+
def func_rename(newname):
return lambda func: func_with_new_name(func, newname)
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
@@ -2,6 +2,7 @@
from pypy.interpreter.error import OperationError
from pypy.module.cpyext.test.test_api import BaseApiTest
from pypy.module.cpyext import sequence
+from pypy.module.cpyext.pyobject import PyObject, PyObjectP, from_ref,
make_ref, Py_DecRef
class TestIterator(BaseApiTest):
def test_check(self, space, api):
@@ -35,6 +36,26 @@
assert w_l is None
api.PyErr_Clear()
+ def test_number_coerce_ex(self, space, api):
+ pl = make_ref(space, space.wrap(123))
+ pf = make_ref(space, space.wrap(42.))
+ ppl = lltype.malloc(PyObjectP.TO, 1, flavor='raw')
+ ppf = lltype.malloc(PyObjectP.TO, 1, flavor='raw')
+ ppl[0] = pl
+ ppf[0] = pf
+
+ ret = api.PyNumber_CoerceEx(ppl, ppf)
+ assert ret == 0
+
+ w_res = from_ref(space, ppl[0])
+
+ assert api.PyFloat_Check(w_res)
+ assert space.unwrap(w_res) == 123.
+ Py_DecRef(space, ppl[0])
+ Py_DecRef(space, ppf[0])
+ lltype.free(ppl, flavor='raw')
+ lltype.free(ppf, flavor='raw')
+
def test_numbermethods(self, space, api):
assert "ab" == space.unwrap(
api.PyNumber_Add(space.wrap("a"), space.wrap("b")))
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit