[pypy-svn] r72476 - pypy/trunk/pypy/module/cpyext
xoraxax at codespeak.net
xoraxax at codespeak.net
Sat Mar 20 21:12:29 CET 2010
Author: xoraxax
Date: Sat Mar 20 21:12:05 2010
New Revision: 72476
Modified:
pypy/trunk/pypy/module/cpyext/api.py
pypy/trunk/pypy/module/cpyext/object.py
pypy/trunk/pypy/module/cpyext/typeobject.py
Log:
Add declarations to typeobject.py
Modified: pypy/trunk/pypy/module/cpyext/api.py
==============================================================================
--- pypy/trunk/pypy/module/cpyext/api.py (original)
+++ pypy/trunk/pypy/module/cpyext/api.py Sat Mar 20 21:12:05 2010
@@ -42,10 +42,11 @@
return func
return decorate
-def cpython_struct(name, fields):
+def cpython_struct(name, fields, forward=None):
configname = name.replace(' ', '__')
setattr(CConfig, configname, rffi_platform.Struct(name, fields))
- forward = lltype.ForwardReference()
+ if forward is None:
+ forward = lltype.ForwardReference()
TYPES[configname] = forward
return forward
@@ -55,7 +56,8 @@
# It is important that these PyObjects are allocated in a raw fashion
# Thus we cannot save a forward pointer to the wrapped object
# So we need a forward and backward mapping in our State instance
-PyObject = lltype.Ptr(cpython_struct('struct _object', [("refcnt", lltype.Signed)]))
+PyObjectFields = (("refcnt", lltype.Signed), )
+PyObject = lltype.Ptr(cpython_struct('struct _object', PyObjectFields))
def configure():
for name, TYPE in rffi_platform.configure(CConfig).iteritems():
Modified: pypy/trunk/pypy/module/cpyext/object.py
==============================================================================
--- pypy/trunk/pypy/module/cpyext/object.py (original)
+++ pypy/trunk/pypy/module/cpyext/object.py Sat Mar 20 21:12:05 2010
@@ -4,4 +4,4 @@
@cpython_api([PyTypeObjectPtr], PyObject)
def _PyObject_New(space, pto):
- return space.wrap(42)
+ return space.wrap(42) # XXX
Modified: pypy/trunk/pypy/module/cpyext/typeobject.py
==============================================================================
--- pypy/trunk/pypy/module/cpyext/typeobject.py (original)
+++ pypy/trunk/pypy/module/cpyext/typeobject.py Sat Mar 20 21:12:05 2010
@@ -1,22 +1,142 @@
from pypy.rpython.lltypesystem import rffi, lltype
-from pypy.module.cpyext.api import cpython_api, cpython_struct, PyObject
-from pypy.interpreter.module import Module
-from pypy.module.cpyext.methodobject import PyCFunction_NewEx
+from pypy.rpython.lltypesystem.lltype import Ptr, FuncType, Void
-PyCFunction = lltype.Ptr(lltype.FuncType([PyObject, PyObject], PyObject))
+from pypy.module.cpyext.api import cpython_api, cpython_struct, PyObject, PyObjectFields, Py_ssize_t
+from pypy.interpreter.module import Module
+from pypy.module.cpyext.modsupport import PyMethodDef
+PyTypeObject = lltype.ForwardReference()
+PyTypeObjectPtr = lltype.Ptr(PyTypeObject)
+PyCFunction = Ptr(FuncType([PyObject, PyObject], PyObject))
+P, FT, PyO = Ptr, FuncType, PyObject
+PyOPtr = Ptr(lltype.Array(PyO, hints={'nolength': True}))
+
+
+# XXX
+PyNumberMethods = PySequenceMethods = PyMappingMethods = \
+ PyBufferProcs = PyMemberDef = PyGetSetDef = rffi.VOIDP.TO
+
+freefunc = P(FT([rffi.VOIDP], Void))
+destructor = P(FT([PyO], Void))
+printfunc = P(FT([PyO, rffi.VOIDP, rffi.INT], rffi.INT))
+getattrfunc = P(FT([PyO, rffi.CCHARP], PyO))
+getattrofunc = P(FT([PyO, PyO], PyO))
+setattrfunc = P(FT([PyO, rffi.CCHARP, PyO], rffi.INT))
+setattrofunc = P(FT([PyO, PyO, PyO], rffi.INT))
+cmpfunc = P(FT([PyO, PyO], rffi.INT))
+reprfunc = P(FT([PyO], PyO))
+hashfunc = P(FT([PyO], lltype.Signed))
+richcmpfunc = P(FT([PyO, PyO, rffi.INT], PyO))
+getiterfunc = P(FT([PyO], PyO))
+iternextfunc = P(FT([PyO], PyO))
+descrgetfunc = P(FT([PyO, PyO, PyO], PyO))
+descrsetfunc = P(FT([PyO, PyO, PyO], rffi.INT))
+initproc = P(FT([PyO, PyO, PyO], rffi.INT))
+newfunc = P(FT([PyTypeObjectPtr, PyO, PyO], PyO))
+allocfunc = P(FT([PyTypeObjectPtr, Py_ssize_t], PyO))
+unaryfunc = P(FT([PyO], PyO))
+binaryfunc = P(FT([PyO, PyO], PyO))
+ternaryfunc = P(FT([PyO, PyO, PyO], PyO))
+inquiry = P(FT([PyO], rffi.INT))
+lenfunc = P(FT([PyO], Py_ssize_t))
+coercion = P(FT([PyOPtr, PyOPtr], rffi.INT))
+intargfunc = P(FT([PyO, rffi.INT], PyO))
+intintargfunc = P(FT([PyO, rffi.INT, rffi.INT], PyO))
+ssizeargfunc = P(FT([PyO, Py_ssize_t], PyO))
+ssizessizeargfunc = P(FT([PyO, Py_ssize_t, Py_ssize_t], PyO))
+intobjargproc = P(FT([PyO, rffi.INT, PyO], rffi.INT))
+intintobjargproc = P(FT([PyO, rffi.INT, rffi.INT, PyO], rffi.INT))
+ssizeobjargproc = P(FT([PyO, Py_ssize_t, PyO], rffi.INT))
+ssizessizeobjargproc = P(FT([PyO, Py_ssize_t, Py_ssize_t, PyO], rffi.INT))
+objobjargproc = P(FT([PyO, PyO, PyO], rffi.INT))
+
+objobjproc = P(FT([PyO, PyO], rffi.INT))
+visitproc = P(FT([PyO, rffi.VOIDP], rffi.INT))
+traverseproc = P(FT([PyO, visitproc, rffi.VOIDP], rffi.INT))
+
+PyTypeObjectFields = []
+PyTypeObjectFields.extend(PyObjectFields)
+PyTypeObjectFields.extend([
+ ("tp_name", rffi.CCHARP), # For printing, in format "<module>.<name>"
+ ("tp_basicsize", Py_ssize_t), ("tp_itemsize", Py_ssize_t), # For allocation
+
+ # Methods to implement standard operations
+ ("tp_dealloc", destructor),
+ ("tp_print", printfunc),
+ ("tp_getattr", getattrfunc),
+ ("tp_setattr", setattrfunc),
+ ("tp_compare", cmpfunc),
+ ("tp_repr", reprfunc),
+
+ # Method suites for standard classes
+ ("tp_as_number", Ptr(PyNumberMethods)),
+ ("tp_as_sequence", Ptr(PySequenceMethods)),
+ ("tp_as_mapping", Ptr(PyMappingMethods)),
+
+ # More standard operations (here for binary compatibility)
+ ("tp_hash", hashfunc),
+ ("tp_call", ternaryfunc),
+ ("tp_str", reprfunc),
+ ("tp_getattro", getattrofunc),
+ ("tp_setattro", setattrofunc),
+
+ # Functions to access object as input/output buffer
+ ("tp_as_buffer", Ptr(PyBufferProcs)),
+
+ # Flags to define presence of optional/expanded features
+ ("tp_flags", lltype.Signed),
+
+ ("tp_doc", rffi.CCHARP), # Documentation string
+
+ # Assigned meaning in release 2.0
+ # call function for all accessible objects
+ ("tp_traverse", traverseproc),
+
+ # delete references to contained objects
+ ("tp_clear", inquiry),
+
+ # Assigned meaning in release 2.1
+ # rich comparisons
+ ("tp_richcompare", richcmpfunc),
+
+ # weak reference enabler
+ ("tp_weaklistoffset", Py_ssize_t),
+
+ # Added in release 2.2
+ # Iterators
+ ("tp_iter", getiterfunc),
+ ("tp_iternext", iternextfunc),
+
+ # Attribute descriptor and subclassing stuff
+ ("tp_methods", Ptr(PyMethodDef)),
+ ("tp_members", Ptr(PyMemberDef)),
+ ("tp_getset", Ptr(PyGetSetDef)),
+ ("tp_base", Ptr(PyTypeObject)),
+ ("tp_dict", PyObject),
+ ("tp_descr_get", descrgetfunc),
+ ("tp_descr_set", descrsetfunc),
+ ("tp_dictoffset", Py_ssize_t),
+ ("tp_init", initproc),
+ ("tp_alloc", allocfunc),
+ ("tp_new", newfunc),
+ ("tp_free", freefunc), # Low-level free-memory routine
+ ("tp_is_gc", inquiry), # For PyObject_IS_GC
+ ("tp_bases", PyObject),
+ ("tp_mro", PyObject), # method resolution order
+ ("tp_cache", PyObject),
+ ("tp_subclasses", PyObject),
+ ("tp_weaklist", PyObject),
+ ("tp_del", destructor),
+ ])
+for x in PyTypeObjectFields:
+ try:
+ if len(x) != 2:
+ print x
+ except:
+ print x
PyTypeObject = cpython_struct(
"PyTypeObject",
- [])
-PyTypeObjectPtr = lltype.Ptr(PyTypeObject)
-
-def PyImport_AddModule(space, name):
- w_name = space.wrap(name)
- w_mod = space.wrap(Module(space, w_name))
-
- w_modules = space.sys.get('modules')
- space.setitem(w_modules, w_name, w_mod)
- return w_mod
+ PyTypeObjectFields, PyTypeObject)
#@cpython_api([rffi.CCHARP, lltype.Ptr(PyMethodDef)], lltype.Void)
def Py_InitModule(space, name, methods):
More information about the Pypy-commit
mailing list