/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

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