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