Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 8cfc4bf

Browse files
committed
initial version
1 parent 84fa5ec commit 8cfc4bf

7 files changed

Lines changed: 905 additions & 0 deletions

File tree

Tools/bgen/bgen/bgen.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
"Export everything in the various bgen submodules."
2+
3+
from bgenType import *
4+
from bgenOutput import *
5+
from bgenGenerator import *
6+
from bgenModule import *
7+
from bgenObjectDefinition import *

Tools/bgen/bgen/bgenGenerator.py

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
from bgenOutput import *
2+
from bgenType import *
3+
4+
5+
Error = "bgenGenerator.Error"
6+
7+
8+
# Strings to specify argument transfer modes in generator calls
9+
IN = "in"
10+
OUT = "out"
11+
INOUT = IN_OUT = "in-out"
12+
13+
14+
class Generator:
15+
16+
# XXX There are some funny things with the argument list.
17+
# XXX It would be better to get rid of this and require
18+
# XXX each argument to be a type object or a tuple of the form
19+
# XXX (inoutmode, typeobject, argumentname)
20+
# XXX or possibly even a Variable() instance...
21+
22+
def __init__(self, *argumentList):
23+
apply(self.parseArguments, argumentList)
24+
self.prefix = "XXX" # Will be changed by setprefix() call
25+
self.objecttype = "object" # Type of _self argument to function
26+
self.itselftype = None # Type of _self->ob_itself, if defined
27+
28+
def setprefix(self, prefix):
29+
self.prefix = prefix
30+
31+
def setselftype(self, selftype, itselftype):
32+
self.objecttype = selftype
33+
self.itselftype = itselftype
34+
35+
def parseArguments(self, returnType, name, *argumentList):
36+
if returnType:
37+
self.rv = Variable(returnType, "_rv", OutMode)
38+
else:
39+
self.rv = None
40+
self.name = name
41+
self.argumentList = []
42+
if self.rv:
43+
self.argumentList.append(rv)
44+
self.parseArgumentList(argumentList)
45+
46+
def parseArgumentList(self, argumentList):
47+
from types import *
48+
iarg = 0
49+
for arg in argumentList:
50+
# Arguments can either be:
51+
# - a type
52+
# - a tuple (type, [name, [mode]])
53+
# - a variable
54+
iarg = iarg + 1
55+
if hasattr(arg, 'typeName'):
56+
arg = Variable(arg)
57+
elif type(arg) == TupleType:
58+
arg = apply(Variable, arg)
59+
if arg.name is None:
60+
arg.name = "_arg%d" % iarg
61+
self.argumentList.append(arg)
62+
63+
def reference(self, name = None):
64+
if name is None:
65+
name = self.name
66+
Output("{\"%s\", (PyCFunction)%s_%s, 1},",
67+
name, self.prefix, self.name)
68+
69+
def generate(self):
70+
self.functionheader()
71+
self.declarations()
72+
self.getargs()
73+
self.callit()
74+
self.checkit()
75+
self.returnvalue()
76+
self.functiontrailer()
77+
78+
def functionheader(self):
79+
Output()
80+
Output("static PyObject *%s_%s(_self, _args)",
81+
self.prefix, self.name)
82+
IndentLevel()
83+
Output("%s *_self;", self.objecttype)
84+
Output("PyObject *_args;")
85+
DedentLevel()
86+
OutLbrace()
87+
88+
def declarations(self):
89+
for arg in self.argumentList:
90+
arg.declare()
91+
92+
def getargs(self):
93+
fmt = ""
94+
lst = ""
95+
for arg in self.argumentList:
96+
if arg.flags == SelfMode:
97+
continue
98+
if arg.mode in (InMode, InOutMode):
99+
fmt = fmt + arg.getargsFormat()
100+
lst = lst + ", " + arg.getargsArgs()
101+
Output("if (!PyArg_ParseTuple(_args, \"%s\"%s))", fmt, lst)
102+
IndentLevel()
103+
Output("return NULL;")
104+
DedentLevel()
105+
for arg in self.argumentList:
106+
if arg.flags == SelfMode:
107+
continue
108+
if arg.mode in (InMode, InOutMode):
109+
arg.getargsCheck()
110+
111+
def callit(self):
112+
args = ""
113+
for arg in self.argumentList:
114+
if arg is self.rv:
115+
continue
116+
s = arg.passArgument()
117+
if args: s = ", " + s
118+
args = args + s
119+
if self.rv:
120+
Output("%s = %s(%s);",
121+
self.rv.name, self.name, args)
122+
else:
123+
Output("%s(%s);", self.name, args)
124+
125+
def checkit(self):
126+
for arg in self.argumentList:
127+
arg.errorCheck()
128+
129+
def returnvalue(self):
130+
fmt = ""
131+
lst = ""
132+
for arg in self.argumentList:
133+
if not arg: continue
134+
if arg.flags == ErrorMode: continue
135+
if arg.mode in (OutMode, InOutMode):
136+
fmt = fmt + arg.mkvalueFormat()
137+
lst = lst + ", " + arg.mkvalueArgs()
138+
if fmt == "":
139+
Output("Py_INCREF(Py_None);")
140+
Output("return Py_None;");
141+
else:
142+
Output("return Py_BuildValue(\"%s\"%s);", fmt, lst)
143+
144+
def functiontrailer(self):
145+
OutRbrace()
146+
147+
148+
class ManualGenerator(Generator):
149+
150+
def __init__(self, name, body):
151+
self.name = name
152+
self.body = body
153+
154+
def definition(self):
155+
self.functionheader()
156+
Output("%s", self.body)
157+
self.functiontrailer()
158+
159+
160+
def _test():
161+
void = None
162+
eggs = Generator(void, "eggs",
163+
Variable(stringptr, 'cmd'),
164+
Variable(int, 'x'),
165+
Variable(double, 'y', InOutMode),
166+
Variable(int, 'status', ErrorMode),
167+
)
168+
eggs.setprefix("spam")
169+
print "/* START */"
170+
eggs.generate()
171+
172+
if __name__ == "__main__":
173+
_test()
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from bgenOutput import *
2+
3+
class GeneratorGroup:
4+
5+
def __init__(self, prefix):
6+
self.prefix = prefix
7+
self.generators = []
8+
9+
def add(self, g):
10+
g.setprefix(self.prefix)
11+
self.generators.append(g)
12+
13+
def generate(self):
14+
for g in self.generators:
15+
g.generate()
16+
Output()
17+
Output("static struct methodlist %s_methods[] = {", self.prefix)
18+
IndentLevel()
19+
for g in self.generators:
20+
g.reference()
21+
Output("{NULL, NULL, 0}")
22+
DedentLevel()
23+
Output("};")
24+
25+
26+
def _test():
27+
from bgenGenerator import Generator
28+
group = GeneratorGroup("spam")
29+
eggs = Generator(void, "eggs")
30+
group.add(eggs)
31+
print "/* START */"
32+
group.generate()
33+
34+
if __name__ == "__main__":
35+
_test()

Tools/bgen/bgen/bgenModule.py

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
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+
initstuff = None):
9+
GeneratorGroup.__init__(self, prefix or name)
10+
self.name = name
11+
self.includestuff = includestuff
12+
self.initstuff = initstuff
13+
14+
def addobject(self, od):
15+
self.generators.append(od)
16+
17+
def generate(self):
18+
OutHeader1("Module " + self.name)
19+
Output("#include <Python.h>")
20+
Output()
21+
22+
if self.includestuff:
23+
Output()
24+
Output("%s", self.includestuff)
25+
26+
self.declareModuleVariables()
27+
28+
GeneratorGroup.generate(self)
29+
30+
Output()
31+
Output("void init%s()", self.name)
32+
OutLbrace()
33+
Output("object *m;")
34+
Output("object *d;")
35+
Output()
36+
37+
if self.initstuff:
38+
Output("%s", self.initstuff)
39+
Output()
40+
41+
Output("m = initmodule(\"%s\", %s_methods);",
42+
self.name, self.prefix)
43+
Output("d = getmoduledict(m);")
44+
self.createModuleVariables()
45+
OutRbrace()
46+
OutHeader1("End module " + self.name)
47+
48+
def declareModuleVariables(self):
49+
self.errorname = self.prefix + "_Error"
50+
Output("static object *%s;", self.errorname)
51+
52+
def createModuleVariables(self):
53+
Output("""if ((%s = newstringobject("%s.Error")) == NULL ||""",
54+
self.errorname, self.name)
55+
Output(""" dictinsert(d, "Error", %s) != 0)""",
56+
self.errorname)
57+
Output("""\tfatal("can't initialize %s.Error");""",
58+
self.name)
59+
60+
61+
def _test():
62+
from bgenGenerator import Generator
63+
m = Module("spam", "", "#include <stdio.h>")
64+
g = Generator(None, "bacon")
65+
m.add(g)
66+
m.generate()
67+
68+
if __name__ == "__main__":
69+
_test()

0 commit comments

Comments
 (0)