blob: eda1a02750b551137544bbd4dce76d34c12b4192 [file] [log] [blame]
Guido van Rossum8cfc4bf1995-01-18 23:45:01 +00001from bgenOutput import *
2from bgenGeneratorGroup import GeneratorGroup
3
4class Module(GeneratorGroup):
5
6 def __init__(self, name, prefix = None,
7 includestuff = None,
Guido van Rossum01f5a811995-01-25 22:59:21 +00008 finalstuff = None,
9 initstuff = None):
Guido van Rossum8cfc4bf1995-01-18 23:45:01 +000010 GeneratorGroup.__init__(self, prefix or name)
11 self.name = name
12 self.includestuff = includestuff
13 self.initstuff = initstuff
Guido van Rossum01f5a811995-01-25 22:59:21 +000014 self.finalstuff = finalstuff
Guido van Rossum8cfc4bf1995-01-18 23:45:01 +000015
16 def addobject(self, od):
17 self.generators.append(od)
18
19 def generate(self):
20 OutHeader1("Module " + self.name)
Guido van Rossum8d6c1801995-01-18 23:46:59 +000021 Output("#include \"Python.h\"")
Guido van Rossum8cfc4bf1995-01-18 23:45:01 +000022 Output()
23
24 if self.includestuff:
25 Output()
26 Output("%s", self.includestuff)
27
28 self.declareModuleVariables()
29
30 GeneratorGroup.generate(self)
Guido van Rossum8d6c1801995-01-18 23:46:59 +000031
Guido van Rossum01f5a811995-01-25 22:59:21 +000032 if self.finalstuff:
Guido van Rossum8d6c1801995-01-18 23:46:59 +000033 Output()
Guido van Rossum01f5a811995-01-25 22:59:21 +000034 Output("%s", self.finalstuff)
Guido van Rossum8cfc4bf1995-01-18 23:45:01 +000035
36 Output()
37 Output("void init%s()", self.name)
38 OutLbrace()
Guido van Rossum8d6c1801995-01-18 23:46:59 +000039 Output("PyObject *m;")
40 Output("PyObject *d;")
Guido van Rossum8cfc4bf1995-01-18 23:45:01 +000041 Output()
42
43 if self.initstuff:
44 Output("%s", self.initstuff)
45 Output()
46
Guido van Rossum8d6c1801995-01-18 23:46:59 +000047 Output("m = Py_InitModule(\"%s\", %s_methods);",
Guido van Rossum8cfc4bf1995-01-18 23:45:01 +000048 self.name, self.prefix)
Guido van Rossum8d6c1801995-01-18 23:46:59 +000049 Output("d = PyModule_GetDict(m);")
Guido van Rossum8cfc4bf1995-01-18 23:45:01 +000050 self.createModuleVariables()
51 OutRbrace()
52 OutHeader1("End module " + self.name)
53
54 def declareModuleVariables(self):
55 self.errorname = self.prefix + "_Error"
Guido van Rossum8d6c1801995-01-18 23:46:59 +000056 Output("static PyObject *%s;", self.errorname)
Guido van Rossum8cfc4bf1995-01-18 23:45:01 +000057
58 def createModuleVariables(self):
Guido van Rossum01f5a811995-01-25 22:59:21 +000059 Output("""%s = %s;""", self.errorname, self.exceptionInitializer())
60 Output("""if (%s == NULL ||""", self.errorname)
Guido van Rossum8d6c1801995-01-18 23:46:59 +000061 Output(""" PyDict_SetItemString(d, "Error", %s) != 0)""",
62 self.errorname)
Guido van Rossum01f5a811995-01-25 22:59:21 +000063 IndentLevel()
Guido van Rossum8d6c1801995-01-18 23:46:59 +000064 Output("""Py_FatalError("can't initialize %s.Error");""",
65 self.name)
Guido van Rossum01f5a811995-01-25 22:59:21 +000066 DedentLevel()
67
68 def exceptionInitializer(self):
69 return """PyString_FromString("%s.Error")""" % self.name
Guido van Rossum8cfc4bf1995-01-18 23:45:01 +000070
71
72def _test():
73 from bgenGenerator import Generator
74 m = Module("spam", "", "#include <stdio.h>")
75 g = Generator(None, "bacon")
76 m.add(g)
77 m.generate()
78
79if __name__ == "__main__":
80 _test()