Home | History | Annotate | Download | only in bgen
      1 from bgenOutput import *
      2 from bgenGeneratorGroup import GeneratorGroup
      3 
      4 class Module(GeneratorGroup):
      5 
      6     def __init__(self, name, prefix = None,
      7              includestuff = None,
      8              finalstuff = None,
      9              initstuff = None,
     10              variablestuff = None,
     11              longname = None):
     12         GeneratorGroup.__init__(self, prefix or name)
     13         self.name = name
     14         if longname:
     15             self.longname = longname
     16         else:
     17             self.longname = name
     18         self.includestuff = includestuff
     19         self.initstuff = initstuff
     20         self.finalstuff = finalstuff
     21         self.variablestuff = variablestuff
     22         self.typeobjects = []
     23 
     24     def addobject(self, od):
     25         self.generators.append(od)
     26         self.typeobjects.append(od)
     27         od.setmodulename(self.longname)
     28 
     29     def generate(self):
     30         OutHeader1("Module " + self.name)
     31         Output("#include \"Python.h\"")
     32         Output()
     33 
     34         if self.includestuff:
     35             Output()
     36             Output("%s", self.includestuff)
     37 
     38         self.declareModuleVariables()
     39 
     40         GeneratorGroup.generate(self)
     41 
     42         if self.finalstuff:
     43             Output()
     44             Output("%s", self.finalstuff)
     45 
     46         Output()
     47         Output("void init%s(void)", self.name)
     48         OutLbrace()
     49         Output("PyObject *m;")
     50         Output("PyObject *d;")
     51         Output()
     52 
     53         if self.initstuff:
     54             Output("%s", self.initstuff)
     55             Output()
     56 
     57         Output("m = Py_InitModule(\"%s\", %s_methods);",
     58                self.name, self.prefix)
     59         Output("d = PyModule_GetDict(m);")
     60         self.createModuleVariables()
     61         OutRbrace()
     62         OutHeader1("End module " + self.name)
     63 
     64     def declareModuleVariables(self):
     65         self.errorname = self.prefix + "_Error"
     66         Output("static PyObject *%s;", self.errorname)
     67 
     68     def createModuleVariables(self):
     69         Output("""%s = %s;""", self.errorname, self.exceptionInitializer())
     70         Output("""if (%s == NULL ||""", self.errorname)
     71         Output("""    PyDict_SetItemString(d, "Error", %s) != 0)""",
     72                                                        self.errorname)
     73         IndentLevel()
     74         Output("""return;""")
     75         DedentLevel()
     76         for tp in self.typeobjects:
     77             tp.outputTypeObjectInitializer()
     78         if self.variablestuff:
     79             Output("%s", self.variablestuff)
     80             Output()
     81 
     82     def exceptionInitializer(self):
     83         return """PyErr_NewException("%s.Error", NULL, NULL)""" % self.name
     84 
     85 
     86 def _test():
     87     from bgenGenerator import FunctionGenerator
     88     m = Module("spam", "", "#include <stdio.h>")
     89     g = FunctionGenerator(None, "bacon")
     90     m.add(g)
     91     m.generate()
     92 
     93 if __name__ == "__main__":
     94     _test()
     95