[pypy-commit] pypy default: Use C parser to define the PyXXXDescrObjects
rlamy
pypy.commits at gmail.com
Thu Sep 28 17:00:36 EDT 2017
Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch:
Changeset: r92494:8e1aad229f8e
Date: 2017-09-28 22:59 +0200
http://bitbucket.org/pypy/pypy/changeset/8e1aad229f8e/
Log: Use C parser to define the PyXXXDescrObjects
diff --git a/pypy/module/cpyext/include/descrobject.h b/pypy/module/cpyext/include/descrobject.h
--- a/pypy/module/cpyext/include/descrobject.h
+++ b/pypy/module/cpyext/include/descrobject.h
@@ -1,34 +1,6 @@
#ifndef Py_DESCROBJECT_H
#define Py_DESCROBJECT_H
-#define PyDescr_COMMON \
- PyObject_HEAD \
- PyTypeObject *d_type; \
- PyObject *d_name
-
-typedef struct {
- PyDescr_COMMON;
-} PyDescrObject;
-
-typedef struct {
- PyDescr_COMMON;
- PyMethodDef *d_method;
-} PyMethodDescrObject;
-
-typedef struct {
- PyDescr_COMMON;
- struct PyMemberDef *d_member;
-} PyMemberDescrObject;
-
-typedef struct {
- PyDescr_COMMON;
- PyGetSetDef *d_getset;
-} PyGetSetDescrObject;
-
-typedef struct {
- PyDescr_COMMON;
- struct wrapperbase *d_base;
- void *d_wrapped; /* This can be any function pointer */
-} PyWrapperDescrObject;
+#include "cpyext_descrobject.h"
#endif
diff --git a/pypy/module/cpyext/parse/cpyext_descrobject.h b/pypy/module/cpyext/parse/cpyext_descrobject.h
new file mode 100644
--- /dev/null
+++ b/pypy/module/cpyext/parse/cpyext_descrobject.h
@@ -0,0 +1,29 @@
+#define PyDescr_COMMON \
+ PyObject_HEAD \
+ PyTypeObject *d_type; \
+ PyObject *d_name
+
+typedef struct {
+ PyDescr_COMMON;
+} PyDescrObject;
+
+typedef struct {
+ PyDescr_COMMON;
+ PyMethodDef *d_method;
+} PyMethodDescrObject;
+
+typedef struct {
+ PyDescr_COMMON;
+ struct PyMemberDef *d_member;
+} PyMemberDescrObject;
+
+typedef struct {
+ PyDescr_COMMON;
+ PyGetSetDef *d_getset;
+} PyGetSetDescrObject;
+
+typedef struct {
+ PyDescr_COMMON;
+ struct wrapperbase *d_base;
+ void *d_wrapped; /* This can be any function pointer */
+} PyWrapperDescrObject;
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
@@ -23,7 +23,6 @@
Py_TPFLAGS_TYPE_SUBCLASS,
Py_TPFLAGS_INT_SUBCLASS, Py_TPFLAGS_STRING_SUBCLASS, # change on py3
)
-from pypy.module.cpyext.cparser import parse_source
from pypy.module.cpyext.methodobject import (W_PyCClassMethodObject,
W_PyCWrapperObject, PyCFunction_NewEx, PyCFunction, PyMethodDef,
W_PyCMethodObject, W_PyCFunctionObject)
@@ -42,6 +41,8 @@
from pypy.objspace.std.typeobject import W_TypeObject, find_best_base
+cts.parse_header(parse_dir / "cpyext_descrobject.h")
+
#WARN_ABOUT_MISSING_SLOT_FUNCTIONS = False
PyType_Check, PyType_CheckExact = build_type_checkers_flags("Type")
@@ -116,57 +117,24 @@
)
assert not W_MemberDescr.typedef.acceptable_as_base_class # no __new__
-PyDescrObject = lltype.ForwardReference()
-PyDescrObjectPtr = lltype.Ptr(PyDescrObject)
-PyDescrObjectFields = PyObjectFields + (
- ("d_type", PyTypeObjectPtr),
- ("d_name", PyObject),
- )
-cpython_struct("PyDescrObject", PyDescrObjectFields,
- PyDescrObject)
-
-PyMemberDescrObjectStruct = lltype.ForwardReference()
-PyMemberDescrObject = lltype.Ptr(PyMemberDescrObjectStruct)
-PyMemberDescrObjectFields = PyDescrObjectFields + (
- ("d_member", lltype.Ptr(PyMemberDef)),
- )
-cpython_struct("PyMemberDescrObject", PyMemberDescrObjectFields,
- PyMemberDescrObjectStruct, level=2)
-
-PyGetSetDescrObjectStruct = lltype.ForwardReference()
-PyGetSetDescrObject = lltype.Ptr(PyGetSetDescrObjectStruct)
-PyGetSetDescrObjectFields = PyDescrObjectFields + (
- ("d_getset", lltype.Ptr(PyGetSetDef)),
- )
-cpython_struct("PyGetSetDescrObject", PyGetSetDescrObjectFields,
- PyGetSetDescrObjectStruct, level=2)
-
-PyMethodDescrObjectStruct = lltype.ForwardReference()
-PyMethodDescrObject = lltype.Ptr(PyMethodDescrObjectStruct)
-PyMethodDescrObjectFields = PyDescrObjectFields + (
- ("d_method", lltype.Ptr(PyMethodDef)),
- )
-cpython_struct("PyMethodDescrObject", PyMethodDescrObjectFields,
- PyMethodDescrObjectStruct, level=2)
-
@bootstrap_function
def init_memberdescrobject(space):
make_typedescr(W_MemberDescr.typedef,
- basestruct=PyMemberDescrObject.TO,
+ basestruct=cts.gettype('PyMemberDescrObject'),
attach=memberdescr_attach,
realize=memberdescr_realize,
)
make_typedescr(W_GetSetPropertyEx.typedef,
- basestruct=PyGetSetDescrObject.TO,
+ basestruct=cts.gettype('PyGetSetDescrObject'),
attach=getsetdescr_attach,
)
make_typedescr(W_PyCClassMethodObject.typedef,
- basestruct=PyMethodDescrObject.TO,
+ basestruct=cts.gettype('PyMethodDescrObject'),
attach=methoddescr_attach,
realize=classmethoddescr_realize,
)
make_typedescr(W_PyCMethodObject.typedef,
- basestruct=PyMethodDescrObject.TO,
+ basestruct=cts.gettype('PyMethodDescrObject'),
attach=methoddescr_attach,
realize=methoddescr_realize,
)
@@ -176,7 +144,7 @@
Fills a newly allocated PyMemberDescrObject with the given W_MemberDescr
object. The values must not be modified.
"""
- py_memberdescr = rffi.cast(PyMemberDescrObject, py_obj)
+ py_memberdescr = cts.cast('PyMemberDescrObject*', py_obj)
# XXX assign to d_dname, d_type?
assert isinstance(w_obj, W_MemberDescr)
py_memberdescr.c_d_member = w_obj.member
@@ -195,7 +163,7 @@
Fills a newly allocated PyGetSetDescrObject with the given W_GetSetPropertyEx
object. The values must not be modified.
"""
- py_getsetdescr = rffi.cast(PyGetSetDescrObject, py_obj)
+ py_getsetdescr = cts.cast('PyGetSetDescrObject*', py_obj)
if isinstance(w_obj, GetSetProperty):
py_getsetdef = make_GetSet(space, w_obj)
assert space.isinstance_w(w_userdata, space.w_type)
@@ -207,7 +175,7 @@
py_getsetdescr.c_d_getset = w_obj.getset
def methoddescr_attach(space, py_obj, w_obj, w_userdata=None):
- py_methoddescr = rffi.cast(PyMethodDescrObject, py_obj)
+ py_methoddescr = cts.cast('PyMethodDescrObject*', py_obj)
# XXX assign to d_dname, d_type?
assert isinstance(w_obj, W_PyCFunctionObject)
py_methoddescr.c_d_method = w_obj.ml
@@ -452,7 +420,7 @@
pto.c_tp_flags |= Py_TPFLAGS_INT_SUBCLASS
elif space.issubtype_w(w_obj, space.w_long):
pto.c_tp_flags |= Py_TPFLAGS_LONG_SUBCLASS
- elif space.issubtype_w(w_obj, space.w_bytes):
+ elif space.issubtype_w(w_obj, space.w_bytes):
pto.c_tp_flags |= Py_TPFLAGS_STRING_SUBCLASS # STRING->BYTES on py3
elif space.issubtype_w(w_obj, space.w_unicode):
pto.c_tp_flags |= Py_TPFLAGS_UNICODE_SUBCLASS
More information about the pypy-commit
mailing list