summaryrefslogtreecommitdiff
path: root/Tools/bgen/bgen/bgenObjectDefinition.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/bgen/bgen/bgenObjectDefinition.py')
-rw-r--r--Tools/bgen/bgen/bgenObjectDefinition.py948
1 files changed, 474 insertions, 474 deletions
diff --git a/Tools/bgen/bgen/bgenObjectDefinition.py b/Tools/bgen/bgen/bgenObjectDefinition.py
index 986b407768..40435ad2ac 100644
--- a/Tools/bgen/bgen/bgenObjectDefinition.py
+++ b/Tools/bgen/bgen/bgenObjectDefinition.py
@@ -2,485 +2,485 @@ from bgenOutput import *
from bgenGeneratorGroup import GeneratorGroup
class ObjectDefinition(GeneratorGroup):
- "Spit out code that together defines a new Python object type"
- basechain = "NULL"
- tp_flags = "Py_TPFLAGS_DEFAULT"
- basetype = None
-
- def __init__(self, name, prefix, itselftype):
- """ObjectDefinition constructor. May be extended, but do not override.
-
- - name: the object's official name, e.g. 'SndChannel'.
- - prefix: the prefix used for the object's functions and data, e.g. 'SndCh'.
- - itselftype: the C type actually contained in the object, e.g. 'SndChannelPtr'.
-
- XXX For official Python data types, rules for the 'Py' prefix are a problem.
- """
-
- GeneratorGroup.__init__(self, prefix or name)
- self.name = name
- self.itselftype = itselftype
- self.objecttype = name + 'Object'
- self.typename = name + '_Type'
- self.argref = "" # set to "*" if arg to <type>_New should be pointer
- self.static = "static " # set to "" to make <type>_New and <type>_Convert public
- self.modulename = None
- if hasattr(self, "assertions"):
- self.assertions()
-
- def add(self, g, dupcheck=0):
- g.setselftype(self.objecttype, self.itselftype)
- GeneratorGroup.add(self, g, dupcheck)
-
- def reference(self):
- # In case we are referenced from a module
- pass
-
- def setmodulename(self, name):
- self.modulename = name
-
- def generate(self):
- # XXX This should use long strings and %(varname)s substitution!
-
- OutHeader2("Object type " + self.name)
-
- sf = self.static and "static "
- Output("%sPyTypeObject %s;", sf, self.typename)
- Output()
- Output("#define %s_Check(x) ((x)->ob_type == &%s || PyObject_TypeCheck((x), &%s))",
- self.prefix, self.typename, self.typename)
- Output()
- Output("typedef struct %s {", self.objecttype)
- IndentLevel()
- Output("PyObject_HEAD")
- self.outputStructMembers()
- DedentLevel()
- Output("} %s;", self.objecttype)
-
- self.outputNew()
-
- self.outputConvert()
-
- self.outputDealloc()
-
- GeneratorGroup.generate(self)
-
- Output()
- self.outputMethodChain()
-
- self.outputGetattr()
-
- self.outputSetattr()
-
- self.outputCompare()
-
- self.outputRepr()
-
- self.outputHash()
-
- self.outputPEP253Hooks()
-
- self.outputTypeObject()
-
- OutHeader2("End object type " + self.name)
-
- def outputMethodChain(self):
- Output("%sPyMethodChain %s_chain = { %s_methods, %s };",
- self.static, self.prefix, self.prefix, self.basechain)
-
- def outputStructMembers(self):
- Output("%s ob_itself;", self.itselftype)
-
- def outputNew(self):
- Output()
- Output("%sPyObject *%s_New(%s %sitself)", self.static, self.prefix,
- self.itselftype, self.argref)
- OutLbrace()
- Output("%s *it;", self.objecttype)
- self.outputCheckNewArg()
- Output("it = PyObject_NEW(%s, &%s);", self.objecttype, self.typename)
- Output("if (it == NULL) return NULL;")
- if self.basetype:
- Output("/* XXXX Should we tp_init or tp_new our basetype? */")
- self.outputInitStructMembers()
- Output("return (PyObject *)it;")
- OutRbrace()
-
- def outputInitStructMembers(self):
- Output("it->ob_itself = %sitself;", self.argref)
-
- def outputCheckNewArg(self):
- "Override this method to apply additional checks/conversions"
-
- def outputConvert(self):
- Output("%sint %s_Convert(PyObject *v, %s *p_itself)", self.static, self.prefix,
- self.itselftype)
- OutLbrace()
- self.outputCheckConvertArg()
- Output("if (!%s_Check(v))", self.prefix)
- OutLbrace()
- Output('PyErr_SetString(PyExc_TypeError, "%s required");', self.name)
- Output("return 0;")
- OutRbrace()
- Output("*p_itself = ((%s *)v)->ob_itself;", self.objecttype)
- Output("return 1;")
- OutRbrace()
-
- def outputCheckConvertArg(self):
- "Override this method to apply additional conversions"
-
- def outputDealloc(self):
- Output()
- Output("static void %s_dealloc(%s *self)", self.prefix, self.objecttype)
- OutLbrace()
- self.outputCleanupStructMembers()
- if self.basetype:
- Output("%s.tp_dealloc(self)", self.basetype)
- elif hasattr(self, 'output_tp_free'):
- # This is a new-style object with tp_free slot
- Output("self->ob_type->tp_free((PyObject *)self);")
- else:
- Output("PyObject_Free((PyObject *)self);")
- OutRbrace()
-
- def outputCleanupStructMembers(self):
- self.outputFreeIt("self->ob_itself")
-
- def outputFreeIt(self, name):
- Output("/* Cleanup of %s goes here */", name)
-
- def outputGetattr(self):
- Output()
- Output("static PyObject *%s_getattr(%s *self, char *name)", self.prefix, self.objecttype)
- OutLbrace()
- self.outputGetattrBody()
- OutRbrace()
-
- def outputGetattrBody(self):
- self.outputGetattrHook()
- Output("return Py_FindMethodInChain(&%s_chain, (PyObject *)self, name);",
- self.prefix)
-
- def outputGetattrHook(self):
- pass
-
- def outputSetattr(self):
- Output()
- Output("#define %s_setattr NULL", self.prefix)
-
- def outputCompare(self):
- Output()
- Output("#define %s_compare NULL", self.prefix)
-
- def outputRepr(self):
- Output()
- Output("#define %s_repr NULL", self.prefix)
-
- def outputHash(self):
- Output()
- Output("#define %s_hash NULL", self.prefix)
-
- def outputTypeObject(self):
- sf = self.static and "static "
- Output()
- Output("%sPyTypeObject %s = {", sf, self.typename)
- IndentLevel()
- Output("PyObject_HEAD_INIT(NULL)")
- Output("0, /*ob_size*/")
- if self.modulename:
- Output("\"%s.%s\", /*tp_name*/", self.modulename, self.name)
- else:
- Output("\"%s\", /*tp_name*/", self.name)
- Output("sizeof(%s), /*tp_basicsize*/", self.objecttype)
- Output("0, /*tp_itemsize*/")
- Output("/* methods */")
- Output("(destructor) %s_dealloc, /*tp_dealloc*/", self.prefix)
- Output("0, /*tp_print*/")
- Output("(getattrfunc) %s_getattr, /*tp_getattr*/", self.prefix)
- Output("(setattrfunc) %s_setattr, /*tp_setattr*/", self.prefix)
- Output("(cmpfunc) %s_compare, /*tp_compare*/", self.prefix)
- Output("(reprfunc) %s_repr, /*tp_repr*/", self.prefix)
- Output("(PyNumberMethods *)0, /* tp_as_number */")
- Output("(PySequenceMethods *)0, /* tp_as_sequence */")
- Output("(PyMappingMethods *)0, /* tp_as_mapping */")
- Output("(hashfunc) %s_hash, /*tp_hash*/", self.prefix)
- DedentLevel()
- Output("};")
-
- def outputTypeObjectInitializer(self):
- Output("""%s.ob_type = &PyType_Type;""", self.typename)
- if self.basetype:
- Output("%s.tp_base = %s;", self.typename, self.basetype)
- Output("if (PyType_Ready(&%s) < 0) return;", self.typename)
- Output("""Py_INCREF(&%s);""", self.typename)
- Output("PyModule_AddObject(m, \"%s\", (PyObject *)&%s);", self.name, self.typename);
- Output("/* Backward-compatible name */")
- Output("""Py_INCREF(&%s);""", self.typename);
- Output("PyModule_AddObject(m, \"%sType\", (PyObject *)&%s);", self.name, self.typename);
-
- def outputPEP253Hooks(self):
- pass
-
+ "Spit out code that together defines a new Python object type"
+ basechain = "NULL"
+ tp_flags = "Py_TPFLAGS_DEFAULT"
+ basetype = None
+
+ def __init__(self, name, prefix, itselftype):
+ """ObjectDefinition constructor. May be extended, but do not override.
+
+ - name: the object's official name, e.g. 'SndChannel'.
+ - prefix: the prefix used for the object's functions and data, e.g. 'SndCh'.
+ - itselftype: the C type actually contained in the object, e.g. 'SndChannelPtr'.
+
+ XXX For official Python data types, rules for the 'Py' prefix are a problem.
+ """
+
+ GeneratorGroup.__init__(self, prefix or name)
+ self.name = name
+ self.itselftype = itselftype
+ self.objecttype = name + 'Object'
+ self.typename = name + '_Type'
+ self.argref = "" # set to "*" if arg to <type>_New should be pointer
+ self.static = "static " # set to "" to make <type>_New and <type>_Convert public
+ self.modulename = None
+ if hasattr(self, "assertions"):
+ self.assertions()
+
+ def add(self, g, dupcheck=0):
+ g.setselftype(self.objecttype, self.itselftype)
+ GeneratorGroup.add(self, g, dupcheck)
+
+ def reference(self):
+ # In case we are referenced from a module
+ pass
+
+ def setmodulename(self, name):
+ self.modulename = name
+
+ def generate(self):
+ # XXX This should use long strings and %(varname)s substitution!
+
+ OutHeader2("Object type " + self.name)
+
+ sf = self.static and "static "
+ Output("%sPyTypeObject %s;", sf, self.typename)
+ Output()
+ Output("#define %s_Check(x) ((x)->ob_type == &%s || PyObject_TypeCheck((x), &%s))",
+ self.prefix, self.typename, self.typename)
+ Output()
+ Output("typedef struct %s {", self.objecttype)
+ IndentLevel()
+ Output("PyObject_HEAD")
+ self.outputStructMembers()
+ DedentLevel()
+ Output("} %s;", self.objecttype)
+
+ self.outputNew()
+
+ self.outputConvert()
+
+ self.outputDealloc()
+
+ GeneratorGroup.generate(self)
+
+ Output()
+ self.outputMethodChain()
+
+ self.outputGetattr()
+
+ self.outputSetattr()
+
+ self.outputCompare()
+
+ self.outputRepr()
+
+ self.outputHash()
+
+ self.outputPEP253Hooks()
+
+ self.outputTypeObject()
+
+ OutHeader2("End object type " + self.name)
+
+ def outputMethodChain(self):
+ Output("%sPyMethodChain %s_chain = { %s_methods, %s };",
+ self.static, self.prefix, self.prefix, self.basechain)
+
+ def outputStructMembers(self):
+ Output("%s ob_itself;", self.itselftype)
+
+ def outputNew(self):
+ Output()
+ Output("%sPyObject *%s_New(%s %sitself)", self.static, self.prefix,
+ self.itselftype, self.argref)
+ OutLbrace()
+ Output("%s *it;", self.objecttype)
+ self.outputCheckNewArg()
+ Output("it = PyObject_NEW(%s, &%s);", self.objecttype, self.typename)
+ Output("if (it == NULL) return NULL;")
+ if self.basetype:
+ Output("/* XXXX Should we tp_init or tp_new our basetype? */")
+ self.outputInitStructMembers()
+ Output("return (PyObject *)it;")
+ OutRbrace()
+
+ def outputInitStructMembers(self):
+ Output("it->ob_itself = %sitself;", self.argref)
+
+ def outputCheckNewArg(self):
+ "Override this method to apply additional checks/conversions"
+
+ def outputConvert(self):
+ Output("%sint %s_Convert(PyObject *v, %s *p_itself)", self.static, self.prefix,
+ self.itselftype)
+ OutLbrace()
+ self.outputCheckConvertArg()
+ Output("if (!%s_Check(v))", self.prefix)
+ OutLbrace()
+ Output('PyErr_SetString(PyExc_TypeError, "%s required");', self.name)
+ Output("return 0;")
+ OutRbrace()
+ Output("*p_itself = ((%s *)v)->ob_itself;", self.objecttype)
+ Output("return 1;")
+ OutRbrace()
+
+ def outputCheckConvertArg(self):
+ "Override this method to apply additional conversions"
+
+ def outputDealloc(self):
+ Output()
+ Output("static void %s_dealloc(%s *self)", self.prefix, self.objecttype)
+ OutLbrace()
+ self.outputCleanupStructMembers()
+ if self.basetype:
+ Output("%s.tp_dealloc(self)", self.basetype)
+ elif hasattr(self, 'output_tp_free'):
+ # This is a new-style object with tp_free slot
+ Output("self->ob_type->tp_free((PyObject *)self);")
+ else:
+ Output("PyObject_Free((PyObject *)self);")
+ OutRbrace()
+
+ def outputCleanupStructMembers(self):
+ self.outputFreeIt("self->ob_itself")
+
+ def outputFreeIt(self, name):
+ Output("/* Cleanup of %s goes here */", name)
+
+ def outputGetattr(self):
+ Output()
+ Output("static PyObject *%s_getattr(%s *self, char *name)", self.prefix, self.objecttype)
+ OutLbrace()
+ self.outputGetattrBody()
+ OutRbrace()
+
+ def outputGetattrBody(self):
+ self.outputGetattrHook()
+ Output("return Py_FindMethodInChain(&%s_chain, (PyObject *)self, name);",
+ self.prefix)
+
+ def outputGetattrHook(self):
+ pass
+
+ def outputSetattr(self):
+ Output()
+ Output("#define %s_setattr NULL", self.prefix)
+
+ def outputCompare(self):
+ Output()
+ Output("#define %s_compare NULL", self.prefix)
+
+ def outputRepr(self):
+ Output()
+ Output("#define %s_repr NULL", self.prefix)
+
+ def outputHash(self):
+ Output()
+ Output("#define %s_hash NULL", self.prefix)
+
+ def outputTypeObject(self):
+ sf = self.static and "static "
+ Output()
+ Output("%sPyTypeObject %s = {", sf, self.typename)
+ IndentLevel()
+ Output("PyObject_HEAD_INIT(NULL)")
+ Output("0, /*ob_size*/")
+ if self.modulename:
+ Output("\"%s.%s\", /*tp_name*/", self.modulename, self.name)
+ else:
+ Output("\"%s\", /*tp_name*/", self.name)
+ Output("sizeof(%s), /*tp_basicsize*/", self.objecttype)
+ Output("0, /*tp_itemsize*/")
+ Output("/* methods */")
+ Output("(destructor) %s_dealloc, /*tp_dealloc*/", self.prefix)
+ Output("0, /*tp_print*/")
+ Output("(getattrfunc) %s_getattr, /*tp_getattr*/", self.prefix)
+ Output("(setattrfunc) %s_setattr, /*tp_setattr*/", self.prefix)
+ Output("(cmpfunc) %s_compare, /*tp_compare*/", self.prefix)
+ Output("(reprfunc) %s_repr, /*tp_repr*/", self.prefix)
+ Output("(PyNumberMethods *)0, /* tp_as_number */")
+ Output("(PySequenceMethods *)0, /* tp_as_sequence */")
+ Output("(PyMappingMethods *)0, /* tp_as_mapping */")
+ Output("(hashfunc) %s_hash, /*tp_hash*/", self.prefix)
+ DedentLevel()
+ Output("};")
+
+ def outputTypeObjectInitializer(self):
+ Output("""%s.ob_type = &PyType_Type;""", self.typename)
+ if self.basetype:
+ Output("%s.tp_base = %s;", self.typename, self.basetype)
+ Output("if (PyType_Ready(&%s) < 0) return;", self.typename)
+ Output("""Py_INCREF(&%s);""", self.typename)
+ Output("PyModule_AddObject(m, \"%s\", (PyObject *)&%s);", self.name, self.typename);
+ Output("/* Backward-compatible name */")
+ Output("""Py_INCREF(&%s);""", self.typename);
+ Output("PyModule_AddObject(m, \"%sType\", (PyObject *)&%s);", self.name, self.typename);
+
+ def outputPEP253Hooks(self):
+ pass
+
class PEP252Mixin:
- getsetlist = []
-
- def assertions(self):
- # Check that various things aren't overridden. If they are it could
- # signify a bgen-client that has been partially converted to PEP252.
- assert self.outputGetattr.im_func == PEP252Mixin.outputGetattr.im_func
- assert self.outputSetattr.im_func == PEP252Mixin.outputSetattr.im_func
- assert self.outputGetattrBody == None
- assert self.outputGetattrHook == None
- assert self.basechain == "NULL"
-
- def outputGetattr(self):
- pass
-
- outputGetattrBody = None
-
- outputGetattrHook = None
-
- def outputSetattr(self):
- pass
-
- def outputMethodChain(self):
- # This is a good place to output the getters and setters
- self.outputGetSetList()
-
- def outputHook(self, name):
- methodname = "outputHook_" + name
- if hasattr(self, methodname):
- func = getattr(self, methodname)
- func()
- else:
- Output("0, /*%s*/", name)
-
- def outputTypeObject(self):
- sf = self.static and "static "
- Output()
- Output("%sPyTypeObject %s = {", sf, self.typename)
- IndentLevel()
- Output("PyObject_HEAD_INIT(NULL)")
- Output("0, /*ob_size*/")
- if self.modulename:
- Output("\"%s.%s\", /*tp_name*/", self.modulename, self.name)
- else:
- Output("\"%s\", /*tp_name*/", self.name)
- Output("sizeof(%s), /*tp_basicsize*/", self.objecttype)
- Output("0, /*tp_itemsize*/")
-
- Output("/* methods */")
- Output("(destructor) %s_dealloc, /*tp_dealloc*/", self.prefix)
- Output("0, /*tp_print*/")
- Output("(getattrfunc)0, /*tp_getattr*/")
- Output("(setattrfunc)0, /*tp_setattr*/")
- Output("(cmpfunc) %s_compare, /*tp_compare*/", self.prefix)
- Output("(reprfunc) %s_repr, /*tp_repr*/", self.prefix)
-
- Output("(PyNumberMethods *)0, /* tp_as_number */")
- Output("(PySequenceMethods *)0, /* tp_as_sequence */")
- Output("(PyMappingMethods *)0, /* tp_as_mapping */")
-
- Output("(hashfunc) %s_hash, /*tp_hash*/", self.prefix)
- self.outputHook("tp_call")
- Output("0, /*tp_str*/")
- Output("PyObject_GenericGetAttr, /*tp_getattro*/")
- Output("PyObject_GenericSetAttr, /*tp_setattro */")
-
- self.outputHook("tp_as_buffer")
- Output("%s, /* tp_flags */", self.tp_flags)
- self.outputHook("tp_doc")
- self.outputHook("tp_traverse")
- self.outputHook("tp_clear")
- self.outputHook("tp_richcompare")
- self.outputHook("tp_weaklistoffset")
- self.outputHook("tp_iter")
- self.outputHook("tp_iternext")
- Output("%s_methods, /* tp_methods */", self.prefix)
- self.outputHook("tp_members")
- Output("%s_getsetlist, /*tp_getset*/", self.prefix)
- self.outputHook("tp_base")
- self.outputHook("tp_dict")
- self.outputHook("tp_descr_get")
- self.outputHook("tp_descr_set")
- self.outputHook("tp_dictoffset")
- self.outputHook("tp_init")
- self.outputHook("tp_alloc")
- self.outputHook("tp_new")
- self.outputHook("tp_free")
- DedentLevel()
- Output("};")
-
- def outputGetSetList(self):
- if self.getsetlist:
- for name, get, set, doc in self.getsetlist:
- if get:
- self.outputGetter(name, get)
- else:
- Output("#define %s_get_%s NULL", self.prefix, name)
- Output()
- if set:
- self.outputSetter(name, set)
- else:
- Output("#define %s_set_%s NULL", self.prefix, name)
- Output()
-
- Output("static PyGetSetDef %s_getsetlist[] = {", self.prefix)
- IndentLevel()
- for name, get, set, doc in self.getsetlist:
- if doc:
- doc = '"' + doc + '"'
- else:
- doc = "NULL"
- Output("{\"%s\", (getter)%s_get_%s, (setter)%s_set_%s, %s},",
- name, self.prefix, name, self.prefix, name, doc)
- Output("{NULL, NULL, NULL, NULL},")
- DedentLevel()
- Output("};")
- else:
- Output("#define %s_getsetlist NULL", self.prefix)
- Output()
-
- def outputGetter(self, name, code):
- Output("static PyObject *%s_get_%s(%s *self, void *closure)",
- self.prefix, name, self.objecttype)
- OutLbrace()
- Output(code)
- OutRbrace()
- Output()
-
- def outputSetter(self, name, code):
- Output("static int %s_set_%s(%s *self, PyObject *v, void *closure)",
- self.prefix, name, self.objecttype)
- OutLbrace()
- Output(code)
- Output("return 0;")
- OutRbrace()
- Output()
-
+ getsetlist = []
+
+ def assertions(self):
+ # Check that various things aren't overridden. If they are it could
+ # signify a bgen-client that has been partially converted to PEP252.
+ assert self.outputGetattr.im_func == PEP252Mixin.outputGetattr.im_func
+ assert self.outputSetattr.im_func == PEP252Mixin.outputSetattr.im_func
+ assert self.outputGetattrBody == None
+ assert self.outputGetattrHook == None
+ assert self.basechain == "NULL"
+
+ def outputGetattr(self):
+ pass
+
+ outputGetattrBody = None
+
+ outputGetattrHook = None
+
+ def outputSetattr(self):
+ pass
+
+ def outputMethodChain(self):
+ # This is a good place to output the getters and setters
+ self.outputGetSetList()
+
+ def outputHook(self, name):
+ methodname = "outputHook_" + name
+ if hasattr(self, methodname):
+ func = getattr(self, methodname)
+ func()
+ else:
+ Output("0, /*%s*/", name)
+
+ def outputTypeObject(self):
+ sf = self.static and "static "
+ Output()
+ Output("%sPyTypeObject %s = {", sf, self.typename)
+ IndentLevel()
+ Output("PyObject_HEAD_INIT(NULL)")
+ Output("0, /*ob_size*/")
+ if self.modulename:
+ Output("\"%s.%s\", /*tp_name*/", self.modulename, self.name)
+ else:
+ Output("\"%s\", /*tp_name*/", self.name)
+ Output("sizeof(%s), /*tp_basicsize*/", self.objecttype)
+ Output("0, /*tp_itemsize*/")
+
+ Output("/* methods */")
+ Output("(destructor) %s_dealloc, /*tp_dealloc*/", self.prefix)
+ Output("0, /*tp_print*/")
+ Output("(getattrfunc)0, /*tp_getattr*/")
+ Output("(setattrfunc)0, /*tp_setattr*/")
+ Output("(cmpfunc) %s_compare, /*tp_compare*/", self.prefix)
+ Output("(reprfunc) %s_repr, /*tp_repr*/", self.prefix)
+
+ Output("(PyNumberMethods *)0, /* tp_as_number */")
+ Output("(PySequenceMethods *)0, /* tp_as_sequence */")
+ Output("(PyMappingMethods *)0, /* tp_as_mapping */")
+
+ Output("(hashfunc) %s_hash, /*tp_hash*/", self.prefix)
+ self.outputHook("tp_call")
+ Output("0, /*tp_str*/")
+ Output("PyObject_GenericGetAttr, /*tp_getattro*/")
+ Output("PyObject_GenericSetAttr, /*tp_setattro */")
+
+ self.outputHook("tp_as_buffer")
+ Output("%s, /* tp_flags */", self.tp_flags)
+ self.outputHook("tp_doc")
+ self.outputHook("tp_traverse")
+ self.outputHook("tp_clear")
+ self.outputHook("tp_richcompare")
+ self.outputHook("tp_weaklistoffset")
+ self.outputHook("tp_iter")
+ self.outputHook("tp_iternext")
+ Output("%s_methods, /* tp_methods */", self.prefix)
+ self.outputHook("tp_members")
+ Output("%s_getsetlist, /*tp_getset*/", self.prefix)
+ self.outputHook("tp_base")
+ self.outputHook("tp_dict")
+ self.outputHook("tp_descr_get")
+ self.outputHook("tp_descr_set")
+ self.outputHook("tp_dictoffset")
+ self.outputHook("tp_init")
+ self.outputHook("tp_alloc")
+ self.outputHook("tp_new")
+ self.outputHook("tp_free")
+ DedentLevel()
+ Output("};")
+
+ def outputGetSetList(self):
+ if self.getsetlist:
+ for name, get, set, doc in self.getsetlist:
+ if get:
+ self.outputGetter(name, get)
+ else:
+ Output("#define %s_get_%s NULL", self.prefix, name)
+ Output()
+ if set:
+ self.outputSetter(name, set)
+ else:
+ Output("#define %s_set_%s NULL", self.prefix, name)
+ Output()
+
+ Output("static PyGetSetDef %s_getsetlist[] = {", self.prefix)
+ IndentLevel()
+ for name, get, set, doc in self.getsetlist:
+ if doc:
+ doc = '"' + doc + '"'
+ else:
+ doc = "NULL"
+ Output("{\"%s\", (getter)%s_get_%s, (setter)%s_set_%s, %s},",
+ name, self.prefix, name, self.prefix, name, doc)
+ Output("{NULL, NULL, NULL, NULL},")
+ DedentLevel()
+ Output("};")
+ else:
+ Output("#define %s_getsetlist NULL", self.prefix)
+ Output()
+
+ def outputGetter(self, name, code):
+ Output("static PyObject *%s_get_%s(%s *self, void *closure)",
+ self.prefix, name, self.objecttype)
+ OutLbrace()
+ Output(code)
+ OutRbrace()
+ Output()
+
+ def outputSetter(self, name, code):
+ Output("static int %s_set_%s(%s *self, PyObject *v, void *closure)",
+ self.prefix, name, self.objecttype)
+ OutLbrace()
+ Output(code)
+ Output("return 0;")
+ OutRbrace()
+ Output()
+
class PEP253Mixin(PEP252Mixin):
- tp_flags = "Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE"
-
- def outputHook_tp_init(self):
- Output("%s_tp_init, /* tp_init */", self.prefix)
-
- def outputHook_tp_alloc(self):
- Output("%s_tp_alloc, /* tp_alloc */", self.prefix)
-
- def outputHook_tp_new(self):
- Output("%s_tp_new, /* tp_new */", self.prefix)
-
- def outputHook_tp_free(self):
- Output("%s_tp_free, /* tp_free */", self.prefix)
-
- output_tp_initBody = None
-
- def output_tp_init(self):
- if self.output_tp_initBody:
- Output("static int %s_tp_init(PyObject *self, PyObject *args, PyObject *kwds)", self.prefix)
- OutLbrace()
- self.output_tp_initBody()
- OutRbrace()
- else:
- Output("#define %s_tp_init 0", self.prefix)
- Output()
-
- output_tp_allocBody = None
-
- def output_tp_alloc(self):
- if self.output_tp_allocBody:
- Output("static PyObject *%s_tp_alloc(PyTypeObject *type, int nitems)",
- self.prefix)
- OutLbrace()
- self.output_tp_allocBody()
- OutRbrace()
- else:
- Output("#define %s_tp_alloc PyType_GenericAlloc", self.prefix)
- Output()
-
- def output_tp_newBody(self):
- Output("PyObject *self;");
- Output("%s itself;", self.itselftype);
- Output("char *kw[] = {\"itself\", 0};")
- Output()
- Output("if (!PyArg_ParseTupleAndKeywords(args, kwds, \"O&\", kw, %s_Convert, &itself)) return NULL;",
- self.prefix);
- Output("if ((self = type->tp_alloc(type, 0)) == NULL) return NULL;")
- Output("((%s *)self)->ob_itself = itself;", self.objecttype)
- Output("return self;")
-
- def output_tp_new(self):
- if self.output_tp_newBody:
- Output("static PyObject *%s_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)", self.prefix)
- OutLbrace()
- self.output_tp_newBody()
- OutRbrace()
- else:
- Output("#define %s_tp_new PyType_GenericNew", self.prefix)
- Output()
-
- output_tp_freeBody = None
-
- def output_tp_free(self):
- if self.output_tp_freeBody:
- Output("static void %s_tp_free(PyObject *self)", self.prefix)
- OutLbrace()
- self.output_tp_freeBody()
- OutRbrace()
- else:
- Output("#define %s_tp_free PyObject_Del", self.prefix)
- Output()
-
- def outputPEP253Hooks(self):
- self.output_tp_init()
- self.output_tp_alloc()
- self.output_tp_new()
- self.output_tp_free()
+ tp_flags = "Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE"
+
+ def outputHook_tp_init(self):
+ Output("%s_tp_init, /* tp_init */", self.prefix)
+
+ def outputHook_tp_alloc(self):
+ Output("%s_tp_alloc, /* tp_alloc */", self.prefix)
+
+ def outputHook_tp_new(self):
+ Output("%s_tp_new, /* tp_new */", self.prefix)
+
+ def outputHook_tp_free(self):
+ Output("%s_tp_free, /* tp_free */", self.prefix)
+
+ output_tp_initBody = None
+
+ def output_tp_init(self):
+ if self.output_tp_initBody:
+ Output("static int %s_tp_init(PyObject *self, PyObject *args, PyObject *kwds)", self.prefix)
+ OutLbrace()
+ self.output_tp_initBody()
+ OutRbrace()
+ else:
+ Output("#define %s_tp_init 0", self.prefix)
+ Output()
+
+ output_tp_allocBody = None
+
+ def output_tp_alloc(self):
+ if self.output_tp_allocBody:
+ Output("static PyObject *%s_tp_alloc(PyTypeObject *type, int nitems)",
+ self.prefix)
+ OutLbrace()
+ self.output_tp_allocBody()
+ OutRbrace()
+ else:
+ Output("#define %s_tp_alloc PyType_GenericAlloc", self.prefix)
+ Output()
+
+ def output_tp_newBody(self):
+ Output("PyObject *self;");
+ Output("%s itself;", self.itselftype);
+ Output("char *kw[] = {\"itself\", 0};")
+ Output()
+ Output("if (!PyArg_ParseTupleAndKeywords(args, kwds, \"O&\", kw, %s_Convert, &itself)) return NULL;",
+ self.prefix);
+ Output("if ((self = type->tp_alloc(type, 0)) == NULL) return NULL;")
+ Output("((%s *)self)->ob_itself = itself;", self.objecttype)
+ Output("return self;")
+
+ def output_tp_new(self):
+ if self.output_tp_newBody:
+ Output("static PyObject *%s_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)", self.prefix)
+ OutLbrace()
+ self.output_tp_newBody()
+ OutRbrace()
+ else:
+ Output("#define %s_tp_new PyType_GenericNew", self.prefix)
+ Output()
+
+ output_tp_freeBody = None
+
+ def output_tp_free(self):
+ if self.output_tp_freeBody:
+ Output("static void %s_tp_free(PyObject *self)", self.prefix)
+ OutLbrace()
+ self.output_tp_freeBody()
+ OutRbrace()
+ else:
+ Output("#define %s_tp_free PyObject_Del", self.prefix)
+ Output()
+
+ def outputPEP253Hooks(self):
+ self.output_tp_init()
+ self.output_tp_alloc()
+ self.output_tp_new()
+ self.output_tp_free()
class GlobalObjectDefinition(ObjectDefinition):
- """Like ObjectDefinition but exports some parts.
-
- XXX Should also somehow generate a .h file for them.
- """
+ """Like ObjectDefinition but exports some parts.
+
+ XXX Should also somehow generate a .h file for them.
+ """
- def __init__(self, name, prefix = None, itselftype = None):
- ObjectDefinition.__init__(self, name, prefix or name, itselftype or name)
- self.static = ""
+ def __init__(self, name, prefix = None, itselftype = None):
+ ObjectDefinition.__init__(self, name, prefix or name, itselftype or name)
+ self.static = ""
class ObjectIdentityMixin:
- """A mixin class for objects that makes the identity of ob_itself
- govern comparisons and dictionary lookups. Useful if the C object can
- be returned by library calls and it is difficult (or impossible) to find
- the corresponding Python objects. With this you can create Python object
- wrappers on the fly"""
-
- def outputCompare(self):
- Output()
- Output("static int %s_compare(%s *self, %s *other)", self.prefix, self.objecttype,
- self.objecttype)
- OutLbrace()
- Output("unsigned long v, w;")
- Output()
- Output("if (!%s_Check((PyObject *)other))", self.prefix)
- OutLbrace()
- Output("v=(unsigned long)self;")
- Output("w=(unsigned long)other;")
- OutRbrace()
- Output("else")
- OutLbrace()
- Output("v=(unsigned long)self->ob_itself;")
- Output("w=(unsigned long)other->ob_itself;")
- OutRbrace()
- Output("if( v < w ) return -1;")
- Output("if( v > w ) return 1;")
- Output("return 0;")
- OutRbrace()
-
- def outputHash(self):
- Output()
- Output("static long %s_hash(%s *self)", self.prefix, self.objecttype)
- OutLbrace()
- Output("return (long)self->ob_itself;")
- OutRbrace()
-
+ """A mixin class for objects that makes the identity of ob_itself
+ govern comparisons and dictionary lookups. Useful if the C object can
+ be returned by library calls and it is difficult (or impossible) to find
+ the corresponding Python objects. With this you can create Python object
+ wrappers on the fly"""
+
+ def outputCompare(self):
+ Output()
+ Output("static int %s_compare(%s *self, %s *other)", self.prefix, self.objecttype,
+ self.objecttype)
+ OutLbrace()
+ Output("unsigned long v, w;")
+ Output()
+ Output("if (!%s_Check((PyObject *)other))", self.prefix)
+ OutLbrace()
+ Output("v=(unsigned long)self;")
+ Output("w=(unsigned long)other;")
+ OutRbrace()
+ Output("else")
+ OutLbrace()
+ Output("v=(unsigned long)self->ob_itself;")
+ Output("w=(unsigned long)other->ob_itself;")
+ OutRbrace()
+ Output("if( v < w ) return -1;")
+ Output("if( v > w ) return 1;")
+ Output("return 0;")
+ OutRbrace()
+
+ def outputHash(self):
+ Output()
+ Output("static long %s_hash(%s *self)", self.prefix, self.objecttype)
+ OutLbrace()
+ Output("return (long)self->ob_itself;")
+ OutRbrace()
+