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

Skip to content

Commit f8de068

Browse files
committed
Lots of changes.
Renamed some things. Added support for methods directly to bgenGenerator.py. Completely reworked buffer, string and and structure types.
1 parent 7cbf480 commit f8de068

4 files changed

Lines changed: 376 additions & 147 deletions

File tree

Tools/bgen/bgen/bgenGenerator.py

Lines changed: 52 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -11,53 +11,41 @@
1111
INOUT = IN_OUT = "in-out"
1212

1313

14-
class Generator:
14+
class FunctionGenerator:
1515

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)
16+
def __init__(self, returntype, name, *argumentList):
17+
self.returntype = returntype
18+
self.name = name
19+
self.argumentList = []
20+
self.setreturnvar()
21+
self.parseArgumentList(argumentList)
2422
self.prefix = "XXX" # Will be changed by setprefix() call
2523
self.objecttype = "PyObject" # Type of _self argument to function
2624
self.itselftype = None # Type of _self->ob_itself, if defined
2725

26+
def setreturnvar(self):
27+
if self.returntype:
28+
self.rv = self.makereturnvar()
29+
self.argumentList.append(self.rv)
30+
else:
31+
self.rv = None
32+
33+
def makereturnvar(self):
34+
return Variable(self.returntype, "_rv", OutMode)
35+
2836
def setprefix(self, prefix):
2937
self.prefix = prefix
3038

3139
def setselftype(self, selftype, itselftype):
3240
self.objecttype = selftype
3341
self.itselftype = itselftype
3442

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-
4643
def parseArgumentList(self, argumentList):
47-
from types import *
4844
iarg = 0
49-
for arg in argumentList:
50-
# Arguments can either be:
51-
# - a type
52-
# - a tuple (type, [name, [mode]])
53-
# - a variable
45+
for type, name, mode in argumentList:
5446
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
47+
if name is None: name = "_arg%d" % iarg
48+
arg = Variable(type, name, mode)
6149
self.argumentList.append(arg)
6250

6351
def reference(self, name = None):
@@ -67,6 +55,7 @@ def reference(self, name = None):
6755
name, self.prefix, self.name)
6856

6957
def generate(self):
58+
print "-->", self.name
7059
self.functionheader()
7160
self.declarations()
7261
self.getargs()
@@ -84,6 +73,7 @@ def functionheader(self):
8473
Output("PyObject *_args;")
8574
DedentLevel()
8675
OutLbrace()
76+
Output("PyObject *_res = NULL;")
8777

8878
def declarations(self):
8979
for arg in self.argumentList:
@@ -98,7 +88,9 @@ def getargs(self):
9888
continue
9989
if arg.mode in (InMode, InOutMode):
10090
fmt = fmt + arg.getargsFormat()
101-
lst = lst + sep + arg.getargsArgs()
91+
args = arg.getargsArgs()
92+
if args:
93+
lst = lst + sep + args
10294
Output("if (!PyArg_ParseTuple(_args, \"%s\"%s))", fmt, lst)
10395
IndentLevel()
10496
Output("return NULL;")
@@ -111,7 +103,11 @@ def getargs(self):
111103

112104
def callit(self):
113105
args = ""
114-
sep = ",\n" + ' '*len("%s = %s(" % (self.rv.name, self.name))
106+
if self.rv:
107+
s = "%s = %s(" % (self.rv.name, self.name)
108+
else:
109+
s = "%s(" % self.name
110+
sep = ",\n" + ' '*len(s)
115111
for arg in self.argumentList:
116112
if arg is self.rv:
117113
continue
@@ -140,15 +136,34 @@ def returnvalue(self):
140136
lst = lst + sep + arg.mkvalueArgs()
141137
if fmt == "":
142138
Output("Py_INCREF(Py_None);")
143-
Output("return Py_None;");
139+
Output("_res = Py_None;");
144140
else:
145-
Output("return Py_BuildValue(\"%s\"%s);", fmt, lst)
141+
Output("_res = Py_BuildValue(\"%s\"%s);", fmt, lst)
142+
tmp = self.argumentList[:]
143+
tmp.reverse()
144+
for arg in tmp:
145+
if not arg: continue
146+
if arg.flags == ErrorMode: continue
147+
if arg.mode in (OutMode, InOutMode):
148+
arg.mkvalueCleanup()
149+
Output("return _res;")
146150

147151
def functiontrailer(self):
148152
OutRbrace()
149153

150154

151-
class ManualGenerator(Generator):
155+
class MethodGenerator(FunctionGenerator):
156+
157+
def parseArgumentList(self, args):
158+
a0, args = args[0], args[1:]
159+
t0, n0, m0 = a0
160+
if m0 != InMode:
161+
raise ValueError, "method's 'self' must be 'InMode'"
162+
self.itself = Variable(t0, "_self->ob_itself", SelfMode)
163+
self.argumentList.append(self.itself)
164+
FunctionGenerator.parseArgumentList(self, args)
165+
166+
class ManualGenerator(FunctionGenerator):
152167

153168
def __init__(self, name, body):
154169
self.name = name

Tools/bgen/bgen/bgenGeneratorGroup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ def add(self, g):
1313
def generate(self):
1414
for g in self.generators:
1515
g.generate()
16-
Output()
1716
Output("static PyMethodDef %s_methods[] = {", self.prefix)
1817
IndentLevel()
1918
for g in self.generators:
2019
g.reference()
2120
Output("{NULL, NULL, 0}")
2221
DedentLevel()
2322
Output("};")
23+
Output()
2424

2525

2626
def _test():

Tools/bgen/bgen/bgenObjectDefinition.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,18 +57,22 @@ def generate(self):
5757
OutHeader2("End object type " + self.name)
5858

5959
def outputNew(self):
60-
Output("static %s *%s_New(itself)", self.objecttype, self.prefix)
60+
Output("static PyObject *%s_New(itself)", self.prefix)
6161
IndentLevel()
6262
Output("const %s %sitself;", self.itselftype, self.argref)
6363
DedentLevel()
6464
OutLbrace()
6565
Output("%s *it;", self.objecttype)
66+
self.outputCheckNewArg()
6667
Output("it = PyObject_NEW(%s, &%s);", self.objecttype, self.typename)
6768
Output("if (it == NULL) return NULL;")
6869
Output("it->ob_itself = %sitself;", self.argref)
69-
Output("return it;")
70+
Output("return (PyObject *)it;")
7071
OutRbrace()
7172
Output()
73+
74+
def outputCheckNewArg(self):
75+
pass
7276

7377
def outputConvert(self):
7478
Output("""\

0 commit comments

Comments
 (0)