Author: Ronan Lamy <ronan.l...@gmail.com>
Branch: 
Changeset: r91661:36eb150b3c67
Date: 2017-06-30 22:03 +0100
http://bitbucket.org/pypy/pypy/changeset/36eb150b3c67/

Log:    Change signature of PyXXX_Check pseudo-macros from int(PyObject*) to
        int(void*) (fixes #2596)

diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py
--- a/pypy/module/cpyext/api.py
+++ b/pypy/module/cpyext/api.py
@@ -727,22 +727,21 @@
             return space.gettypeobject(cls.typedef)
     check_name = "Py" + type_name + "_Check"
 
+    @cts.decl("int %s(void * obj)" % check_name, error=CANNOT_FAIL)
     def check(space, w_obj):
         "Implements the Py_Xxx_Check function"
         w_obj_type = space.type(w_obj)
         w_type = get_w_type(space)
         return (space.is_w(w_obj_type, w_type) or
                 space.issubtype_w(w_obj_type, w_type))
+
+    @cts.decl("int %sExact(void * obj)" % check_name, error=CANNOT_FAIL)
     def check_exact(space, w_obj):
         "Implements the Py_Xxx_CheckExact function"
         w_obj_type = space.type(w_obj)
         w_type = get_w_type(space)
         return space.is_w(w_obj_type, w_type)
 
-    check = cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)(
-        func_with_new_name(check, check_name))
-    check_exact = cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)(
-        func_with_new_name(check_exact, check_name + "Exact"))
     return check, check_exact
 
 pypy_debug_catch_fatal_exception = 
rffi.llexternal('pypy_debug_catch_fatal_exception', [], lltype.Void)
diff --git a/pypy/module/cpyext/test/test_floatobject.py 
b/pypy/module/cpyext/test/test_floatobject.py
--- a/pypy/module/cpyext/test/test_floatobject.py
+++ b/pypy/module/cpyext/test/test_floatobject.py
@@ -95,3 +95,15 @@
 
              Py_RETURN_NONE;"""),
             ])
+
+    def test_PyFloat_Check(self):
+        module = self.import_extension('foo', [
+            ("test", "METH_NOARGS",
+             """
+             PyObject* pyobj = PyFloat_FromDouble(1.0);
+             PyFloatObject* pfo = (PyFloatObject*)pyobj;
+             int res = PyFloat_Check(pyobj) && PyFloat_CheckExact(pyobj) &&
+                PyFloat_Check(pfo) && PyFloat_CheckExact(pfo);
+             return PyLong_FromLong(res);"""),
+            ])
+        assert module.test() == 1
diff --git a/pypy/module/cpyext/test/test_listobject.py 
b/pypy/module/cpyext/test/test_listobject.py
--- a/pypy/module/cpyext/test/test_listobject.py
+++ b/pypy/module/cpyext/test/test_listobject.py
@@ -1,8 +1,7 @@
-import pytest
-from pypy.interpreter.error import OperationError
-from pypy.module.cpyext.test.test_api import BaseApiTest
+from pypy.module.cpyext.test.test_api import BaseApiTest, raises_w
 from pypy.module.cpyext.test.test_cpyext import AppTestCpythonExtensionBase
-from pypy.module.cpyext.listobject import PyList_Size
+from pypy.module.cpyext.listobject import (
+    PyList_Check, PyList_CheckExact, PyList_Size)
 
 class TestListObject(BaseApiTest):
     def test_list(self, space, api):
@@ -13,15 +12,15 @@
         """)
 
         l = api.PyList_New(0)
-        assert api.PyList_Check(l)
-        assert api.PyList_CheckExact(l)
+        assert PyList_Check(space, l)
+        assert PyList_CheckExact(space, l)
 
         l = space.call_function(L)
-        assert api.PyList_Check(l)
-        assert not api.PyList_CheckExact(l)
+        assert PyList_Check(space, l)
+        assert not PyList_CheckExact(space, l)
 
-        assert not api.PyList_Check(space.newtuple([]))
-        assert not api.PyList_CheckExact(space.newtuple([]))
+        assert not PyList_Check(space, space.newtuple([]))
+        assert not PyList_CheckExact(space, space.newtuple([]))
 
     def test_get_size(self, space, api):
         l = api.PyList_New(0)
@@ -32,9 +31,8 @@
     def test_size(self, space):
         l = space.newlist([space.w_None, space.w_None])
         assert PyList_Size(space, l) == 2
-        with pytest.raises(OperationError) as excinfo:
+        with raises_w(space, TypeError):
             PyList_Size(space, space.w_None)
-        assert excinfo.value.w_type is space.w_TypeError
 
     def test_insert(self, space, api):
         w_l = space.newlist([space.w_None, space.w_None])
diff --git a/pypy/module/cpyext/test/test_longobject.py 
b/pypy/module/cpyext/test/test_longobject.py
--- a/pypy/module/cpyext/test/test_longobject.py
+++ b/pypy/module/cpyext/test/test_longobject.py
@@ -6,7 +6,7 @@
 from pypy.objspace.std.longobject import W_LongObject
 from pypy.module.cpyext.test.test_api import BaseApiTest
 from pypy.module.cpyext.test.test_cpyext import AppTestCpythonExtensionBase
-from pypy.module.cpyext.longobject import (
+from pypy.module.cpyext.longobject import (PyLong_Check, PyLong_CheckExact,
     PyLong_FromLong, PyLong_AsLong, PyLong_AsUnsignedLong, PyLong_AsLongLong,
     PyLong_AsUnsignedLongLong, PyLong_AsUnsignedLongLongMask)
 
@@ -57,12 +57,12 @@
 
     def test_type_check(self, space, api):
         w_l = space.wrap(sys.maxint + 1)
-        assert api.PyLong_Check(w_l)
-        assert api.PyLong_CheckExact(w_l)
+        assert PyLong_Check(space, w_l)
+        assert PyLong_CheckExact(space, w_l)
 
         w_i = space.wrap(sys.maxint)
-        assert not api.PyLong_Check(w_i)
-        assert not api.PyLong_CheckExact(w_i)
+        assert not PyLong_Check(space, w_i)
+        assert not PyLong_CheckExact(space, w_i)
 
         L = space.appexec([], """():
             class L(long):
@@ -70,8 +70,8 @@
             return L
         """)
         l = space.call_function(L)
-        assert api.PyLong_Check(l)
-        assert not api.PyLong_CheckExact(l)
+        assert PyLong_Check(space, l)
+        assert not PyLong_CheckExact(space, l)
 
     def test_as_longlong(self, space):
         assert PyLong_AsLongLong(space, space.wrap(1 << 62)) == 1 << 62
diff --git a/pypy/module/cpyext/test/test_pyfile.py 
b/pypy/module/cpyext/test/test_pyfile.py
--- a/pypy/module/cpyext/test/test_pyfile.py
+++ b/pypy/module/cpyext/test/test_pyfile.py
@@ -1,10 +1,11 @@
+import pytest
 from pypy.conftest import option
 from pypy.module.cpyext.test.test_api import BaseApiTest
 from pypy.module.cpyext.test.test_cpyext import AppTestCpythonExtensionBase
 from pypy.module.cpyext.object import Py_PRINT_RAW
 from rpython.rtyper.lltypesystem import rffi, lltype
 from rpython.tool.udir import udir
-import pytest
+from pypy.module.cpyext.pyfile import PyFile_Check, PyFile_CheckExact
 
 class TestFile(BaseApiTest):
 
@@ -15,9 +16,9 @@
         rffi.free_charp(filename)
         rffi.free_charp(mode)
 
-        assert api.PyFile_Check(w_file)
-        assert api.PyFile_CheckExact(w_file)
-        assert not api.PyFile_Check(space.wrap("text"))
+        assert PyFile_Check(space, w_file)
+        assert PyFile_CheckExact(space, w_file)
+        assert not PyFile_Check(space, space.wrap("text"))
 
         space.call_method(w_file, "write", space.newbytes("text"))
         space.call_method(w_file, "close")
@@ -70,7 +71,7 @@
                 assert fp is not None
                 w_file2 = api.PyFile_FromFile(fp, filename, mode, None)
         assert w_file2 is not None
-        assert api.PyFile_Check(w_file2)
+        assert PyFile_Check(space, w_file2)
         assert space.str_w(api.PyFile_Name(w_file2)) == name
 
     @pytest.mark.xfail
diff --git a/pypy/module/cpyext/test/test_setobject.py 
b/pypy/module/cpyext/test/test_setobject.py
--- a/pypy/module/cpyext/test/test_setobject.py
+++ b/pypy/module/cpyext/test/test_setobject.py
@@ -1,19 +1,21 @@
 from pypy.module.cpyext.test.test_api import BaseApiTest, raises_w
 from pypy.module.cpyext.test.test_cpyext import AppTestCpythonExtensionBase
-from pypy.module.cpyext.setobject import PySet_Add, PySet_Size
+from pypy.module.cpyext.setobject import (
+    PySet_Check, PyFrozenSet_Check, PyFrozenSet_CheckExact,
+    PySet_Add, PySet_Size, PySet_GET_SIZE)
 
 
 class TestTupleObject(BaseApiTest):
-    def test_setobj(self, space, api):
-        assert not api.PySet_Check(space.w_None)
-        assert not api.PyFrozenSet_Check(space.w_None)
+    def test_setobj(self, space):
+        assert not PySet_Check(space, space.w_None)
+        assert not PyFrozenSet_Check(space, space.w_None)
         with raises_w(space, SystemError):
             PySet_Add(space, space.w_None, space.w_None)
         w_set = space.call_function(space.w_set)
-        assert not api.PyFrozenSet_CheckExact(w_set)
+        assert not PyFrozenSet_CheckExact(space, w_set)
         space.call_method(w_set, 'update', space.wrap([1, 2, 3, 4]))
-        assert api.PySet_Size(w_set) == 4
-        assert api.PySet_GET_SIZE(w_set) == 4
+        assert PySet_Size(space, w_set) == 4
+        assert PySet_GET_SIZE(space, w_set) == 4
         with raises_w(space, TypeError):
             PySet_Size(space, space.newlist([]))
 
diff --git a/pypy/module/cpyext/test/test_sliceobject.py 
b/pypy/module/cpyext/test/test_sliceobject.py
--- a/pypy/module/cpyext/test/test_sliceobject.py
+++ b/pypy/module/cpyext/test/test_sliceobject.py
@@ -2,13 +2,14 @@
 from pypy.module.cpyext.test.test_api import BaseApiTest
 from pypy.module.cpyext.test.test_cpyext import AppTestCpythonExtensionBase
 from pypy.module.cpyext.api import Py_ssize_t, Py_ssize_tP
+from pypy.module.cpyext.sliceobject import PySlice_Check
 
 class TestSliceObject(BaseApiTest):
-    def test_slice(self, space, api):
+    def test_slice(self, space):
         w_i = space.wrap(10)
         w_slice = space.newslice(w_i, w_i, w_i)
-        assert api.PySlice_Check(w_slice)
-        assert not api.PySlice_Check(w_i)
+        assert PySlice_Check(space, w_slice)
+        assert not PySlice_Check(space, w_i)
 
     def test_GetIndicesEx(self, space, api):
         w = space.wrap
diff --git a/pypy/module/cpyext/test/test_tupleobject.py 
b/pypy/module/cpyext/test/test_tupleobject.py
--- a/pypy/module/cpyext/test/test_tupleobject.py
+++ b/pypy/module/cpyext/test/test_tupleobject.py
@@ -6,19 +6,18 @@
 from rpython.rtyper.lltypesystem import rffi, lltype
 from rpython.rlib.debug import FatalError
 from pypy.module.cpyext.tupleobject import (
-    PyTupleObject, PyTuple_SetItem, PyTuple_Size)
+    PyTupleObject, PyTuple_Check, PyTuple_SetItem, PyTuple_Size)
 
 
 class TestTupleObject(BaseApiTest):
 
-    def test_tupleobject(self, space, api):
-        assert not api.PyTuple_Check(space.w_None)
+    def test_tupleobject(self, space):
+        assert not PyTuple_Check(space, space.w_None)
         with raises_w(space, SystemError):
             PyTuple_SetItem(space, space.w_None, 0, space.w_None)
         atuple = space.newtuple([space.wrap(0), space.wrap(1),
                                  space.wrap('yay')])
-        assert api.PyTuple_Size(atuple) == 3
-        #assert api.PyTuple_GET_SIZE(atuple) == 3  --- now a C macro
+        assert PyTuple_Size(space, atuple) == 3
         with raises_w(space, SystemError):
             PyTuple_Size(space, space.newlist([]))
 
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to