[pypy-commit] pypy default: test, fix for PyCFunction_Check and builtins (there is no PyCFunction_CheckExact)

mattip pypy.commits at gmail.com
Mon Jul 10 15:58:20 EDT 2017


Author: Matti Picus <matti.picus at gmail.com>
Branch: 
Changeset: r91850:ac54af67d3c2
Date: 2017-07-10 22:56 +0300
http://bitbucket.org/pypy/pypy/changeset/ac54af67d3c2/

Log:	test, fix for PyCFunction_Check and builtins (there is no
	PyCFunction_CheckExact)

diff --git a/pypy/module/cpyext/methodobject.py b/pypy/module/cpyext/methodobject.py
--- a/pypy/module/cpyext/methodobject.py
+++ b/pypy/module/cpyext/methodobject.py
@@ -10,7 +10,7 @@
 from pypy.module.cpyext.api import (
     CONST_STRING, METH_CLASS, METH_COEXIST, METH_KEYWORDS, METH_NOARGS, METH_O,
     METH_STATIC, METH_VARARGS, PyObject, bootstrap_function,
-    build_type_checkers, cpython_api, generic_cpy_call,
+    build_type_checkers, cpython_api, generic_cpy_call, CANNOT_FAIL,
     PyTypeObjectPtr, slot_function, cts)
 from pypy.module.cpyext.pyobject import (
     Py_DecRef, from_ref, make_ref, as_pyobj, make_typedescr)
@@ -113,8 +113,14 @@
                             "built-in method '%s' of '%s' object" %
                             (self.name, self.w_objclass.getname(self.space)))
 
-PyCFunction_Check, PyCFunction_CheckExact = build_type_checkers(
-    "CFunction", W_PyCFunctionObject)
+ at cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)
+def PyCFunction_Check(space, w_obj):
+    from pypy.interpreter.function import BuiltinFunction
+    if w_obj is None:
+        return False
+    if isinstance(w_obj, W_PyCFunctionObject):
+        return True
+    return isinstance(w_obj, BuiltinFunction)
 
 class W_PyCClassMethodObject(W_PyCFunctionObject):
     w_self = None
diff --git a/pypy/module/cpyext/test/test_methodobject.py b/pypy/module/cpyext/test/test_methodobject.py
--- a/pypy/module/cpyext/test/test_methodobject.py
+++ b/pypy/module/cpyext/test/test_methodobject.py
@@ -93,6 +93,31 @@
             assert mod.isSameFunction(mod.getarg_O)
         raises(SystemError, mod.isSameFunction, 1)
 
+    def test_check(self):
+        mod = self.import_extension('foo', [
+            ('check', 'METH_O',
+            '''
+                return PyLong_FromLong(PyCFunction_Check(args));
+            '''),
+            ])
+        from math import degrees
+        assert mod.check(degrees) == 1
+        assert mod.check(list) == 0
+        assert mod.check(sorted) == 1
+        def func():
+            pass
+        class A(object):
+            def meth(self):
+                pass
+            @staticmethod
+            def stat():
+                pass
+        assert mod.check(func) == 0
+        assert mod.check(A) == 0
+        assert mod.check(A.meth) == 0
+        assert mod.check(A.stat) == 0
+ 
+
 class TestPyCMethodObject(BaseApiTest):
     def test_repr(self, space, api):
         """


More information about the pypy-commit mailing list