1111INOUT = 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
0 commit comments