[pypy-commit] pypy default: refactor PyType_Ready into more_init for py3.5 compatibiility
mattip
pypy.commits at gmail.com
Fri Nov 18 08:25:49 EST 2016
Author: Matti Picus <matti.picus at gmail.com>
Branch:
Changeset: r88462:9a8f9cff8c5d
Date: 2016-11-18 14:11 +0200
http://bitbucket.org/pypy/pypy/changeset/9a8f9cff8c5d/
Log: refactor PyType_Ready into more_init for py3.5 compatibiility
diff --git a/pypy/module/cpyext/test/test_bytesobject.py b/pypy/module/cpyext/test/test_bytesobject.py
--- a/pypy/module/cpyext/test/test_bytesobject.py
+++ b/pypy/module/cpyext/test/test_bytesobject.py
@@ -350,7 +350,6 @@
PyObject * obj;
char * data;
int len;
- PyType_Ready(&PyStringArrType_Type);
data = PyString_AS_STRING(args);
len = PyString_GET_SIZE(args);
@@ -434,6 +433,7 @@
PyStringArrType_Type.tp_flags = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE;
PyStringArrType_Type.tp_itemsize = sizeof(char);
PyStringArrType_Type.tp_base = &PyString_Type;
+ if (PyType_Ready(&PyStringArrType_Type) < 0) INITERROR;
''')
a = module.newsubstr('abc')
diff --git a/pypy/module/cpyext/test/test_intobject.py b/pypy/module/cpyext/test/test_intobject.py
--- a/pypy/module/cpyext/test/test_intobject.py
+++ b/pypy/module/cpyext/test/test_intobject.py
@@ -85,7 +85,6 @@
if (!PyArg_ParseTuple(args, "Oi", &name, &intval))
return NULL;
- PyType_Ready(&Enum_Type);
enumObj = PyObject_New(EnumObject, &Enum_Type);
if (!enumObj) {
return NULL;
@@ -160,7 +159,8 @@
/*tp_new*/ 0
};
""", more_init = '''
- Enum_Type.tp_base = &PyInt_Type;
+ Enum_Type.tp_base = &PyInt_Type;
+ if (PyType_Ready(&Enum_Type) < 0) INITERROR;
''')
a = module.newEnum("ULTIMATE_ANSWER", 42)
diff --git a/pypy/module/cpyext/test/test_iterator.py b/pypy/module/cpyext/test/test_iterator.py
--- a/pypy/module/cpyext/test/test_iterator.py
+++ b/pypy/module/cpyext/test/test_iterator.py
@@ -29,11 +29,6 @@
("test", "METH_NOARGS",
'''
PyObject *obj;
- Foo_Type.tp_flags = Py_TPFLAGS_DEFAULT;
- Foo_Type.tp_as_mapping = &tp_as_mapping;
- tp_as_mapping.mp_length = mp_length;
- tp_as_mapping.mp_subscript = mp_subscript;
- if (PyType_Ready(&Foo_Type) < 0) return NULL;
obj = PyObject_New(PyObject, &Foo_Type);
return obj;
'''
@@ -44,8 +39,7 @@
PySequence_Check(args) +
PyMapping_Check(args) * 2);
''')
- ],
- '''
+ ], prologue = '''
static PyObject *
mp_subscript(PyObject *self, PyObject *key)
{
@@ -61,6 +55,12 @@
PyVarObject_HEAD_INIT(NULL, 0)
"foo.foo",
};
+ ''', more_init = '''
+ Foo_Type.tp_flags = Py_TPFLAGS_DEFAULT;
+ Foo_Type.tp_as_mapping = &tp_as_mapping;
+ tp_as_mapping.mp_length = mp_length;
+ tp_as_mapping.mp_subscript = mp_subscript;
+ if (PyType_Ready(&Foo_Type) < 0) INITERROR;
''')
obj = module.test()
assert obj["hi there"] == 42
@@ -80,11 +80,6 @@
("test", "METH_NOARGS",
'''
PyObject *obj;
- Foo_Type.tp_flags = Py_TPFLAGS_DEFAULT;
- Foo_Type.tp_as_sequence = &tp_as_sequence;
- tp_as_sequence.sq_length = sq_length;
- tp_as_sequence.sq_item = sq_item;
- if (PyType_Ready(&Foo_Type) < 0) return NULL;
obj = PyObject_New(PyObject, &Foo_Type);
return obj;
'''),
@@ -94,8 +89,7 @@
PySequence_Check(args) +
PyMapping_Check(args) * 2);
''')
- ],
- '''
+ ], prologue='''
static PyObject *
sq_item(PyObject *self, Py_ssize_t size)
{
@@ -111,6 +105,12 @@
PyVarObject_HEAD_INIT(NULL, 0)
"foo.foo",
};
+ ''', more_init='''
+ Foo_Type.tp_flags = Py_TPFLAGS_DEFAULT;
+ Foo_Type.tp_as_sequence = &tp_as_sequence;
+ tp_as_sequence.sq_length = sq_length;
+ tp_as_sequence.sq_item = sq_item;
+ if (PyType_Ready(&Foo_Type) < 0) INITERROR;
''')
obj = module.test()
assert obj[1] == 42
diff --git a/pypy/module/cpyext/test/test_ndarrayobject.py b/pypy/module/cpyext/test/test_ndarrayobject.py
--- a/pypy/module/cpyext/test/test_ndarrayobject.py
+++ b/pypy/module/cpyext/test/test_ndarrayobject.py
@@ -233,9 +233,9 @@
if cls.runappdirect:
try:
import numpy
- cls.w_numpy_include = [numpy.get_include()]
- except:
+ except ImportError:
skip('numpy not importable')
+ cls.w_numpy_include = [numpy.get_include()]
else:
numpy_incl = os.path.abspath(os.path.dirname(__file__) +
'/../include/_numpypy')
@@ -306,9 +306,6 @@
),
], include_dirs=self.numpy_include,
prologue='''
- #ifdef PYPY_VERSION
- #include <pypy_numpy.h>
- #endif
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include <numpy/arrayobject.h>
#ifdef PYPY_VERSION
@@ -351,9 +348,6 @@
'''),
], include_dirs=self.numpy_include,
prologue='''
- #ifdef PYPY_VERSION
- #include <pypy_numpy.h>
- #endif
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include <numpy/arrayobject.h>
''',
@@ -409,9 +403,6 @@
"""),
], include_dirs=self.numpy_include,
prologue='''
- #ifdef PYPY_VERSION
- #include <pypy_numpy.h>
- #endif
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include <numpy/arrayobject.h>
#ifndef PYPY_VERSION
diff --git a/pypy/module/cpyext/test/test_typeobject.py b/pypy/module/cpyext/test/test_typeobject.py
--- a/pypy/module/cpyext/test/test_typeobject.py
+++ b/pypy/module/cpyext/test/test_typeobject.py
@@ -670,15 +670,10 @@
("new_obj", "METH_NOARGS",
'''
PyObject *obj;
- Foo_Type.tp_flags = Py_TPFLAGS_DEFAULT;
- Foo_Type.tp_as_mapping = &tp_as_mapping;
- tp_as_mapping.mp_ass_subscript = mp_ass_subscript;
- if (PyType_Ready(&Foo_Type) < 0) return NULL;
obj = PyObject_New(PyObject, &Foo_Type);
return obj;
'''
- )],
- '''
+ )], prologue='''
static int
mp_ass_subscript(PyObject *self, PyObject *key, PyObject *value)
{
@@ -693,6 +688,11 @@
PyVarObject_HEAD_INIT(NULL, 0)
"foo.foo",
};
+ ''', more_init = '''
+ Foo_Type.tp_flags = Py_TPFLAGS_DEFAULT;
+ Foo_Type.tp_as_mapping = &tp_as_mapping;
+ tp_as_mapping.mp_ass_subscript = mp_ass_subscript;
+ if (PyType_Ready(&Foo_Type) < 0) INITERROR;
''')
obj = module.new_obj()
raises(ZeroDivisionError, obj.__setitem__, 5, None)
@@ -704,15 +704,10 @@
("new_obj", "METH_NOARGS",
'''
PyObject *obj;
- Foo_Type.tp_flags = Py_TPFLAGS_DEFAULT;
- Foo_Type.tp_as_sequence = &tp_as_sequence;
- tp_as_sequence.sq_contains = sq_contains;
- if (PyType_Ready(&Foo_Type) < 0) return NULL;
obj = PyObject_New(PyObject, &Foo_Type);
return obj;
'''
- )],
- '''
+ )], prologue='''
static int
sq_contains(PyObject *self, PyObject *value)
{
@@ -723,6 +718,11 @@
PyVarObject_HEAD_INIT(NULL, 0)
"foo.foo",
};
+ ''', more_init='''
+ Foo_Type.tp_flags = Py_TPFLAGS_DEFAULT;
+ Foo_Type.tp_as_sequence = &tp_as_sequence;
+ tp_as_sequence.sq_contains = sq_contains;
+ if (PyType_Ready(&Foo_Type) < 0) INITERROR;
''')
obj = module.new_obj()
res = "foo" in obj
@@ -863,11 +863,6 @@
if (!PyArg_ParseTuple(args, "l", &intval))
return NULL;
- IntLike_Type.tp_as_number = &intlike_as_number;
- IntLike_Type.tp_flags |= Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES;
- intlike_as_number.nb_add = intlike_nb_add;
- intlike_as_number.nb_power = intlike_nb_pow;
- if (PyType_Ready(&IntLike_Type) < 0) return NULL;
intObj = PyObject_New(IntLikeObject, &IntLike_Type);
if (!intObj) {
return NULL;
@@ -884,8 +879,6 @@
if (!PyArg_ParseTuple(args, "l", &intval))
return NULL;
- IntLike_Type_NoOp.tp_flags |= Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES;
- if (PyType_Ready(&IntLike_Type_NoOp) < 0) return NULL;
intObjNoOp = PyObject_New(IntLikeObjectNoOp, &IntLike_Type_NoOp);
if (!intObjNoOp) {
return NULL;
@@ -893,8 +886,7 @@
intObjNoOp->ival = intval;
return (PyObject *)intObjNoOp;
- """)], prologue=
- """
+ """)], prologue="""
#include <math.h>
typedef struct
{
@@ -946,6 +938,14 @@
/*tp_name*/ "IntLikeNoOp",
/*tp_basicsize*/ sizeof(IntLikeObjectNoOp),
};
+ """, more_init="""
+ IntLike_Type.tp_as_number = &intlike_as_number;
+ IntLike_Type.tp_flags |= Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES;
+ intlike_as_number.nb_add = intlike_nb_add;
+ intlike_as_number.nb_power = intlike_nb_pow;
+ if (PyType_Ready(&IntLike_Type) < 0) INITERROR;
+ IntLike_Type_NoOp.tp_flags |= Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES;
+ if (PyType_Ready(&IntLike_Type_NoOp) < 0) INITERROR;
""")
a = module.newInt(1)
b = module.newInt(2)
@@ -993,19 +993,11 @@
else:
raise AssertionError("did not get TypeError!")
- def test_call_tp_dealloc_when_created_from_python(self):
+ def test_call_tp_dealloc(self):
module = self.import_extension('foo', [
("fetchFooType", "METH_VARARGS",
"""
PyObject *o;
- Foo_Type.tp_basicsize = sizeof(FooObject);
- Foo_Type.tp_dealloc = &dealloc_foo;
- Foo_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES
- | Py_TPFLAGS_BASETYPE;
- Foo_Type.tp_new = &new_foo;
- Foo_Type.tp_free = &PyObject_Del;
- if (PyType_Ready(&Foo_Type) < 0) return NULL;
-
o = PyObject_New(PyObject, &Foo_Type);
init_foo(o);
Py_DECREF(o); /* calls dealloc_foo immediately */
@@ -1024,8 +1016,7 @@
("getCounter", "METH_VARARGS",
"""
return PyInt_FromLong(foo_counter);
- """)], prologue=
- """
+ """)], prologue="""
typedef struct {
PyObject_HEAD
int someval[99];
@@ -1059,6 +1050,14 @@
PyVarObject_HEAD_INIT(NULL, 0)
"foo.foo",
};
+ """, more_init="""
+ Foo_Type.tp_basicsize = sizeof(FooObject);
+ Foo_Type.tp_dealloc = &dealloc_foo;
+ Foo_Type.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES
+ | Py_TPFLAGS_BASETYPE;
+ Foo_Type.tp_new = &new_foo;
+ Foo_Type.tp_free = &PyObject_Del;
+ if (PyType_Ready(&Foo_Type) < 0) INITERROR;
""")
Foo = module.fetchFooType()
assert module.getCounter() == 1010
@@ -1100,14 +1099,10 @@
("new_obj", "METH_NOARGS",
'''
PyObject *obj;
- Foo_Type.tp_flags = Py_TPFLAGS_DEFAULT;
- Foo_Type.tp_call = &my_tp_call;
- if (PyType_Ready(&Foo_Type) < 0) return NULL;
obj = PyObject_New(PyObject, &Foo_Type);
return obj;
'''
- )],
- '''
+ )], prologue='''
static PyObject *
my_tp_call(PyObject *self, PyObject *args, PyObject *kwds)
{
@@ -1117,6 +1112,10 @@
PyVarObject_HEAD_INIT(NULL, 0)
"foo.foo",
};
+ ''', more_init='''
+ Foo_Type.tp_flags = Py_TPFLAGS_DEFAULT;
+ Foo_Type.tp_call = &my_tp_call;
+ if (PyType_Ready(&Foo_Type) < 0) INITERROR;
''')
x = module.new_obj()
assert x() == 42
@@ -1126,18 +1125,18 @@
module = self.import_extension('foo', [
("getMetaClass", "METH_NOARGS",
'''
- FooType_Type.tp_flags = Py_TPFLAGS_DEFAULT;
- FooType_Type.tp_base = &PyType_Type;
- if (PyType_Ready(&FooType_Type) < 0) return NULL;
Py_INCREF(&FooType_Type);
return (PyObject *)&FooType_Type;
'''
- )],
- '''
+ )], prologue='''
static PyTypeObject FooType_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
"foo.Type",
};
+ ''', more_init='''
+ FooType_Type.tp_flags = Py_TPFLAGS_DEFAULT;
+ FooType_Type.tp_base = &PyType_Type;
+ if (PyType_Ready(&FooType_Type) < 0) INITERROR;
''')
FooType = module.getMetaClass()
if not self.runappdirect:
diff --git a/pypy/module/cpyext/typeobject.py b/pypy/module/cpyext/typeobject.py
--- a/pypy/module/cpyext/typeobject.py
+++ b/pypy/module/cpyext/typeobject.py
@@ -242,7 +242,7 @@
def update_all_slots(space, w_type, pto):
# fill slots in pto
# Not very sure about it, but according to
- # test_call_tp_dealloc_when_created_from_python, we should not
+ # test_call_tp_dealloc, we should not
# overwrite slots that are already set: these ones are probably
# coming from a parent C type.
diff --git a/pypy/tool/cpyext/extbuild.py b/pypy/tool/cpyext/extbuild.py
--- a/pypy/tool/cpyext/extbuild.py
+++ b/pypy/tool/cpyext/extbuild.py
@@ -83,8 +83,11 @@
def import_extension(self, modname, functions, prologue="",
include_dirs=None, more_init="", PY_SSIZE_T_CLEAN=False):
body = prologue + make_methods(functions, modname)
- init = """Py_InitModule("%s", methods);""" % (modname,)
+ init = """Py_InitModule("%s", methods);
+ """ % (modname,)
if more_init:
+ init += """#define INITERROR return
+ """
init += more_init
return self.import_module(
name=modname, init=init, body=body, include_dirs=include_dirs,
More information about the pypy-commit
mailing list