[pypy-commit] pypy cpyext-ext: add a make_typedescr for W_MemeberDesc
mattip
pypy.commits at gmail.com
Fri Jan 15 09:33:56 EST 2016
Author: mattip <matti.picus at gmail.com>
Branch: cpyext-ext
Changeset: r81797:da2c16ceb152
Date: 2016-01-15 15:46 +0200
http://bitbucket.org/pypy/pypy/changeset/da2c16ceb152/
Log: add a make_typedescr for W_MemeberDesc
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
@@ -16,7 +16,8 @@
cpython_api, cpython_struct, bootstrap_function, Py_ssize_t, Py_ssize_tP,
generic_cpy_call, Py_TPFLAGS_READY, Py_TPFLAGS_READYING,
Py_TPFLAGS_HEAPTYPE, METH_VARARGS, METH_KEYWORDS, CANNOT_FAIL,
- Py_TPFLAGS_HAVE_GETCHARBUFFER, build_type_checkers)
+ Py_TPFLAGS_HAVE_GETCHARBUFFER, build_type_checkers, PyObjectFields,
+ PyObject)
from pypy.module.cpyext.methodobject import (
PyDescr_NewWrapper, PyCFunction_NewEx, PyCFunction_typedef)
from pypy.module.cpyext.modsupport import convert_method_defs
@@ -99,6 +100,51 @@
)
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)
+
+ at bootstrap_function
+def init_memberdescrobject(space):
+ make_typedescr(W_MemberDescr.typedef,
+ basestruct=PyMemberDescrObject.TO,
+ attach=memberdescr_attach,
+ realize=memberdescr_realize,
+ )
+
+def memberdescr_attach(space, py_obj, w_obj):
+ """
+ Fills a newly allocated PyMemberDescrObject with the given W_MemberDescr
+ object. The values must not be modified.
+ """
+ py_memberdescr = rffi.cast(PyMemberDescrObject, py_obj)
+ # XXX assign to d_dname, d_type?
+ py_memberdescr.c_d_member = w_obj.member
+
+def memberdescr_realize(space, obj):
+ # XXX NOT TESTED When is this ever called?
+ member = rffi.cast(PyMemberDef, obj)
+ w_type = from_ref(space, rffi.cast(PyObject, obj.c_ob_type))
+ w_obj = space.allocate_instance(W_MemberDescr, w_type)
+ w_obj.__init__(member, w_type)
+ track_reference(space, obj, w_obj)
+ state = space.fromcache(RefcountState)
+ state.set_lifeline(w_obj, obj)
+ return w_obj
+
def convert_getset_defs(space, dict_w, getsets, w_type):
getsets = rffi.cast(rffi.CArrayPtr(PyGetSetDef), getsets)
if getsets:
@@ -373,7 +419,6 @@
track_reference(space, py_tuple, space.w_tuple, replace=True)
track_reference(space, py_str, space.w_str, replace=True)
-
@cpython_api([PyObject], lltype.Void, external=False)
def subtype_dealloc(space, obj):
pto = obj.c_ob_type
More information about the pypy-commit
mailing list