[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