Author: Matti Picus <[email protected]>
Branch: py3.5-merge-PyType_Ready
Changeset: r88463:52e9d36465b2
Date: 2016-11-18 15:24 +0200
http://bitbucket.org/pypy/pypy/changeset/52e9d36465b2/
Log: merge relevant parts of 9a8f9cff8c5d
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
@@ -76,11 +76,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;
'''),
@@ -90,8 +85,7 @@
PySequence_Check(args) +
PyMapping_Check(args) * 2);
''')
- ],
- '''
+ ], prologue='''
static PyObject *
sq_item(PyObject *self, Py_ssize_t size)
{
@@ -107,6 +101,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
@@ -235,9 +235,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')
@@ -308,9 +308,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
@@ -353,9 +350,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>
''',
@@ -411,9 +405,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
@@ -637,15 +637,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)
{
@@ -660,6 +655,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)
@@ -671,14 +671,10 @@
("new_obj", "METH_NOARGS",
'''
PyObject *obj;
- 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)
{
@@ -689,6 +685,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
@@ -826,11 +827,6 @@
if (!PyArg_ParseTuple(args, "l", &intval))
return NULL;
- IntLike_Type.tp_as_number = &intlike_as_number;
- IntLike_Type.tp_flags |= Py_TPFLAGS_DEFAULT;
- 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;
@@ -847,8 +843,6 @@
if (!PyArg_ParseTuple(args, "l", &intval))
return NULL;
- IntLike_Type_NoOp.tp_flags |= Py_TPFLAGS_DEFAULT;
- if (PyType_Ready(&IntLike_Type_NoOp) < 0) return NULL;
intObjNoOp = PyObject_New(IntLikeObjectNoOp,
&IntLike_Type_NoOp);
if (!intObjNoOp) {
return NULL;
@@ -856,8 +850,7 @@
intObjNoOp->ival = intval;
return (PyObject *)intObjNoOp;
- """)], prologue=
- """
+ """)], prologue="""
#include <math.h>
typedef struct
{
@@ -909,6 +902,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;
+ 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;
+ if (PyType_Ready(&IntLike_Type_NoOp) < 0) INITERROR;
""")
a = module.newInt(1)
b = module.newInt(2)
@@ -955,18 +956,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_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 */
@@ -1020,6 +1014,13 @@
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_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
@@ -1061,14 +1062,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)
{
@@ -1078,6 +1075,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
@@ -1087,18 +1088,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
@@ -241,7 +241,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
@@ -86,8 +86,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 = """PyObject *mod = PyModule_Create(&moduledef);"""
+ init = """PyObject *mod = PyModule_Create(&moduledef);
+ """
if more_init:
+ init += """#define INITERROR return NULL
+ """
init += more_init
init += "\nreturn mod;"
return self.import_module(
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit