/Tools/bgen/bgen/bgenModule.py
http://unladen-swallow.googlecode.com/ · Python · 94 lines · 77 code · 17 blank · 0 comment · 9 complexity · bac46ebb548a2184b70c87c711dbad02 MD5 · raw file
- from bgenOutput import *
- from bgenGeneratorGroup import GeneratorGroup
- class Module(GeneratorGroup):
- def __init__(self, name, prefix = None,
- includestuff = None,
- finalstuff = None,
- initstuff = None,
- variablestuff = None,
- longname = None):
- GeneratorGroup.__init__(self, prefix or name)
- self.name = name
- if longname:
- self.longname = longname
- else:
- self.longname = name
- self.includestuff = includestuff
- self.initstuff = initstuff
- self.finalstuff = finalstuff
- self.variablestuff = variablestuff
- self.typeobjects = []
- def addobject(self, od):
- self.generators.append(od)
- self.typeobjects.append(od)
- od.setmodulename(self.longname)
- def generate(self):
- OutHeader1("Module " + self.name)
- Output("#include \"Python.h\"")
- Output()
- if self.includestuff:
- Output()
- Output("%s", self.includestuff)
- self.declareModuleVariables()
- GeneratorGroup.generate(self)
- if self.finalstuff:
- Output()
- Output("%s", self.finalstuff)
- Output()
- Output("void init%s(void)", self.name)
- OutLbrace()
- Output("PyObject *m;")
- Output("PyObject *d;")
- Output()
- if self.initstuff:
- Output("%s", self.initstuff)
- Output()
- Output("m = Py_InitModule(\"%s\", %s_methods);",
- self.name, self.prefix)
- Output("d = PyModule_GetDict(m);")
- self.createModuleVariables()
- OutRbrace()
- OutHeader1("End module " + self.name)
- def declareModuleVariables(self):
- self.errorname = self.prefix + "_Error"
- Output("static PyObject *%s;", self.errorname)
- def createModuleVariables(self):
- Output("""%s = %s;""", self.errorname, self.exceptionInitializer())
- Output("""if (%s == NULL ||""", self.errorname)
- Output(""" PyDict_SetItemString(d, "Error", %s) != 0)""",
- self.errorname)
- IndentLevel()
- Output("""return;""")
- DedentLevel()
- for tp in self.typeobjects:
- tp.outputTypeObjectInitializer()
- if self.variablestuff:
- Output("%s", self.variablestuff)
- Output()
- def exceptionInitializer(self):
- return """PyErr_NewException("%s.Error", NULL, NULL)""" % self.name
- def _test():
- from bgenGenerator import FunctionGenerator
- m = Module("spam", "", "#include <stdio.h>")
- g = FunctionGenerator(None, "bacon")
- m.add(g)
- m.generate()
- if __name__ == "__main__":
- _test()