Author: Ronan Lamy <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit