blob: d41aa05c5680a2c9dbd5137cc7702e0656f6f665 [file] [log] [blame]
Guido van Rossum8cfc4bf1995-01-18 23:45:01 +00001from bgenOutput import *
2from bgenGeneratorGroup import GeneratorGroup
3
4class Module(GeneratorGroup):
5
Jack Jansen2cf08ab2003-01-19 21:53:57 +00006 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 = []
Guido van Rossum8cfc4bf1995-01-18 23:45:01 +000023
Jack Jansen2cf08ab2003-01-19 21:53:57 +000024 def addobject(self, od):
25 self.generators.append(od)
26 self.typeobjects.append(od)
27 od.setmodulename(self.longname)
Guido van Rossum8cfc4bf1995-01-18 23:45:01 +000028
Jack Jansen2cf08ab2003-01-19 21:53:57 +000029 def generate(self):
30 OutHeader1("Module " + self.name)
31 Output("#include \"Python.h\"")
32 Output()
Guido van Rossum8cfc4bf1995-01-18 23:45:01 +000033
Jack Jansen2cf08ab2003-01-19 21:53:57 +000034 if self.includestuff:
35 Output()
36 Output("%s", self.includestuff)
Guido van Rossum8cfc4bf1995-01-18 23:45:01 +000037
Jack Jansen2cf08ab2003-01-19 21:53:57 +000038 self.declareModuleVariables()
Guido van Rossum8cfc4bf1995-01-18 23:45:01 +000039
Jack Jansen2cf08ab2003-01-19 21:53:57 +000040 GeneratorGroup.generate(self)
Tim Peters182b5ac2004-07-18 06:16:08 +000041
Jack Jansen2cf08ab2003-01-19 21:53:57 +000042 if self.finalstuff:
43 Output()
44 Output("%s", self.finalstuff)
Guido van Rossum8cfc4bf1995-01-18 23:45:01 +000045
Jack Jansen2cf08ab2003-01-19 21:53:57 +000046 Output()
47 Output("void init%s(void)", self.name)
48 OutLbrace()
49 Output("PyObject *m;")
50 Output("PyObject *d;")
51 Output()
Guido van Rossum8cfc4bf1995-01-18 23:45:01 +000052
Jack Jansen2cf08ab2003-01-19 21:53:57 +000053 if self.initstuff:
54 Output("%s", self.initstuff)
55 Output()
Guido van Rossum8cfc4bf1995-01-18 23:45:01 +000056
Jack Jansen2cf08ab2003-01-19 21:53:57 +000057 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)
Guido van Rossum8cfc4bf1995-01-18 23:45:01 +000063
Jack Jansen2cf08ab2003-01-19 21:53:57 +000064 def declareModuleVariables(self):
65 self.errorname = self.prefix + "_Error"
66 Output("static PyObject *%s;", self.errorname)
Guido van Rossum8cfc4bf1995-01-18 23:45:01 +000067
Jack Jansen2cf08ab2003-01-19 21:53:57 +000068 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()
Guido van Rossum01f5a811995-01-25 22:59:21 +000081
Jack Jansen2cf08ab2003-01-19 21:53:57 +000082 def exceptionInitializer(self):
83 return """PyErr_NewException("%s.Error", NULL, NULL)""" % self.name
Guido van Rossum8cfc4bf1995-01-18 23:45:01 +000084
85
86def _test():
Jack Jansen2cf08ab2003-01-19 21:53:57 +000087 from bgenGenerator import FunctionGenerator
88 m = Module("spam", "", "#include <stdio.h>")
89 g = FunctionGenerator(None, "bacon")
90 m.add(g)
91 m.generate()
Guido van Rossum8cfc4bf1995-01-18 23:45:01 +000092
93if __name__ == "__main__":
Jack Jansen2cf08ab2003-01-19 21:53:57 +000094 _test()