[Python-checkins] python/dist/src/Tools/bgen/bgen bgenBuffer.py,1.7,1.8 bgenGenerator.py,1.14,1.15 bgenGeneratorGroup.py,1.6,1.7 bgenHeapBuffer.py,1.3,1.4 bgenModule.py,1.11,1.12 bgenObjectDefinition.py,1.24,1.25 bgenOutput.py,1.4,1.5 bgenStackBuffer.py,1.2,1.3 bgenStringBuffer.py,1.1,1.2 bgenType.py,1.9,1.10 bgenVariable.py,1.1,1.2 macsupport.py,1.28,1.29 scantools.py,1.32,1.33
jackjansen@users.sourceforge.net
jackjansen@users.sourceforge.net
Sun, 19 Jan 2003 13:54:03 -0800
Update of /cvsroot/python/python/dist/src/Tools/bgen/bgen
In directory sc8-pr-cvs1:/tmp/cvs-serv6862
Modified Files:
bgenBuffer.py bgenGenerator.py bgenGeneratorGroup.py
bgenHeapBuffer.py bgenModule.py bgenObjectDefinition.py
bgenOutput.py bgenStackBuffer.py bgenStringBuffer.py
bgenType.py bgenVariable.py macsupport.py scantools.py
Log Message:
Sigh, due to sloppiness on my part bgen has become pretty mixed up wrt. tabs
and spaces. Detabbed the lot.
Index: bgenBuffer.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Tools/bgen/bgen/bgenBuffer.py,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** bgenBuffer.py 1 Jan 2002 22:40:08 -0000 1.7
--- bgenBuffer.py 19 Jan 2003 21:53:55 -0000 1.8
***************
*** 13,24 ****
# Map common types to their format characters
type2format = {
! 'long': 'l',
! 'int': 'i',
! 'short': 'h',
! 'char': 'b',
! 'unsigned long': 'l',
! 'unsigned int': 'i',
! 'unsigned short': 'h',
! 'unsigned char': 'b',
}
--- 13,24 ----
# Map common types to their format characters
type2format = {
! 'long': 'l',
! 'int': 'i',
! 'short': 'h',
! 'char': 'b',
! 'unsigned long': 'l',
! 'unsigned int': 'i',
! 'unsigned short': 'h',
! 'unsigned char': 'b',
}
***************
*** 28,264 ****
class FixedInputOutputBufferType(InputOnlyType):
!
! """Fixed buffer -- passed as (inbuffer, outbuffer)."""
! def __init__(self, size, datatype = 'char', sizetype = 'int', sizeformat = None):
! self.typeName = "Buffer"
! self.size = str(size)
! self.datatype = datatype
! self.sizetype = sizetype
! self.sizeformat = sizeformat or type2format[sizetype]
! self.label_needed = 0
! def declare(self, name):
! self.declareBuffer(name)
! self.declareSize(name)
!
! def declareBuffer(self, name):
! self.declareInputBuffer(name)
! self.declareOutputBuffer(name)
!
! def declareInputBuffer(self, name):
! Output("%s *%s__in__;", self.datatype, name)
!
! def declareOutputBuffer(self, name):
! Output("%s %s__out__[%s];", self.datatype, name, self.size)
! def declareSize(self, name):
! Output("%s %s__len__;", self.sizetype, name)
! Output("int %s__in_len__;", name)
! def getargsFormat(self):
! return "s#"
! def getargsArgs(self, name):
! return "&%s__in__, &%s__in_len__" % (name, name)
!
! def getargsCheck(self, name):
! Output("if (%s__in_len__ != %s)", name, self.size)
! OutLbrace()
! Output('PyErr_SetString(PyExc_TypeError, "buffer length should be %s");',
! self.size)
! Output("goto %s__error__;", name)
! self.label_needed = 1
! OutRbrace()
! self.transferSize(name)
!
! def transferSize(self, name):
! Output("%s__len__ = %s__in_len__;", name, name)
! def passOutput(self, name):
! return "%s__in__, %s__out__" % (name, name)
!
! def mkvalueFormat(self):
! return "s#"
! def mkvalueArgs(self, name):
! return "%s__out__, (int)%s" % (name, self.size)
!
! def cleanup(self, name):
! if self.label_needed:
! DedentLevel()
! Output(" %s__error__: ;", name)
! IndentLevel()
class FixedCombinedInputOutputBufferType(FixedInputOutputBufferType):
!
! """Like fixed buffer -- but same parameter is input and output."""
!
! def passOutput(self, name):
! return "(%s *)memcpy(%s__out__, %s__in__, %s)" % \
! (self.datatype, name, name, self.size)
class InputOnlyBufferMixIn(InputOnlyMixIn):
! def declareOutputBuffer(self, name):
! pass
class OutputOnlyBufferMixIn(OutputOnlyMixIn):
! def declareInputBuffer(self, name):
! pass
class OptionalInputBufferMixIn:
!
! """Add to input buffers if the buffer may be omitted: pass None in Python
! and the C code will get a NULL pointer and zero size"""
!
! def getargsFormat(self):
! return "z#"
class FixedInputBufferType(InputOnlyBufferMixIn, FixedInputOutputBufferType):
! """Fixed size input buffer -- passed without size information.
! Instantiate with the size as parameter.
! """
! def passInput(self, name):
! return "%s__in__" % name
class OptionalFixedInputBufferType(OptionalInputBufferMixIn, FixedInputBufferType):
! pass
class FixedOutputBufferType(OutputOnlyBufferMixIn, FixedInputOutputBufferType):
! """Fixed size output buffer -- passed without size information.
! Instantiate with the size as parameter.
! """
! def passOutput(self, name):
! return "%s__out__" % name
class VarInputBufferType(FixedInputBufferType):
! """Variable size input buffer -- passed as (buffer, size).
!
! Instantiate without size parameter.
! """
!
! def __init__(self, datatype = 'char', sizetype = 'int', sizeformat = None):
! FixedInputBufferType.__init__(self, "0", datatype, sizetype, sizeformat)
!
! def getargsCheck(self, name):
! Output("%s__len__ = %s__in_len__;", name, name)
!
! def passInput(self, name):
! return "%s__in__, %s__len__" % (name, name)
!
class ReverseInputBufferMixin:
! """ Mixin for input buffers that are passed as (size, buffer) """
!
! def passInput(self, name):
! return "%s__len__, %s__in__" % (name, name)
!
class OptionalVarInputBufferType(OptionalInputBufferMixIn, VarInputBufferType):
! pass
!
# ----- PART 2: Structure buffers -----
class StructInputOutputBufferType(FixedInputOutputBufferType):
!
! """Structure buffer -- passed as a structure pointer.
! Instantiate with the struct type as parameter.
! """
!
! def __init__(self, type):
! FixedInputOutputBufferType.__init__(self, "sizeof(%s)" % type)
! self.typeName = self.type = type
!
! def declareInputBuffer(self, name):
! Output("%s *%s__in__;", self.type, name)
!
! def declareSize(self, name):
! Output("int %s__in_len__;", name)
!
! def declareOutputBuffer(self, name):
! Output("%s %s__out__;", self.type, name)
!
! def getargsArgs(self, name):
! return "(char **)&%s__in__, &%s__in_len__" % (name, name)
!
! def transferSize(self, name):
! pass
!
! def passInput(self, name):
! return "%s__in__" % name
!
! def passOutput(self, name):
! return "%s__in__, &%s__out__" % (name, name)
!
! def mkvalueArgs(self, name):
! return "(char *)&%s__out__, (int)%s" % (name, self.size)
class StructCombinedInputOutputBufferType(StructInputOutputBufferType):
! """Like structure buffer -- but same parameter is input and output."""
!
! def passOutput(self, name):
! return "(%s *)memcpy((char *)%s__out__, (char *)%s__in__, %s)" % \
! (self.type, name, name, self.size)
class StructInputBufferType(InputOnlyBufferMixIn, StructInputOutputBufferType):
! """Fixed size input buffer -- passed as a pointer to a structure.
! Instantiate with the struct type as parameter.
! """
class StructByValueBufferType(StructInputBufferType):
! """Fixed size input buffer -- passed as a structure BY VALUE.
! Instantiate with the struct type as parameter.
! """
! def passInput(self, name):
! return "*%s__in__" % name
class StructOutputBufferType(OutputOnlyBufferMixIn, StructInputOutputBufferType):
! """Fixed size output buffer -- passed as a pointer to a structure.
! Instantiate with the struct type as parameter.
! """
!
! def declareSize(self, name):
! pass
! def passOutput(self, name):
! return "&%s__out__" % name
class ArrayOutputBufferType(OutputOnlyBufferMixIn, StructInputOutputBufferType):
! """Fixed size output buffer -- declared as a typedef, passed as an array.
! Instantiate with the struct type as parameter.
! """
!
! def declareSize(self, name):
! pass
! def passOutput(self, name):
! return "%s__out__" % name
--- 28,264 ----
class FixedInputOutputBufferType(InputOnlyType):
!
! """Fixed buffer -- passed as (inbuffer, outbuffer)."""
! def __init__(self, size, datatype = 'char', sizetype = 'int', sizeformat = None):
! self.typeName = "Buffer"
! self.size = str(size)
! self.datatype = datatype
! self.sizetype = sizetype
! self.sizeformat = sizeformat or type2format[sizetype]
! self.label_needed = 0
! def declare(self, name):
! self.declareBuffer(name)
! self.declareSize(name)
!
! def declareBuffer(self, name):
! self.declareInputBuffer(name)
! self.declareOutputBuffer(name)
!
! def declareInputBuffer(self, name):
! Output("%s *%s__in__;", self.datatype, name)
!
! def declareOutputBuffer(self, name):
! Output("%s %s__out__[%s];", self.datatype, name, self.size)
! def declareSize(self, name):
! Output("%s %s__len__;", self.sizetype, name)
! Output("int %s__in_len__;", name)
! def getargsFormat(self):
! return "s#"
! def getargsArgs(self, name):
! return "&%s__in__, &%s__in_len__" % (name, name)
!
! def getargsCheck(self, name):
! Output("if (%s__in_len__ != %s)", name, self.size)
! OutLbrace()
! Output('PyErr_SetString(PyExc_TypeError, "buffer length should be %s");',
! self.size)
! Output("goto %s__error__;", name)
! self.label_needed = 1
! OutRbrace()
! self.transferSize(name)
!
! def transferSize(self, name):
! Output("%s__len__ = %s__in_len__;", name, name)
! def passOutput(self, name):
! return "%s__in__, %s__out__" % (name, name)
!
! def mkvalueFormat(self):
! return "s#"
! def mkvalueArgs(self, name):
! return "%s__out__, (int)%s" % (name, self.size)
!
! def cleanup(self, name):
! if self.label_needed:
! DedentLevel()
! Output(" %s__error__: ;", name)
! IndentLevel()
class FixedCombinedInputOutputBufferType(FixedInputOutputBufferType):
!
! """Like fixed buffer -- but same parameter is input and output."""
!
! def passOutput(self, name):
! return "(%s *)memcpy(%s__out__, %s__in__, %s)" % \
! (self.datatype, name, name, self.size)
class InputOnlyBufferMixIn(InputOnlyMixIn):
! def declareOutputBuffer(self, name):
! pass
class OutputOnlyBufferMixIn(OutputOnlyMixIn):
! def declareInputBuffer(self, name):
! pass
class OptionalInputBufferMixIn:
!
! """Add to input buffers if the buffer may be omitted: pass None in Python
! and the C code will get a NULL pointer and zero size"""
!
! def getargsFormat(self):
! return "z#"
class FixedInputBufferType(InputOnlyBufferMixIn, FixedInputOutputBufferType):
! """Fixed size input buffer -- passed without size information.
! Instantiate with the size as parameter.
! """
! def passInput(self, name):
! return "%s__in__" % name
class OptionalFixedInputBufferType(OptionalInputBufferMixIn, FixedInputBufferType):
! pass
class FixedOutputBufferType(OutputOnlyBufferMixIn, FixedInputOutputBufferType):
! """Fixed size output buffer -- passed without size information.
! Instantiate with the size as parameter.
! """
! def passOutput(self, name):
! return "%s__out__" % name
class VarInputBufferType(FixedInputBufferType):
! """Variable size input buffer -- passed as (buffer, size).
!
! Instantiate without size parameter.
! """
!
! def __init__(self, datatype = 'char', sizetype = 'int', sizeformat = None):
! FixedInputBufferType.__init__(self, "0", datatype, sizetype, sizeformat)
!
! def getargsCheck(self, name):
! Output("%s__len__ = %s__in_len__;", name, name)
!
! def passInput(self, name):
! return "%s__in__, %s__len__" % (name, name)
!
class ReverseInputBufferMixin:
! """ Mixin for input buffers that are passed as (size, buffer) """
!
! def passInput(self, name):
! return "%s__len__, %s__in__" % (name, name)
!
class OptionalVarInputBufferType(OptionalInputBufferMixIn, VarInputBufferType):
! pass
!
# ----- PART 2: Structure buffers -----
class StructInputOutputBufferType(FixedInputOutputBufferType):
!
! """Structure buffer -- passed as a structure pointer.
! Instantiate with the struct type as parameter.
! """
!
! def __init__(self, type):
! FixedInputOutputBufferType.__init__(self, "sizeof(%s)" % type)
! self.typeName = self.type = type
!
! def declareInputBuffer(self, name):
! Output("%s *%s__in__;", self.type, name)
!
! def declareSize(self, name):
! Output("int %s__in_len__;", name)
!
! def declareOutputBuffer(self, name):
! Output("%s %s__out__;", self.type, name)
!
! def getargsArgs(self, name):
! return "(char **)&%s__in__, &%s__in_len__" % (name, name)
!
! def transferSize(self, name):
! pass
!
! def passInput(self, name):
! return "%s__in__" % name
!
! def passOutput(self, name):
! return "%s__in__, &%s__out__" % (name, name)
!
! def mkvalueArgs(self, name):
! return "(char *)&%s__out__, (int)%s" % (name, self.size)
class StructCombinedInputOutputBufferType(StructInputOutputBufferType):
! """Like structure buffer -- but same parameter is input and output."""
!
! def passOutput(self, name):
! return "(%s *)memcpy((char *)%s__out__, (char *)%s__in__, %s)" % \
! (self.type, name, name, self.size)
class StructInputBufferType(InputOnlyBufferMixIn, StructInputOutputBufferType):
! """Fixed size input buffer -- passed as a pointer to a structure.
! Instantiate with the struct type as parameter.
! """
class StructByValueBufferType(StructInputBufferType):
! """Fixed size input buffer -- passed as a structure BY VALUE.
! Instantiate with the struct type as parameter.
! """
! def passInput(self, name):
! return "*%s__in__" % name
class StructOutputBufferType(OutputOnlyBufferMixIn, StructInputOutputBufferType):
! """Fixed size output buffer -- passed as a pointer to a structure.
! Instantiate with the struct type as parameter.
! """
!
! def declareSize(self, name):
! pass
! def passOutput(self, name):
! return "&%s__out__" % name
class ArrayOutputBufferType(OutputOnlyBufferMixIn, StructInputOutputBufferType):
! """Fixed size output buffer -- declared as a typedef, passed as an array.
! Instantiate with the struct type as parameter.
! """
!
! def declareSize(self, name):
! pass
! def passOutput(self, name):
! return "%s__out__" % name
Index: bgenGenerator.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Tools/bgen/bgen/bgenGenerator.py,v
retrieving revision 1.14
retrieving revision 1.15
diff -C2 -d -r1.14 -r1.15
*** bgenGenerator.py 11 Sep 2002 20:36:00 -0000 1.14
--- bgenGenerator.py 19 Jan 2003 21:53:56 -0000 1.15
***************
*** 16,274 ****
class BaseFunctionGenerator:
! def __init__(self, name, condition=None):
! if DEBUG: print "<--", name
! self.name = name
! self.prefix = name
! self.objecttype = "PyObject" # Type of _self argument to function
! self.condition = condition
! def setprefix(self, prefix):
! self.prefix = prefix
! def generate(self):
! if DEBUG: print "-->", self.name
! if self.condition:
! Output()
! Output(self.condition)
! self.functionheader()
! self.functionbody()
! self.functiontrailer()
! if self.condition:
! Output("#endif")
! def functionheader(self):
! Output()
! Output("static PyObject *%s_%s(%s *_self, PyObject *_args)",
! self.prefix, self.name, self.objecttype)
! OutLbrace()
! Output("PyObject *_res = NULL;")
! def functionbody(self):
! Output("/* XXX To be provided */")
! def functiontrailer(self):
! OutRbrace()
! def reference(self, name = None):
! if name is None:
! name = self.name
! docstring = self.docstring()
! if self.condition:
! Output()
! Output(self.condition)
! Output("{\"%s\", (PyCFunction)%s_%s, 1,", name, self.prefix, self.name)
! Output(" PyDoc_STR(%s)},", stringify(docstring))
! if self.condition:
! Output("#endif")
! def docstring(self):
! return None
! def __cmp__(self, other):
! if not hasattr(other, 'name'):
! return cmp(id(self), id(other))
! return cmp(self.name, other.name)
_stringify_map = {'\n': '\\n', '\t': '\\t', '\r': '\\r', '\b': '\\b',
'\e': '\\e', '\a': '\\a', '\f': '\\f', '"': '\\"'}
def stringify(str):
! if str is None: return "NULL"
! res = '"'
! map = _stringify_map
! for c in str:
! if map.has_key(c): res = res + map[c]
! elif ' ' <= c <= '~': res = res + c
! else: res = res + '\\%03o' % ord(c)
! res = res + '"'
! return res
class ManualGenerator(BaseFunctionGenerator):
! def __init__(self, name, body, condition=None):
! BaseFunctionGenerator.__init__(self, name, condition=condition)
! self.body = body
! def functionbody(self):
! Output("%s", self.body)
!
! def setselftype(self, selftype, itselftype):
! self.objecttype = selftype
! self.itselftype = itselftype
class FunctionGenerator(BaseFunctionGenerator):
! def __init__(self, returntype, name, *argumentList, **conditionlist):
! BaseFunctionGenerator.__init__(self, name, **conditionlist)
! self.returntype = returntype
! self.argumentList = []
! self.setreturnvar()
! self.parseArgumentList(argumentList)
! self.prefix = "XXX" # Will be changed by setprefix() call
! self.itselftype = None # Type of _self->ob_itself, if defined
! def setreturnvar(self):
! if self.returntype:
! self.rv = self.makereturnvar()
! self.argumentList.append(self.rv)
! else:
! self.rv = None
!
! def makereturnvar(self):
! return Variable(self.returntype, "_rv", OutMode)
! def setselftype(self, selftype, itselftype):
! self.objecttype = selftype
! self.itselftype = itselftype
! def parseArgumentList(self, argumentList):
! iarg = 0
! for type, name, mode in argumentList:
! iarg = iarg + 1
! if name is None: name = "_arg%d" % iarg
! arg = Variable(type, name, mode)
! self.argumentList.append(arg)
!
! def docstring(self):
! input = []
! output = []
! for arg in self.argumentList:
! if arg.flags == ErrorMode or arg.flags == SelfMode:
! continue
! if arg.type == None:
! str = 'void'
! else:
! if hasattr(arg.type, 'typeName'):
! typeName = arg.type.typeName
! if typeName is None: # Suppressed type
! continue
! else:
! typeName = "?"
! print "Nameless type", arg.type
!
! str = typeName + ' ' + arg.name
! if arg.mode in (InMode, InOutMode):
! input.append(str)
! if arg.mode in (InOutMode, OutMode):
! output.append(str)
! if not input:
! instr = "()"
! else:
! instr = "(%s)" % ", ".join(input)
! if not output or output == ["void"]:
! outstr = "None"
! else:
! outstr = "(%s)" % ", ".join(output)
! return instr + " -> " + outstr
!
! def functionbody(self):
! self.declarations()
! self.precheck()
! self.getargs()
! self.callit()
! self.checkit()
! self.returnvalue()
! def declarations(self):
! for arg in self.argumentList:
! arg.declare()
! def getargs(self):
! fmt = ""
! lst = ""
! sep = ",\n" + ' '*len("if (!PyArg_ParseTuple(")
! for arg in self.argumentList:
! if arg.flags == SelfMode:
! continue
! if arg.mode in (InMode, InOutMode):
! fmt = fmt + arg.getargsFormat()
! args = arg.getargsArgs()
! if args:
! lst = lst + sep + args
! Output("if (!PyArg_ParseTuple(_args, \"%s\"%s))", fmt, lst)
! IndentLevel()
! Output("return NULL;")
! DedentLevel()
! for arg in self.argumentList:
! if arg.flags == SelfMode:
! continue
! if arg.mode in (InMode, InOutMode):
! arg.getargsCheck()
!
! def precheck(self):
! pass
! def callit(self):
! args = ""
! if self.rv:
! s = "%s = %s(" % (self.rv.name, self.name)
! else:
! s = "%s(" % self.name
! sep = ",\n" + ' '*len(s)
! for arg in self.argumentList:
! if arg is self.rv:
! continue
! s = arg.passArgument()
! if args: s = sep + s
! args = args + s
! if self.rv:
! Output("%s = %s(%s);",
! self.rv.name, self.name, args)
! else:
! Output("%s(%s);", self.name, args)
! def checkit(self):
! for arg in self.argumentList:
! arg.errorCheck()
! def returnvalue(self):
! fmt = ""
! lst = ""
! sep = ",\n" + ' '*len("return Py_BuildValue(")
! for arg in self.argumentList:
! if not arg: continue
! if arg.flags == ErrorMode: continue
! if arg.mode in (OutMode, InOutMode):
! fmt = fmt + arg.mkvalueFormat()
! lst = lst + sep + arg.mkvalueArgs()
! if fmt == "":
! Output("Py_INCREF(Py_None);")
! Output("_res = Py_None;");
! else:
! Output("_res = Py_BuildValue(\"%s\"%s);", fmt, lst)
! tmp = self.argumentList[:]
! tmp.reverse()
! for arg in tmp:
! if not arg: continue
! arg.cleanup()
! Output("return _res;")
class MethodGenerator(FunctionGenerator):
! def parseArgumentList(self, args):
! a0, args = args[0], args[1:]
! t0, n0, m0 = a0
! if m0 != InMode:
! raise ValueError, "method's 'self' must be 'InMode'"
! self.itself = Variable(t0, "_self->ob_itself", SelfMode)
! self.argumentList.append(self.itself)
! FunctionGenerator.parseArgumentList(self, args)
def _test():
! void = None
! eggs = FunctionGenerator(void, "eggs",
! (stringptr, 'cmd', InMode),
! (int, 'x', InMode),
! (double, 'y', InOutMode),
! (int, 'status', ErrorMode),
! )
! eggs.setprefix("spam")
! print "/* START */"
! eggs.generate()
if __name__ == "__main__":
! _test()
--- 16,274 ----
class BaseFunctionGenerator:
! def __init__(self, name, condition=None):
! if DEBUG: print "<--", name
! self.name = name
! self.prefix = name
! self.objecttype = "PyObject" # Type of _self argument to function
! self.condition = condition
! def setprefix(self, prefix):
! self.prefix = prefix
! def generate(self):
! if DEBUG: print "-->", self.name
! if self.condition:
! Output()
! Output(self.condition)
! self.functionheader()
! self.functionbody()
! self.functiontrailer()
! if self.condition:
! Output("#endif")
! def functionheader(self):
! Output()
! Output("static PyObject *%s_%s(%s *_self, PyObject *_args)",
! self.prefix, self.name, self.objecttype)
! OutLbrace()
! Output("PyObject *_res = NULL;")
! def functionbody(self):
! Output("/* XXX To be provided */")
! def functiontrailer(self):
! OutRbrace()
! def reference(self, name = None):
! if name is None:
! name = self.name
! docstring = self.docstring()
! if self.condition:
! Output()
! Output(self.condition)
! Output("{\"%s\", (PyCFunction)%s_%s, 1,", name, self.prefix, self.name)
! Output(" PyDoc_STR(%s)},", stringify(docstring))
! if self.condition:
! Output("#endif")
! def docstring(self):
! return None
! def __cmp__(self, other):
! if not hasattr(other, 'name'):
! return cmp(id(self), id(other))
! return cmp(self.name, other.name)
_stringify_map = {'\n': '\\n', '\t': '\\t', '\r': '\\r', '\b': '\\b',
'\e': '\\e', '\a': '\\a', '\f': '\\f', '"': '\\"'}
def stringify(str):
! if str is None: return "NULL"
! res = '"'
! map = _stringify_map
! for c in str:
! if map.has_key(c): res = res + map[c]
! elif ' ' <= c <= '~': res = res + c
! else: res = res + '\\%03o' % ord(c)
! res = res + '"'
! return res
class ManualGenerator(BaseFunctionGenerator):
! def __init__(self, name, body, condition=None):
! BaseFunctionGenerator.__init__(self, name, condition=condition)
! self.body = body
! def functionbody(self):
! Output("%s", self.body)
!
! def setselftype(self, selftype, itselftype):
! self.objecttype = selftype
! self.itselftype = itselftype
class FunctionGenerator(BaseFunctionGenerator):
! def __init__(self, returntype, name, *argumentList, **conditionlist):
! BaseFunctionGenerator.__init__(self, name, **conditionlist)
! self.returntype = returntype
! self.argumentList = []
! self.setreturnvar()
! self.parseArgumentList(argumentList)
! self.prefix = "XXX" # Will be changed by setprefix() call
! self.itselftype = None # Type of _self->ob_itself, if defined
! def setreturnvar(self):
! if self.returntype:
! self.rv = self.makereturnvar()
! self.argumentList.append(self.rv)
! else:
! self.rv = None
!
! def makereturnvar(self):
! return Variable(self.returntype, "_rv", OutMode)
! def setselftype(self, selftype, itselftype):
! self.objecttype = selftype
! self.itselftype = itselftype
! def parseArgumentList(self, argumentList):
! iarg = 0
! for type, name, mode in argumentList:
! iarg = iarg + 1
! if name is None: name = "_arg%d" % iarg
! arg = Variable(type, name, mode)
! self.argumentList.append(arg)
!
! def docstring(self):
! input = []
! output = []
! for arg in self.argumentList:
! if arg.flags == ErrorMode or arg.flags == SelfMode:
! continue
! if arg.type == None:
! str = 'void'
! else:
! if hasattr(arg.type, 'typeName'):
! typeName = arg.type.typeName
! if typeName is None: # Suppressed type
! continue
! else:
! typeName = "?"
! print "Nameless type", arg.type
!
! str = typeName + ' ' + arg.name
! if arg.mode in (InMode, InOutMode):
! input.append(str)
! if arg.mode in (InOutMode, OutMode):
! output.append(str)
! if not input:
! instr = "()"
! else:
! instr = "(%s)" % ", ".join(input)
! if not output or output == ["void"]:
! outstr = "None"
! else:
! outstr = "(%s)" % ", ".join(output)
! return instr + " -> " + outstr
!
! def functionbody(self):
! self.declarations()
! self.precheck()
! self.getargs()
! self.callit()
! self.checkit()
! self.returnvalue()
! def declarations(self):
! for arg in self.argumentList:
! arg.declare()
! def getargs(self):
! fmt = ""
! lst = ""
! sep = ",\n" + ' '*len("if (!PyArg_ParseTuple(")
! for arg in self.argumentList:
! if arg.flags == SelfMode:
! continue
! if arg.mode in (InMode, InOutMode):
! fmt = fmt + arg.getargsFormat()
! args = arg.getargsArgs()
! if args:
! lst = lst + sep + args
! Output("if (!PyArg_ParseTuple(_args, \"%s\"%s))", fmt, lst)
! IndentLevel()
! Output("return NULL;")
! DedentLevel()
! for arg in self.argumentList:
! if arg.flags == SelfMode:
! continue
! if arg.mode in (InMode, InOutMode):
! arg.getargsCheck()
!
! def precheck(self):
! pass
! def callit(self):
! args = ""
! if self.rv:
! s = "%s = %s(" % (self.rv.name, self.name)
! else:
! s = "%s(" % self.name
! sep = ",\n" + ' '*len(s)
! for arg in self.argumentList:
! if arg is self.rv:
! continue
! s = arg.passArgument()
! if args: s = sep + s
! args = args + s
! if self.rv:
! Output("%s = %s(%s);",
! self.rv.name, self.name, args)
! else:
! Output("%s(%s);", self.name, args)
! def checkit(self):
! for arg in self.argumentList:
! arg.errorCheck()
! def returnvalue(self):
! fmt = ""
! lst = ""
! sep = ",\n" + ' '*len("return Py_BuildValue(")
! for arg in self.argumentList:
! if not arg: continue
! if arg.flags == ErrorMode: continue
! if arg.mode in (OutMode, InOutMode):
! fmt = fmt + arg.mkvalueFormat()
! lst = lst + sep + arg.mkvalueArgs()
! if fmt == "":
! Output("Py_INCREF(Py_None);")
! Output("_res = Py_None;");
! else:
! Output("_res = Py_BuildValue(\"%s\"%s);", fmt, lst)
! tmp = self.argumentList[:]
! tmp.reverse()
! for arg in tmp:
! if not arg: continue
! arg.cleanup()
! Output("return _res;")
class MethodGenerator(FunctionGenerator):
! def parseArgumentList(self, args):
! a0, args = args[0], args[1:]
! t0, n0, m0 = a0
! if m0 != InMode:
! raise ValueError, "method's 'self' must be 'InMode'"
! self.itself = Variable(t0, "_self->ob_itself", SelfMode)
! self.argumentList.append(self.itself)
! FunctionGenerator.parseArgumentList(self, args)
def _test():
! void = None
! eggs = FunctionGenerator(void, "eggs",
! (stringptr, 'cmd', InMode),
! (int, 'x', InMode),
! (double, 'y', InOutMode),
! (int, 'status', ErrorMode),
! )
! eggs.setprefix("spam")
! print "/* START */"
! eggs.generate()
if __name__ == "__main__":
! _test()
Index: bgenGeneratorGroup.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Tools/bgen/bgen/bgenGeneratorGroup.py,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** bgenGeneratorGroup.py 27 Aug 2001 14:30:55 -0000 1.6
--- bgenGeneratorGroup.py 19 Jan 2003 21:53:56 -0000 1.7
***************
*** 3,40 ****
class GeneratorGroup:
! def __init__(self, prefix):
! self.prefix = prefix
! self.generators = []
! def add(self, g, dupcheck=0):
! if dupcheck:
! if g in self.generators:
! print 'DUP', g.name
! return
! g.setprefix(self.prefix)
! self.generators.append(g)
! def generate(self):
! for g in self.generators:
! g.generate()
! Output()
! Output("static PyMethodDef %s_methods[] = {", self.prefix)
! IndentLevel()
! for g in self.generators:
! g.reference()
! Output("{NULL, NULL, 0}")
! DedentLevel()
! Output("};")
def _test():
! void = None
! from bgenGenerator import FunctionGenerator
! group = GeneratorGroup("spam")
! eggs = FunctionGenerator(void, "eggs")
! group.add(eggs)
! print "/* START */"
! group.generate()
if __name__ == "__main__":
! _test()
--- 3,40 ----
class GeneratorGroup:
! def __init__(self, prefix):
! self.prefix = prefix
! self.generators = []
! def add(self, g, dupcheck=0):
! if dupcheck:
! if g in self.generators:
! print 'DUP', g.name
! return
! g.setprefix(self.prefix)
! self.generators.append(g)
! def generate(self):
! for g in self.generators:
! g.generate()
! Output()
! Output("static PyMethodDef %s_methods[] = {", self.prefix)
! IndentLevel()
! for g in self.generators:
! g.reference()
! Output("{NULL, NULL, 0}")
! DedentLevel()
! Output("};")
def _test():
! void = None
! from bgenGenerator import FunctionGenerator
! group = GeneratorGroup("spam")
! eggs = FunctionGenerator(void, "eggs")
! group.add(eggs)
! print "/* START */"
! group.generate()
if __name__ == "__main__":
! _test()
Index: bgenHeapBuffer.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Tools/bgen/bgen/bgenHeapBuffer.py,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** bgenHeapBuffer.py 5 Sep 2001 10:27:53 -0000 1.3
--- bgenHeapBuffer.py 19 Jan 2003 21:53:56 -0000 1.4
***************
*** 8,111 ****
class HeapInputOutputBufferType(FixedInputOutputBufferType):
! """Input-output buffer allocated on the heap -- passed as (inbuffer, outbuffer, size).
! Instantiate without parameters.
! Call from Python with input buffer.
! """
! def __init__(self, datatype = 'char', sizetype = 'int', sizeformat = None):
! FixedInputOutputBufferType.__init__(self, "0", datatype, sizetype, sizeformat)
! def declareOutputBuffer(self, name):
! Output("%s *%s__out__;", self.datatype, name)
! def getargsCheck(self, name):
! Output("if ((%s__out__ = malloc(%s__in_len__)) == NULL)", name, name)
! OutLbrace()
! Output('PyErr_NoMemory();')
! Output("goto %s__error__;", name)
! self.label_needed = 1
! OutRbrace()
! Output("%s__len__ = %s__in_len__;", name, name)
! def passOutput(self, name):
! return "%s__in__, %s__out__, (%s)%s__len__" % \
! (name, name, self.sizetype, name)
! def mkvalueArgs(self, name):
! return "%s__out__, (int)%s__len__" % (name, name)
! def cleanup(self, name):
! Output("free(%s__out__);", name)
! FixedInputOutputBufferType.cleanup(self, name)
class VarHeapInputOutputBufferType(HeapInputOutputBufferType):
! """same as base class, but passed as (inbuffer, outbuffer, &size)"""
!
! def passOutput(self, name):
! return "%s__in__, %s__out__, &%s__len__" % (name, name, name)
class HeapCombinedInputOutputBufferType(HeapInputOutputBufferType):
! """same as base class, but passed as (inoutbuffer, size)"""
!
! def passOutput(self, name):
! return "(%s *)memcpy(%s__out__, %s__in__, %s__len__)" % \
! (self.datatype, name, name, name)
class VarHeapCombinedInputOutputBufferType(HeapInputOutputBufferType):
! """same as base class, but passed as (inoutbuffer, &size)"""
!
! def passOutput(self, name):
! return "(%s *)memcpy(%s__out__, %s__in__, &%s__len__)" % \
! (self.datatype, name, name, name)
class HeapOutputBufferType(OutputOnlyMixIn, HeapInputOutputBufferType):
! """Output buffer allocated on the heap -- passed as (buffer, size).
! Instantiate without parameters.
! Call from Python with buffer size.
! """
!
! def declareInputBuffer(self, name):
! pass
!
! def getargsFormat(self):
! return "i"
!
! def getargsArgs(self, name):
! return "&%s__in_len__" % name
!
! def passOutput(self, name):
! return "%s__out__, %s__len__" % (name, name)
class VarHeapOutputBufferType(HeapOutputBufferType):
! """Output buffer allocated on the heap -- passed as (buffer, &size).
! Instantiate without parameters.
! Call from Python with buffer size.
! """
! def passOutput(self, name):
! return "%s__out__, &%s__len__" % (name, name)
class VarVarHeapOutputBufferType(VarHeapOutputBufferType):
! """Output buffer allocated on the heap -- passed as (buffer, size, &size).
! Instantiate without parameters.
! Call from Python with buffer size.
! """
! def passOutput(self, name):
! return "%s__out__, %s__len__, &%s__len__" % (name, name, name)
--- 8,111 ----
class HeapInputOutputBufferType(FixedInputOutputBufferType):
! """Input-output buffer allocated on the heap -- passed as (inbuffer, outbuffer, size).
! Instantiate without parameters.
! Call from Python with input buffer.
! """
! def __init__(self, datatype = 'char', sizetype = 'int', sizeformat = None):
! FixedInputOutputBufferType.__init__(self, "0", datatype, sizetype, sizeformat)
! def declareOutputBuffer(self, name):
! Output("%s *%s__out__;", self.datatype, name)
! def getargsCheck(self, name):
! Output("if ((%s__out__ = malloc(%s__in_len__)) == NULL)", name, name)
! OutLbrace()
! Output('PyErr_NoMemory();')
! Output("goto %s__error__;", name)
! self.label_needed = 1
! OutRbrace()
! Output("%s__len__ = %s__in_len__;", name, name)
! def passOutput(self, name):
! return "%s__in__, %s__out__, (%s)%s__len__" % \
! (name, name, self.sizetype, name)
! def mkvalueArgs(self, name):
! return "%s__out__, (int)%s__len__" % (name, name)
! def cleanup(self, name):
! Output("free(%s__out__);", name)
! FixedInputOutputBufferType.cleanup(self, name)
class VarHeapInputOutputBufferType(HeapInputOutputBufferType):
! """same as base class, but passed as (inbuffer, outbuffer, &size)"""
!
! def passOutput(self, name):
! return "%s__in__, %s__out__, &%s__len__" % (name, name, name)
class HeapCombinedInputOutputBufferType(HeapInputOutputBufferType):
! """same as base class, but passed as (inoutbuffer, size)"""
!
! def passOutput(self, name):
! return "(%s *)memcpy(%s__out__, %s__in__, %s__len__)" % \
! (self.datatype, name, name, name)
class VarHeapCombinedInputOutputBufferType(HeapInputOutputBufferType):
! """same as base class, but passed as (inoutbuffer, &size)"""
!
! def passOutput(self, name):
! return "(%s *)memcpy(%s__out__, %s__in__, &%s__len__)" % \
! (self.datatype, name, name, name)
class HeapOutputBufferType(OutputOnlyMixIn, HeapInputOutputBufferType):
! """Output buffer allocated on the heap -- passed as (buffer, size).
! Instantiate without parameters.
! Call from Python with buffer size.
! """
!
! def declareInputBuffer(self, name):
! pass
!
! def getargsFormat(self):
! return "i"
!
! def getargsArgs(self, name):
! return "&%s__in_len__" % name
!
! def passOutput(self, name):
! return "%s__out__, %s__len__" % (name, name)
class VarHeapOutputBufferType(HeapOutputBufferType):
! """Output buffer allocated on the heap -- passed as (buffer, &size).
! Instantiate without parameters.
! Call from Python with buffer size.
! """
! def passOutput(self, name):
! return "%s__out__, &%s__len__" % (name, name)
class VarVarHeapOutputBufferType(VarHeapOutputBufferType):
! """Output buffer allocated on the heap -- passed as (buffer, size, &size).
! Instantiate without parameters.
! Call from Python with buffer size.
! """
! def passOutput(self, name):
! return "%s__out__, %s__len__, &%s__len__" % (name, name, name)
Index: bgenModule.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Tools/bgen/bgen/bgenModule.py,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -d -r1.11 -r1.12
*** bgenModule.py 17 Dec 2002 22:08:48 -0000 1.11
--- bgenModule.py 19 Jan 2003 21:53:56 -0000 1.12
***************
*** 4,94 ****
class Module(GeneratorGroup):
! def __init__(self, name, prefix = None,
! includestuff = None,
! finalstuff = None,
! initstuff = None,
! variablestuff = None,
! longname = None):
! GeneratorGroup.__init__(self, prefix or name)
! self.name = name
! if longname:
! self.longname = longname
! else:
! self.longname = name
! self.includestuff = includestuff
! self.initstuff = initstuff
! self.finalstuff = finalstuff
! self.variablestuff = variablestuff
! self.typeobjects = []
! def addobject(self, od):
! self.generators.append(od)
! self.typeobjects.append(od)
! od.setmodulename(self.longname)
! def generate(self):
! OutHeader1("Module " + self.name)
! Output("#include \"Python.h\"")
! Output()
! if self.includestuff:
! Output()
! Output("%s", self.includestuff)
! self.declareModuleVariables()
! GeneratorGroup.generate(self)
!
! if self.finalstuff:
! Output()
! Output("%s", self.finalstuff)
! Output()
! Output("void init%s(void)", self.name)
! OutLbrace()
! Output("PyObject *m;")
! Output("PyObject *d;")
! Output()
! if self.initstuff:
! Output("%s", self.initstuff)
! Output()
! Output("m = Py_InitModule(\"%s\", %s_methods);",
! self.name, self.prefix)
! Output("d = PyModule_GetDict(m);")
! self.createModuleVariables()
! OutRbrace()
! OutHeader1("End module " + self.name)
! def declareModuleVariables(self):
! self.errorname = self.prefix + "_Error"
! Output("static PyObject *%s;", self.errorname)
! def createModuleVariables(self):
! Output("""%s = %s;""", self.errorname, self.exceptionInitializer())
! Output("""if (%s == NULL ||""", self.errorname)
! Output(""" PyDict_SetItemString(d, "Error", %s) != 0)""",
! self.errorname)
! IndentLevel()
! Output("""return;""")
! DedentLevel()
! for tp in self.typeobjects:
! tp.outputTypeObjectInitializer()
! if self.variablestuff:
! Output("%s", self.variablestuff)
! Output()
! def exceptionInitializer(self):
! return """PyErr_NewException("%s.Error", NULL, NULL)""" % self.name
def _test():
! from bgenGenerator import FunctionGenerator
! m = Module("spam", "", "#include <stdio.h>")
! g = FunctionGenerator(None, "bacon")
! m.add(g)
! m.generate()
if __name__ == "__main__":
! _test()
--- 4,94 ----
class Module(GeneratorGroup):
! def __init__(self, name, prefix = None,
! includestuff = None,
! finalstuff = None,
! initstuff = None,
! variablestuff = None,
! longname = None):
! GeneratorGroup.__init__(self, prefix or name)
! self.name = name
! if longname:
! self.longname = longname
! else:
! self.longname = name
! self.includestuff = includestuff
! self.initstuff = initstuff
! self.finalstuff = finalstuff
! self.variablestuff = variablestuff
! self.typeobjects = []
! def addobject(self, od):
! self.generators.append(od)
! self.typeobjects.append(od)
! od.setmodulename(self.longname)
! def generate(self):
! OutHeader1("Module " + self.name)
! Output("#include \"Python.h\"")
! Output()
! if self.includestuff:
! Output()
! Output("%s", self.includestuff)
! self.declareModuleVariables()
! GeneratorGroup.generate(self)
!
! if self.finalstuff:
! Output()
! Output("%s", self.finalstuff)
! Output()
! Output("void init%s(void)", self.name)
! OutLbrace()
! Output("PyObject *m;")
! Output("PyObject *d;")
! Output()
! if self.initstuff:
! Output("%s", self.initstuff)
! Output()
! Output("m = Py_InitModule(\"%s\", %s_methods);",
! self.name, self.prefix)
! Output("d = PyModule_GetDict(m);")
! self.createModuleVariables()
! OutRbrace()
! OutHeader1("End module " + self.name)
! def declareModuleVariables(self):
! self.errorname = self.prefix + "_Error"
! Output("static PyObject *%s;", self.errorname)
! def createModuleVariables(self):
! Output("""%s = %s;""", self.errorname, self.exceptionInitializer())
! Output("""if (%s == NULL ||""", self.errorname)
! Output(""" PyDict_SetItemString(d, "Error", %s) != 0)""",
! self.errorname)
! IndentLevel()
! Output("""return;""")
! DedentLevel()
! for tp in self.typeobjects:
! tp.outputTypeObjectInitializer()
! if self.variablestuff:
! Output("%s", self.variablestuff)
! Output()
! def exceptionInitializer(self):
! return """PyErr_NewException("%s.Error", NULL, NULL)""" % self.name
def _test():
! from bgenGenerator import FunctionGenerator
! m = Module("spam", "", "#include <stdio.h>")
! g = FunctionGenerator(None, "bacon")
! m.add(g)
! m.generate()
if __name__ == "__main__":
! _test()
Index: bgenObjectDefinition.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Tools/bgen/bgen/bgenObjectDefinition.py,v
retrieving revision 1.24
retrieving revision 1.25
diff -C2 -d -r1.24 -r1.25
*** bgenObjectDefinition.py 23 Dec 2002 22:33:49 -0000 1.24
--- bgenObjectDefinition.py 19 Jan 2003 21:53:56 -0000 1.25
***************
*** 3,486 ****
class ObjectDefinition(GeneratorGroup):
! "Spit out code that together defines a new Python object type"
! basechain = "NULL"
! tp_flags = "Py_TPFLAGS_DEFAULT"
! basetype = None
! def __init__(self, name, prefix, itselftype):
! """ObjectDefinition constructor. May be extended, but do not override.
!
! - name: the object's official name, e.g. 'SndChannel'.
! - prefix: the prefix used for the object's functions and data, e.g. 'SndCh'.
! - itselftype: the C type actually contained in the object, e.g. 'SndChannelPtr'.
!
! XXX For official Python data types, rules for the 'Py' prefix are a problem.
! """
!
! GeneratorGroup.__init__(self, prefix or name)
! self.name = name
! self.itselftype = itselftype
! self.objecttype = name + 'Object'
! self.typename = name + '_Type'
! self.argref = "" # set to "*" if arg to <type>_New should be pointer
! self.static = "static " # set to "" to make <type>_New and <type>_Convert public
! self.modulename = None
! if hasattr(self, "assertions"):
! self.assertions()
! def add(self, g, dupcheck=0):
! g.setselftype(self.objecttype, self.itselftype)
! GeneratorGroup.add(self, g, dupcheck)
! def reference(self):
! # In case we are referenced from a module
! pass
!
! def setmodulename(self, name):
! self.modulename = name
! def generate(self):
! # XXX This should use long strings and %(varname)s substitution!
! OutHeader2("Object type " + self.name)
! sf = self.static and "static "
! Output("%sPyTypeObject %s;", sf, self.typename)
! Output()
! Output("#define %s_Check(x) ((x)->ob_type == &%s || PyObject_TypeCheck((x), &%s))",
! self.prefix, self.typename, self.typename)
! Output()
! Output("typedef struct %s {", self.objecttype)
! IndentLevel()
! Output("PyObject_HEAD")
! self.outputStructMembers()
! DedentLevel()
! Output("} %s;", self.objecttype)
! self.outputNew()
!
! self.outputConvert()
! self.outputDealloc()
! GeneratorGroup.generate(self)
! Output()
! self.outputMethodChain()
! self.outputGetattr()
! self.outputSetattr()
!
! self.outputCompare()
!
! self.outputRepr()
!
! self.outputHash()
!
! self.outputPEP253Hooks()
!
! self.outputTypeObject()
! OutHeader2("End object type " + self.name)
!
! def outputMethodChain(self):
! Output("%sPyMethodChain %s_chain = { %s_methods, %s };",
! self.static, self.prefix, self.prefix, self.basechain)
! def outputStructMembers(self):
! Output("%s ob_itself;", self.itselftype)
! def outputNew(self):
! Output()
! Output("%sPyObject *%s_New(%s %sitself)", self.static, self.prefix,
! self.itselftype, self.argref)
! OutLbrace()
! Output("%s *it;", self.objecttype)
! self.outputCheckNewArg()
! Output("it = PyObject_NEW(%s, &%s);", self.objecttype, self.typename)
! Output("if (it == NULL) return NULL;")
! if self.basetype:
! Output("/* XXXX Should we tp_init or tp_new our basetype? */")
! self.outputInitStructMembers()
! Output("return (PyObject *)it;")
! OutRbrace()
! def outputInitStructMembers(self):
! Output("it->ob_itself = %sitself;", self.argref)
!
! def outputCheckNewArg(self):
! "Override this method to apply additional checks/conversions"
!
! def outputConvert(self):
! Output("%sint %s_Convert(PyObject *v, %s *p_itself)", self.static, self.prefix,
! self.itselftype)
! OutLbrace()
! self.outputCheckConvertArg()
! Output("if (!%s_Check(v))", self.prefix)
! OutLbrace()
! Output('PyErr_SetString(PyExc_TypeError, "%s required");', self.name)
! Output("return 0;")
! OutRbrace()
! Output("*p_itself = ((%s *)v)->ob_itself;", self.objecttype)
! Output("return 1;")
! OutRbrace()
! def outputCheckConvertArg(self):
! "Override this method to apply additional conversions"
! def outputDealloc(self):
! Output()
! Output("static void %s_dealloc(%s *self)", self.prefix, self.objecttype)
! OutLbrace()
! self.outputCleanupStructMembers()
! if self.basetype:
! Output("%s.tp_dealloc(self)", self.basetype)
! elif hasattr(self, 'output_tp_free'):
! # This is a new-style object with tp_free slot
! Output("self->ob_type->tp_free((PyObject *)self);")
! else:
! Output("PyObject_Free((PyObject *)self);")
! OutRbrace()
! def outputCleanupStructMembers(self):
! self.outputFreeIt("self->ob_itself")
! def outputFreeIt(self, name):
! Output("/* Cleanup of %s goes here */", name)
! def outputGetattr(self):
! Output()
! Output("static PyObject *%s_getattr(%s *self, char *name)", self.prefix, self.objecttype)
! OutLbrace()
! self.outputGetattrBody()
! OutRbrace()
! def outputGetattrBody(self):
! self.outputGetattrHook()
! Output("return Py_FindMethodInChain(&%s_chain, (PyObject *)self, name);",
! self.prefix)
! def outputGetattrHook(self):
! pass
! def outputSetattr(self):
! Output()
! Output("#define %s_setattr NULL", self.prefix)
! def outputCompare(self):
! Output()
! Output("#define %s_compare NULL", self.prefix)
! def outputRepr(self):
! Output()
! Output("#define %s_repr NULL", self.prefix)
! def outputHash(self):
! Output()
! Output("#define %s_hash NULL", self.prefix)
! def outputTypeObject(self):
! sf = self.static and "static "
! Output()
! Output("%sPyTypeObject %s = {", sf, self.typename)
! IndentLevel()
! Output("PyObject_HEAD_INIT(NULL)")
! Output("0, /*ob_size*/")
! if self.modulename:
! Output("\"%s.%s\", /*tp_name*/", self.modulename, self.name)
! else:
! Output("\"%s\", /*tp_name*/", self.name)
! Output("sizeof(%s), /*tp_basicsize*/", self.objecttype)
! Output("0, /*tp_itemsize*/")
! Output("/* methods */")
! Output("(destructor) %s_dealloc, /*tp_dealloc*/", self.prefix)
! Output("0, /*tp_print*/")
! Output("(getattrfunc) %s_getattr, /*tp_getattr*/", self.prefix)
! Output("(setattrfunc) %s_setattr, /*tp_setattr*/", self.prefix)
! Output("(cmpfunc) %s_compare, /*tp_compare*/", self.prefix)
! Output("(reprfunc) %s_repr, /*tp_repr*/", self.prefix)
! Output("(PyNumberMethods *)0, /* tp_as_number */")
! Output("(PySequenceMethods *)0, /* tp_as_sequence */")
! Output("(PyMappingMethods *)0, /* tp_as_mapping */")
! Output("(hashfunc) %s_hash, /*tp_hash*/", self.prefix)
! DedentLevel()
! Output("};")
!
! def outputTypeObjectInitializer(self):
! Output("""%s.ob_type = &PyType_Type;""", self.typename)
! if self.basetype:
! Output("%s.tp_base = %s;", self.typename, self.basetype)
! Output("if (PyType_Ready(&%s) < 0) return;", self.typename)
! Output("""Py_INCREF(&%s);""", self.typename)
! Output("PyModule_AddObject(m, \"%s\", (PyObject *)&%s);", self.name, self.typename);
! Output("/* Backward-compatible name */")
! Output("""Py_INCREF(&%s);""", self.typename);
! Output("PyModule_AddObject(m, \"%sType\", (PyObject *)&%s);", self.name, self.typename);
! def outputPEP253Hooks(self):
! pass
!
class PEP252Mixin:
! getsetlist = []
!
! def assertions(self):
! # Check that various things aren't overridden. If they are it could
! # signify a bgen-client that has been partially converted to PEP252.
! assert self.outputGetattr.im_func == PEP252Mixin.outputGetattr.im_func
! assert self.outputSetattr.im_func == PEP252Mixin.outputSetattr.im_func
! assert self.outputGetattrBody == None
! assert self.outputGetattrHook == None
! assert self.basechain == "NULL"
!
! def outputGetattr(self):
! pass
!
! outputGetattrBody = None
! outputGetattrHook = None
! def outputSetattr(self):
! pass
!
! def outputMethodChain(self):
! # This is a good place to output the getters and setters
! self.outputGetSetList()
!
! def outputHook(self, name):
! methodname = "outputHook_" + name
! if hasattr(self, methodname):
! func = getattr(self, methodname)
! func()
! else:
! Output("0, /*%s*/", name)
!
! def outputTypeObject(self):
! sf = self.static and "static "
! Output()
! Output("%sPyTypeObject %s = {", sf, self.typename)
! IndentLevel()
! Output("PyObject_HEAD_INIT(NULL)")
! Output("0, /*ob_size*/")
! if self.modulename:
! Output("\"%s.%s\", /*tp_name*/", self.modulename, self.name)
! else:
! Output("\"%s\", /*tp_name*/", self.name)
! Output("sizeof(%s), /*tp_basicsize*/", self.objecttype)
! Output("0, /*tp_itemsize*/")
!
! Output("/* methods */")
! Output("(destructor) %s_dealloc, /*tp_dealloc*/", self.prefix)
! Output("0, /*tp_print*/")
! Output("(getattrfunc)0, /*tp_getattr*/")
! Output("(setattrfunc)0, /*tp_setattr*/")
! Output("(cmpfunc) %s_compare, /*tp_compare*/", self.prefix)
! Output("(reprfunc) %s_repr, /*tp_repr*/", self.prefix)
!
! Output("(PyNumberMethods *)0, /* tp_as_number */")
! Output("(PySequenceMethods *)0, /* tp_as_sequence */")
! Output("(PyMappingMethods *)0, /* tp_as_mapping */")
!
! Output("(hashfunc) %s_hash, /*tp_hash*/", self.prefix)
! self.outputHook("tp_call")
! Output("0, /*tp_str*/")
! Output("PyObject_GenericGetAttr, /*tp_getattro*/")
! Output("PyObject_GenericSetAttr, /*tp_setattro */")
!
! self.outputHook("tp_as_buffer")
! Output("%s, /* tp_flags */", self.tp_flags)
! self.outputHook("tp_doc")
! self.outputHook("tp_traverse")
! self.outputHook("tp_clear")
! self.outputHook("tp_richcompare")
! self.outputHook("tp_weaklistoffset")
! self.outputHook("tp_iter")
! self.outputHook("tp_iternext")
! Output("%s_methods, /* tp_methods */", self.prefix)
! self.outputHook("tp_members")
! Output("%s_getsetlist, /*tp_getset*/", self.prefix)
! self.outputHook("tp_base")
! self.outputHook("tp_dict")
! self.outputHook("tp_descr_get")
! self.outputHook("tp_descr_set")
! self.outputHook("tp_dictoffset")
! self.outputHook("tp_init")
! self.outputHook("tp_alloc")
! self.outputHook("tp_new")
! self.outputHook("tp_free")
! DedentLevel()
! Output("};")
!
! def outputGetSetList(self):
! if self.getsetlist:
! for name, get, set, doc in self.getsetlist:
! if get:
! self.outputGetter(name, get)
! else:
! Output("#define %s_get_%s NULL", self.prefix, name)
! Output()
! if set:
! self.outputSetter(name, set)
! else:
! Output("#define %s_set_%s NULL", self.prefix, name)
! Output()
!
! Output("static PyGetSetDef %s_getsetlist[] = {", self.prefix)
! IndentLevel()
! for name, get, set, doc in self.getsetlist:
! if doc:
! doc = '"' + doc + '"'
! else:
! doc = "NULL"
! Output("{\"%s\", (getter)%s_get_%s, (setter)%s_set_%s, %s},",
! name, self.prefix, name, self.prefix, name, doc)
! Output("{NULL, NULL, NULL, NULL},")
! DedentLevel()
! Output("};")
! else:
! Output("#define %s_getsetlist NULL", self.prefix)
! Output()
!
! def outputGetter(self, name, code):
! Output("static PyObject *%s_get_%s(%s *self, void *closure)",
! self.prefix, name, self.objecttype)
! OutLbrace()
! Output(code)
! OutRbrace()
! Output()
!
! def outputSetter(self, name, code):
! Output("static int %s_set_%s(%s *self, PyObject *v, void *closure)",
! self.prefix, name, self.objecttype)
! OutLbrace()
! Output(code)
! Output("return 0;")
! OutRbrace()
! Output()
!
class PEP253Mixin(PEP252Mixin):
! tp_flags = "Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE"
!
! def outputHook_tp_init(self):
! Output("%s_tp_init, /* tp_init */", self.prefix)
!
! def outputHook_tp_alloc(self):
! Output("%s_tp_alloc, /* tp_alloc */", self.prefix)
!
! def outputHook_tp_new(self):
! Output("%s_tp_new, /* tp_new */", self.prefix)
!
! def outputHook_tp_free(self):
! Output("%s_tp_free, /* tp_free */", self.prefix)
!
! output_tp_initBody = None
!
! def output_tp_init(self):
! if self.output_tp_initBody:
! Output("static int %s_tp_init(PyObject *self, PyObject *args, PyObject *kwds)", self.prefix)
! OutLbrace()
! self.output_tp_initBody()
! OutRbrace()
! else:
! Output("#define %s_tp_init 0", self.prefix)
! Output()
!
! output_tp_allocBody = None
!
! def output_tp_alloc(self):
! if self.output_tp_allocBody:
! Output("static PyObject *%s_tp_alloc(PyTypeObject *type, int nitems)",
! self.prefix)
! OutLbrace()
! self.output_tp_allocBody()
! OutRbrace()
! else:
! Output("#define %s_tp_alloc PyType_GenericAlloc", self.prefix)
! Output()
!
! def output_tp_newBody(self):
! Output("PyObject *self;");
! Output("%s itself;", self.itselftype);
! Output("char *kw[] = {\"itself\", 0};")
! Output()
! Output("if (!PyArg_ParseTupleAndKeywords(args, kwds, \"O&\", kw, %s_Convert, &itself)) return NULL;",
! self.prefix);
! Output("if ((self = type->tp_alloc(type, 0)) == NULL) return NULL;")
! Output("((%s *)self)->ob_itself = itself;", self.objecttype)
! Output("return self;")
!
! def output_tp_new(self):
! if self.output_tp_newBody:
! Output("static PyObject *%s_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)", self.prefix)
! OutLbrace()
! self.output_tp_newBody()
! OutRbrace()
! else:
! Output("#define %s_tp_new PyType_GenericNew", self.prefix)
! Output()
!
! output_tp_freeBody = None
!
! def output_tp_free(self):
! if self.output_tp_freeBody:
! Output("static void %s_tp_free(PyObject *self)", self.prefix)
! OutLbrace()
! self.output_tp_freeBody()
! OutRbrace()
! else:
! Output("#define %s_tp_free PyObject_Del", self.prefix)
! Output()
!
! def outputPEP253Hooks(self):
! self.output_tp_init()
! self.output_tp_alloc()
! self.output_tp_new()
! self.output_tp_free()
class GlobalObjectDefinition(ObjectDefinition):
! """Like ObjectDefinition but exports some parts.
!
! XXX Should also somehow generate a .h file for them.
! """
! def __init__(self, name, prefix = None, itselftype = None):
! ObjectDefinition.__init__(self, name, prefix or name, itselftype or name)
! self.static = ""
class ObjectIdentityMixin:
! """A mixin class for objects that makes the identity of ob_itself
! govern comparisons and dictionary lookups. Useful if the C object can
! be returned by library calls and it is difficult (or impossible) to find
! the corresponding Python objects. With this you can create Python object
! wrappers on the fly"""
!
! def outputCompare(self):
! Output()
! Output("static int %s_compare(%s *self, %s *other)", self.prefix, self.objecttype,
! self.objecttype)
! OutLbrace()
! Output("unsigned long v, w;")
! Output()
! Output("if (!%s_Check((PyObject *)other))", self.prefix)
! OutLbrace()
! Output("v=(unsigned long)self;")
! Output("w=(unsigned long)other;")
! OutRbrace()
! Output("else")
! OutLbrace()
! Output("v=(unsigned long)self->ob_itself;")
! Output("w=(unsigned long)other->ob_itself;")
! OutRbrace()
! Output("if( v < w ) return -1;")
! Output("if( v > w ) return 1;")
! Output("return 0;")
! OutRbrace()
!
! def outputHash(self):
! Output()
! Output("static long %s_hash(%s *self)", self.prefix, self.objecttype)
! OutLbrace()
! Output("return (long)self->ob_itself;")
! OutRbrace()
!
--- 3,486 ----
class ObjectDefinition(GeneratorGroup):
! "Spit out code that together defines a new Python object type"
! basechain = "NULL"
! tp_flags = "Py_TPFLAGS_DEFAULT"
! basetype = None
! def __init__(self, name, prefix, itselftype):
! """ObjectDefinition constructor. May be extended, but do not override.
!
! - name: the object's official name, e.g. 'SndChannel'.
! - prefix: the prefix used for the object's functions and data, e.g. 'SndCh'.
! - itselftype: the C type actually contained in the object, e.g. 'SndChannelPtr'.
!
! XXX For official Python data types, rules for the 'Py' prefix are a problem.
! """
!
! GeneratorGroup.__init__(self, prefix or name)
! self.name = name
! self.itselftype = itselftype
! self.objecttype = name + 'Object'
! self.typename = name + '_Type'
! self.argref = "" # set to "*" if arg to <type>_New should be pointer
! self.static = "static " # set to "" to make <type>_New and <type>_Convert public
! self.modulename = None
! if hasattr(self, "assertions"):
! self.assertions()
! def add(self, g, dupcheck=0):
! g.setselftype(self.objecttype, self.itselftype)
! GeneratorGroup.add(self, g, dupcheck)
! def reference(self):
! # In case we are referenced from a module
! pass
!
! def setmodulename(self, name):
! self.modulename = name
! def generate(self):
! # XXX This should use long strings and %(varname)s substitution!
! OutHeader2("Object type " + self.name)
! sf = self.static and "static "
! Output("%sPyTypeObject %s;", sf, self.typename)
! Output()
! Output("#define %s_Check(x) ((x)->ob_type == &%s || PyObject_TypeCheck((x), &%s))",
! self.prefix, self.typename, self.typename)
! Output()
! Output("typedef struct %s {", self.objecttype)
! IndentLevel()
! Output("PyObject_HEAD")
! self.outputStructMembers()
! DedentLevel()
! Output("} %s;", self.objecttype)
! self.outputNew()
!
! self.outputConvert()
! self.outputDealloc()
! GeneratorGroup.generate(self)
! Output()
! self.outputMethodChain()
! self.outputGetattr()
! self.outputSetattr()
!
! self.outputCompare()
!
! self.outputRepr()
!
! self.outputHash()
!
! self.outputPEP253Hooks()
!
! self.outputTypeObject()
! OutHeader2("End object type " + self.name)
!
! def outputMethodChain(self):
! Output("%sPyMethodChain %s_chain = { %s_methods, %s };",
! self.static, self.prefix, self.prefix, self.basechain)
! def outputStructMembers(self):
! Output("%s ob_itself;", self.itselftype)
! def outputNew(self):
! Output()
! Output("%sPyObject *%s_New(%s %sitself)", self.static, self.prefix,
! self.itselftype, self.argref)
! OutLbrace()
! Output("%s *it;", self.objecttype)
! self.outputCheckNewArg()
! Output("it = PyObject_NEW(%s, &%s);", self.objecttype, self.typename)
! Output("if (it == NULL) return NULL;")
! if self.basetype:
! Output("/* XXXX Should we tp_init or tp_new our basetype? */")
! self.outputInitStructMembers()
! Output("return (PyObject *)it;")
! OutRbrace()
! def outputInitStructMembers(self):
! Output("it->ob_itself = %sitself;", self.argref)
!
! def outputCheckNewArg(self):
! "Override this method to apply additional checks/conversions"
!
! def outputConvert(self):
! Output("%sint %s_Convert(PyObject *v, %s *p_itself)", self.static, self.prefix,
! self.itselftype)
! OutLbrace()
! self.outputCheckConvertArg()
! Output("if (!%s_Check(v))", self.prefix)
! OutLbrace()
! Output('PyErr_SetString(PyExc_TypeError, "%s required");', self.name)
! Output("return 0;")
! OutRbrace()
! Output("*p_itself = ((%s *)v)->ob_itself;", self.objecttype)
! Output("return 1;")
! OutRbrace()
! def outputCheckConvertArg(self):
! "Override this method to apply additional conversions"
! def outputDealloc(self):
! Output()
! Output("static void %s_dealloc(%s *self)", self.prefix, self.objecttype)
! OutLbrace()
! self.outputCleanupStructMembers()
! if self.basetype:
! Output("%s.tp_dealloc(self)", self.basetype)
! elif hasattr(self, 'output_tp_free'):
! # This is a new-style object with tp_free slot
! Output("self->ob_type->tp_free((PyObject *)self);")
! else:
! Output("PyObject_Free((PyObject *)self);")
! OutRbrace()
! def outputCleanupStructMembers(self):
! self.outputFreeIt("self->ob_itself")
! def outputFreeIt(self, name):
! Output("/* Cleanup of %s goes here */", name)
! def outputGetattr(self):
! Output()
! Output("static PyObject *%s_getattr(%s *self, char *name)", self.prefix, self.objecttype)
! OutLbrace()
! self.outputGetattrBody()
! OutRbrace()
! def outputGetattrBody(self):
! self.outputGetattrHook()
! Output("return Py_FindMethodInChain(&%s_chain, (PyObject *)self, name);",
! self.prefix)
! def outputGetattrHook(self):
! pass
! def outputSetattr(self):
! Output()
! Output("#define %s_setattr NULL", self.prefix)
! def outputCompare(self):
! Output()
! Output("#define %s_compare NULL", self.prefix)
! def outputRepr(self):
! Output()
! Output("#define %s_repr NULL", self.prefix)
! def outputHash(self):
! Output()
! Output("#define %s_hash NULL", self.prefix)
! def outputTypeObject(self):
! sf = self.static and "static "
! Output()
! Output("%sPyTypeObject %s = {", sf, self.typename)
! IndentLevel()
! Output("PyObject_HEAD_INIT(NULL)")
! Output("0, /*ob_size*/")
! if self.modulename:
! Output("\"%s.%s\", /*tp_name*/", self.modulename, self.name)
! else:
! Output("\"%s\", /*tp_name*/", self.name)
! Output("sizeof(%s), /*tp_basicsize*/", self.objecttype)
! Output("0, /*tp_itemsize*/")
! Output("/* methods */")
! Output("(destructor) %s_dealloc, /*tp_dealloc*/", self.prefix)
! Output("0, /*tp_print*/")
! Output("(getattrfunc) %s_getattr, /*tp_getattr*/", self.prefix)
! Output("(setattrfunc) %s_setattr, /*tp_setattr*/", self.prefix)
! Output("(cmpfunc) %s_compare, /*tp_compare*/", self.prefix)
! Output("(reprfunc) %s_repr, /*tp_repr*/", self.prefix)
! Output("(PyNumberMethods *)0, /* tp_as_number */")
! Output("(PySequenceMethods *)0, /* tp_as_sequence */")
! Output("(PyMappingMethods *)0, /* tp_as_mapping */")
! Output("(hashfunc) %s_hash, /*tp_hash*/", self.prefix)
! DedentLevel()
! Output("};")
!
! def outputTypeObjectInitializer(self):
! Output("""%s.ob_type = &PyType_Type;""", self.typename)
! if self.basetype:
! Output("%s.tp_base = %s;", self.typename, self.basetype)
! Output("if (PyType_Ready(&%s) < 0) return;", self.typename)
! Output("""Py_INCREF(&%s);""", self.typename)
! Output("PyModule_AddObject(m, \"%s\", (PyObject *)&%s);", self.name, self.typename);
! Output("/* Backward-compatible name */")
! Output("""Py_INCREF(&%s);""", self.typename);
! Output("PyModule_AddObject(m, \"%sType\", (PyObject *)&%s);", self.name, self.typename);
! def outputPEP253Hooks(self):
! pass
!
class PEP252Mixin:
! getsetlist = []
!
! def assertions(self):
! # Check that various things aren't overridden. If they are it could
! # signify a bgen-client that has been partially converted to PEP252.
! assert self.outputGetattr.im_func == PEP252Mixin.outputGetattr.im_func
! assert self.outputSetattr.im_func == PEP252Mixin.outputSetattr.im_func
! assert self.outputGetattrBody == None
! assert self.outputGetattrHook == None
! assert self.basechain == "NULL"
!
! def outputGetattr(self):
! pass
!
! outputGetattrBody = None
! outputGetattrHook = None
! def outputSetattr(self):
! pass
!
! def outputMethodChain(self):
! # This is a good place to output the getters and setters
! self.outputGetSetList()
!
! def outputHook(self, name):
! methodname = "outputHook_" + name
! if hasattr(self, methodname):
! func = getattr(self, methodname)
! func()
! else:
! Output("0, /*%s*/", name)
!
! def outputTypeObject(self):
! sf = self.static and "static "
! Output()
! Output("%sPyTypeObject %s = {", sf, self.typename)
! IndentLevel()
! Output("PyObject_HEAD_INIT(NULL)")
! Output("0, /*ob_size*/")
! if self.modulename:
! Output("\"%s.%s\", /*tp_name*/", self.modulename, self.name)
! else:
! Output("\"%s\", /*tp_name*/", self.name)
! Output("sizeof(%s), /*tp_basicsize*/", self.objecttype)
! Output("0, /*tp_itemsize*/")
!
! Output("/* methods */")
! Output("(destructor) %s_dealloc, /*tp_dealloc*/", self.prefix)
! Output("0, /*tp_print*/")
! Output("(getattrfunc)0, /*tp_getattr*/")
! Output("(setattrfunc)0, /*tp_setattr*/")
! Output("(cmpfunc) %s_compare, /*tp_compare*/", self.prefix)
! Output("(reprfunc) %s_repr, /*tp_repr*/", self.prefix)
!
! Output("(PyNumberMethods *)0, /* tp_as_number */")
! Output("(PySequenceMethods *)0, /* tp_as_sequence */")
! Output("(PyMappingMethods *)0, /* tp_as_mapping */")
!
! Output("(hashfunc) %s_hash, /*tp_hash*/", self.prefix)
! self.outputHook("tp_call")
! Output("0, /*tp_str*/")
! Output("PyObject_GenericGetAttr, /*tp_getattro*/")
! Output("PyObject_GenericSetAttr, /*tp_setattro */")
!
! self.outputHook("tp_as_buffer")
! Output("%s, /* tp_flags */", self.tp_flags)
! self.outputHook("tp_doc")
! self.outputHook("tp_traverse")
! self.outputHook("tp_clear")
! self.outputHook("tp_richcompare")
! self.outputHook("tp_weaklistoffset")
! self.outputHook("tp_iter")
! self.outputHook("tp_iternext")
! Output("%s_methods, /* tp_methods */", self.prefix)
! self.outputHook("tp_members")
! Output("%s_getsetlist, /*tp_getset*/", self.prefix)
! self.outputHook("tp_base")
! self.outputHook("tp_dict")
! self.outputHook("tp_descr_get")
! self.outputHook("tp_descr_set")
! self.outputHook("tp_dictoffset")
! self.outputHook("tp_init")
! self.outputHook("tp_alloc")
! self.outputHook("tp_new")
! self.outputHook("tp_free")
! DedentLevel()
! Output("};")
!
! def outputGetSetList(self):
! if self.getsetlist:
! for name, get, set, doc in self.getsetlist:
! if get:
! self.outputGetter(name, get)
! else:
! Output("#define %s_get_%s NULL", self.prefix, name)
! Output()
! if set:
! self.outputSetter(name, set)
! else:
! Output("#define %s_set_%s NULL", self.prefix, name)
! Output()
!
! Output("static PyGetSetDef %s_getsetlist[] = {", self.prefix)
! IndentLevel()
! for name, get, set, doc in self.getsetlist:
! if doc:
! doc = '"' + doc + '"'
! else:
! doc = "NULL"
! Output("{\"%s\", (getter)%s_get_%s, (setter)%s_set_%s, %s},",
! name, self.prefix, name, self.prefix, name, doc)
! Output("{NULL, NULL, NULL, NULL},")
! DedentLevel()
! Output("};")
! else:
! Output("#define %s_getsetlist NULL", self.prefix)
! Output()
!
! def outputGetter(self, name, code):
! Output("static PyObject *%s_get_%s(%s *self, void *closure)",
! self.prefix, name, self.objecttype)
! OutLbrace()
! Output(code)
! OutRbrace()
! Output()
!
! def outputSetter(self, name, code):
! Output("static int %s_set_%s(%s *self, PyObject *v, void *closure)",
! self.prefix, name, self.objecttype)
! OutLbrace()
! Output(code)
! Output("return 0;")
! OutRbrace()
! Output()
!
class PEP253Mixin(PEP252Mixin):
! tp_flags = "Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE"
!
! def outputHook_tp_init(self):
! Output("%s_tp_init, /* tp_init */", self.prefix)
!
! def outputHook_tp_alloc(self):
! Output("%s_tp_alloc, /* tp_alloc */", self.prefix)
!
! def outputHook_tp_new(self):
! Output("%s_tp_new, /* tp_new */", self.prefix)
!
! def outputHook_tp_free(self):
! Output("%s_tp_free, /* tp_free */", self.prefix)
!
! output_tp_initBody = None
!
! def output_tp_init(self):
! if self.output_tp_initBody:
! Output("static int %s_tp_init(PyObject *self, PyObject *args, PyObject *kwds)", self.prefix)
! OutLbrace()
! self.output_tp_initBody()
! OutRbrace()
! else:
! Output("#define %s_tp_init 0", self.prefix)
! Output()
!
! output_tp_allocBody = None
!
! def output_tp_alloc(self):
! if self.output_tp_allocBody:
! Output("static PyObject *%s_tp_alloc(PyTypeObject *type, int nitems)",
! self.prefix)
! OutLbrace()
! self.output_tp_allocBody()
! OutRbrace()
! else:
! Output("#define %s_tp_alloc PyType_GenericAlloc", self.prefix)
! Output()
!
! def output_tp_newBody(self):
! Output("PyObject *self;");
! Output("%s itself;", self.itselftype);
! Output("char *kw[] = {\"itself\", 0};")
! Output()
! Output("if (!PyArg_ParseTupleAndKeywords(args, kwds, \"O&\", kw, %s_Convert, &itself)) return NULL;",
! self.prefix);
! Output("if ((self = type->tp_alloc(type, 0)) == NULL) return NULL;")
! Output("((%s *)self)->ob_itself = itself;", self.objecttype)
! Output("return self;")
!
! def output_tp_new(self):
! if self.output_tp_newBody:
! Output("static PyObject *%s_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)", self.prefix)
! OutLbrace()
! self.output_tp_newBody()
! OutRbrace()
! else:
! Output("#define %s_tp_new PyType_GenericNew", self.prefix)
! Output()
!
! output_tp_freeBody = None
!
! def output_tp_free(self):
! if self.output_tp_freeBody:
! Output("static void %s_tp_free(PyObject *self)", self.prefix)
! OutLbrace()
! self.output_tp_freeBody()
! OutRbrace()
! else:
! Output("#define %s_tp_free PyObject_Del", self.prefix)
! Output()
!
! def outputPEP253Hooks(self):
! self.output_tp_init()
! self.output_tp_alloc()
! self.output_tp_new()
! self.output_tp_free()
class GlobalObjectDefinition(ObjectDefinition):
! """Like ObjectDefinition but exports some parts.
!
! XXX Should also somehow generate a .h file for them.
! """
! def __init__(self, name, prefix = None, itselftype = None):
! ObjectDefinition.__init__(self, name, prefix or name, itselftype or name)
! self.static = ""
class ObjectIdentityMixin:
! """A mixin class for objects that makes the identity of ob_itself
! govern comparisons and dictionary lookups. Useful if the C object can
! be returned by library calls and it is difficult (or impossible) to find
! the corresponding Python objects. With this you can create Python object
! wrappers on the fly"""
!
! def outputCompare(self):
! Output()
! Output("static int %s_compare(%s *self, %s *other)", self.prefix, self.objecttype,
! self.objecttype)
! OutLbrace()
! Output("unsigned long v, w;")
! Output()
! Output("if (!%s_Check((PyObject *)other))", self.prefix)
! OutLbrace()
! Output("v=(unsigned long)self;")
! Output("w=(unsigned long)other;")
! OutRbrace()
! Output("else")
! OutLbrace()
! Output("v=(unsigned long)self->ob_itself;")
! Output("w=(unsigned long)other->ob_itself;")
! OutRbrace()
! Output("if( v < w ) return -1;")
! Output("if( v > w ) return 1;")
! Output("return 0;")
! OutRbrace()
!
! def outputHash(self):
! Output()
! Output("static long %s_hash(%s *self)", self.prefix, self.objecttype)
! OutLbrace()
! Output("return (long)self->ob_itself;")
! OutRbrace()
!
Index: bgenOutput.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Tools/bgen/bgen/bgenOutput.py,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** bgenOutput.py 11 Sep 2002 20:36:00 -0000 1.4
--- bgenOutput.py 19 Jan 2003 21:53:57 -0000 1.5
***************
*** 10,206 ****
def SetOutputFile(file = None, needclose = 0):
! """Call this with an open file object to make it the output file.
! Call it without arguments to close the current file (if necessary)
! and reset it to sys.stdout.
! If the second argument is true, the new file will be explicitly closed
! on a subsequence call.
! """
! global _File, _NeedClose
! if _NeedClose:
! tmp = _File
! _NeedClose = 0
! _File = None
! tmp.close()
! if file is None:
! import sys
! file = sys.stdout
! _File = file
! _NeedClose = file and needclose
def SetOutputFileName(filename = None):
! """Call this with a filename to make it the output file.
!
! Call it without arguments to close the current file (if necessary)
! and reset it to sys.stdout.
! """
! SetOutputFile()
! if filename:
! SetOutputFile(open(filename, 'w'), 1)
! SetOutputFile() # Initialize _File
! _Level = 0 # Indentation level
def GetLevel():
! """Return the current indentation level."""
! return _Level
def SetLevel(level):
! """Set the current indentation level.
! This does no type or range checking -- use at own risk.
! """
! global _Level
! _Level = level
def Output(format = "", *args):
! VaOutput(format, args)
def VaOutput(format, args):
! """Call this with a format string and and argument tuple for the format.
! A newline is always added. Each line in the output is indented
! to the proper indentation level -- even if the result of the
! format expansion contains embedded newlines. Exception: lines
! beginning with '#' are not indented -- these are assumed to be
! C preprprocessor lines.
! """
! text = format % args
! if _Level > 0:
! indent = '\t' * _Level
! lines = text.split('\n')
! for i in range(len(lines)):
! if lines[i] and lines[i][0] != '#':
! lines[i] = indent + lines[i]
! text = '\n'.join(lines)
! _File.write(text + '\n')
def IndentLevel(by = 1):
! """Increment the indentation level by one.
! When called with an argument, adds it to the indentation level.
! """
! global _Level
! if _Level+by < 0:
! raise Error, "indentation underflow (internal error)"
! _Level = _Level + by
def DedentLevel(by = 1):
! """Decrement the indentation level by one.
! When called with an argument, subtracts it from the indentation level.
! """
! IndentLevel(-by)
def OutIndent(format = "", *args):
! """Combine Output() followed by IndentLevel().
!
! If no text is given, acts like lone IndentLevel().
! """
! if format: VaOutput(format, args)
! IndentLevel()
def OutDedent(format = "", *args):
! """Combine Output() followed by DedentLevel().
!
! If no text is given, acts like loneDedentLevel().
! """
! if format: VaOutput(format, args)
! DedentLevel()
def OutLbrace(format = "", *args):
! """Like Output, but add a '{' and increase the indentation level.
!
! If no text is given a lone '{' is output.
! """
! if format:
! format = format + " {"
! else:
! format = "{"
! VaOutput(format, args)
! IndentLevel()
def OutRbrace():
! """Decrease the indentation level and output a '}' on a line by itself."""
! DedentLevel()
! Output("}")
def OutHeader(text, dash):
! """Output a header comment using a given dash character."""
! n = 64 - len(text)
! Output()
! Output("/* %s %s %s */", dash * (n/2), text, dash * (n - n/2))
! Output()
def OutHeader1(text):
! """Output a level 1 header comment (uses '=' dashes)."""
! OutHeader(text, "=")
def OutHeader2(text):
! """Output a level 2 header comment (uses '-' dashes)."""
! OutHeader(text, "-")
def Out(text):
! """Output multiline text that's internally indented.
!
! Pass this a multiline character string. The whitespace before the
! first nonblank line of the string will be subtracted from all lines.
! The lines are then output using Output(), but without interpretation
! of formatting (if you need formatting you can do it before the call).
! Recommended use:
!
! Out('''
! int main(argc, argv)
! int argc;
! char *argv;
! {
! printf("Hello, world\\n");
! exit(0);
! }
! ''')
!
! Caveat: the indentation must be consistent -- if you use three tabs
! in the first line, (up to) three tabs are removed from following lines,
! but a line beginning with 24 spaces is not trimmed at all. Don't use
! this as a feature.
! """
! # (Don't you love using triple quotes *inside* triple quotes? :-)
!
! lines = text.split('\n')
! indent = ""
! for line in lines:
! if line.strip():
! for c in line:
! if not c.isspace():
! break
! indent = indent + c
! break
! n = len(indent)
! for line in lines:
! if line[:n] == indent:
! line = line[n:]
! else:
! for c in indent:
! if line[:1] <> c: break
! line = line[1:]
! VaOutput("%s", line)
def _test():
! """Test program. Run when the module is run as a script."""
! OutHeader1("test bgenOutput")
! Out("""
! #include <Python.h>
! #include <stdio.h>
!
! main(argc, argv)
! int argc;
! char **argv;
! {
! int i;
! """)
! IndentLevel()
! Output("""\
/* Here are a few comment lines.
Just to test indenting multiple lines.
--- 10,206 ----
def SetOutputFile(file = None, needclose = 0):
! """Call this with an open file object to make it the output file.
! Call it without arguments to close the current file (if necessary)
! and reset it to sys.stdout.
! If the second argument is true, the new file will be explicitly closed
! on a subsequence call.
! """
! global _File, _NeedClose
! if _NeedClose:
! tmp = _File
! _NeedClose = 0
! _File = None
! tmp.close()
! if file is None:
! import sys
! file = sys.stdout
! _File = file
! _NeedClose = file and needclose
def SetOutputFileName(filename = None):
! """Call this with a filename to make it the output file.
!
! Call it without arguments to close the current file (if necessary)
! and reset it to sys.stdout.
! """
! SetOutputFile()
! if filename:
! SetOutputFile(open(filename, 'w'), 1)
! SetOutputFile() # Initialize _File
! _Level = 0 # Indentation level
def GetLevel():
! """Return the current indentation level."""
! return _Level
def SetLevel(level):
! """Set the current indentation level.
! This does no type or range checking -- use at own risk.
! """
! global _Level
! _Level = level
def Output(format = "", *args):
! VaOutput(format, args)
def VaOutput(format, args):
! """Call this with a format string and and argument tuple for the format.
! A newline is always added. Each line in the output is indented
! to the proper indentation level -- even if the result of the
! format expansion contains embedded newlines. Exception: lines
! beginning with '#' are not indented -- these are assumed to be
! C preprprocessor lines.
! """
! text = format % args
! if _Level > 0:
! indent = '\t' * _Level
! lines = text.split('\n')
! for i in range(len(lines)):
! if lines[i] and lines[i][0] != '#':
! lines[i] = indent + lines[i]
! text = '\n'.join(lines)
! _File.write(text + '\n')
def IndentLevel(by = 1):
! """Increment the indentation level by one.
! When called with an argument, adds it to the indentation level.
! """
! global _Level
! if _Level+by < 0:
! raise Error, "indentation underflow (internal error)"
! _Level = _Level + by
def DedentLevel(by = 1):
! """Decrement the indentation level by one.
! When called with an argument, subtracts it from the indentation level.
! """
! IndentLevel(-by)
def OutIndent(format = "", *args):
! """Combine Output() followed by IndentLevel().
!
! If no text is given, acts like lone IndentLevel().
! """
! if format: VaOutput(format, args)
! IndentLevel()
def OutDedent(format = "", *args):
! """Combine Output() followed by DedentLevel().
!
! If no text is given, acts like loneDedentLevel().
! """
! if format: VaOutput(format, args)
! DedentLevel()
def OutLbrace(format = "", *args):
! """Like Output, but add a '{' and increase the indentation level.
!
! If no text is given a lone '{' is output.
! """
! if format:
! format = format + " {"
! else:
! format = "{"
! VaOutput(format, args)
! IndentLevel()
def OutRbrace():
! """Decrease the indentation level and output a '}' on a line by itself."""
! DedentLevel()
! Output("}")
def OutHeader(text, dash):
! """Output a header comment using a given dash character."""
! n = 64 - len(text)
! Output()
! Output("/* %s %s %s */", dash * (n/2), text, dash * (n - n/2))
! Output()
def OutHeader1(text):
! """Output a level 1 header comment (uses '=' dashes)."""
! OutHeader(text, "=")
def OutHeader2(text):
! """Output a level 2 header comment (uses '-' dashes)."""
! OutHeader(text, "-")
def Out(text):
! """Output multiline text that's internally indented.
!
! Pass this a multiline character string. The whitespace before the
! first nonblank line of the string will be subtracted from all lines.
! The lines are then output using Output(), but without interpretation
! of formatting (if you need formatting you can do it before the call).
! Recommended use:
!
! Out('''
! int main(argc, argv)
! int argc;
! char *argv;
! {
! printf("Hello, world\\n");
! exit(0);
! }
! ''')
!
! Caveat: the indentation must be consistent -- if you use three tabs
! in the first line, (up to) three tabs are removed from following lines,
! but a line beginning with 24 spaces is not trimmed at all. Don't use
! this as a feature.
! """
! # (Don't you love using triple quotes *inside* triple quotes? :-)
!
! lines = text.split('\n')
! indent = ""
! for line in lines:
! if line.strip():
! for c in line:
! if not c.isspace():
! break
! indent = indent + c
! break
! n = len(indent)
! for line in lines:
! if line[:n] == indent:
! line = line[n:]
! else:
! for c in indent:
! if line[:1] <> c: break
! line = line[1:]
! VaOutput("%s", line)
def _test():
! """Test program. Run when the module is run as a script."""
! OutHeader1("test bgenOutput")
! Out("""
! #include <Python.h>
! #include <stdio.h>
!
! main(argc, argv)
! int argc;
! char **argv;
! {
! int i;
! """)
! IndentLevel()
! Output("""\
/* Here are a few comment lines.
Just to test indenting multiple lines.
***************
*** 208,219 ****
End of the comment lines. */
""")
! Output("for (i = 0; i < argc; i++)")
! OutLbrace()
! Output('printf("argv[%%d] = %%s\\n", i, argv[i]);')
! OutRbrace()
! Output("exit(0)")
! OutRbrace()
! OutHeader2("end test")
if __name__ == '__main__':
! _test()
--- 208,219 ----
End of the comment lines. */
""")
! Output("for (i = 0; i < argc; i++)")
! OutLbrace()
! Output('printf("argv[%%d] = %%s\\n", i, argv[i]);')
! OutRbrace()
! Output("exit(0)")
! OutRbrace()
! OutHeader2("end test")
if __name__ == '__main__':
! _test()
Index: bgenStackBuffer.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Tools/bgen/bgen/bgenStackBuffer.py,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** bgenStackBuffer.py 10 Mar 1995 14:37:53 -0000 1.2
--- bgenStackBuffer.py 19 Jan 2003 21:53:57 -0000 1.3
***************
*** 7,59 ****
class StackOutputBufferType(FixedOutputBufferType):
! """Fixed output buffer allocated on the stack -- passed as (buffer, size).
! Instantiate with the buffer size as parameter.
! """
! def passOutput(self, name):
! return "%s__out__, %s" % (name, self.size)
class VarStackOutputBufferType(StackOutputBufferType):
! """Output buffer allocated on the stack -- passed as (buffer, &size).
! Instantiate with the buffer size as parameter.
! """
! def declareSize(self, name):
! Output("int %s__len__ = %s;", name, self.size)
! def passOutput(self, name):
! return "%s__out__, &%s__len__" % (name, name)
! def mkvalueArgs(self, name):
! return "%s__out__, (int)%s__len__" % (name, name)
class VarVarStackOutputBufferType(VarStackOutputBufferType):
! """Output buffer allocated on the stack -- passed as (buffer, size, &size).
! Instantiate with the buffer size as parameter.
! """
! def passOutput(self, name):
! return "%s__out__, %s__len__, &%s__len__" % (name, name, name)
class ReturnVarStackOutputBufferType(VarStackOutputBufferType):
! """Output buffer allocated on the stack -- passed as (buffer, size) -> size.
! Instantiate with the buffer size as parameter.
! The function's return value is the size.
! (XXX Should have a way to suppress returning it separately, too.)
! """
! def passOutput(self, name):
! return "%s__out__, %s__len__" % (name, name)
! def mkvalueArgs(self, name):
! return "%s__out__, (int)_rv" % name
--- 7,59 ----
class StackOutputBufferType(FixedOutputBufferType):
! """Fixed output buffer allocated on the stack -- passed as (buffer, size).
! Instantiate with the buffer size as parameter.
! """
! def passOutput(self, name):
! return "%s__out__, %s" % (name, self.size)
class VarStackOutputBufferType(StackOutputBufferType):
! """Output buffer allocated on the stack -- passed as (buffer, &size).
! Instantiate with the buffer size as parameter.
! """
! def declareSize(self, name):
! Output("int %s__len__ = %s;", name, self.size)
! def passOutput(self, name):
! return "%s__out__, &%s__len__" % (name, name)
! def mkvalueArgs(self, name):
! return "%s__out__, (int)%s__len__" % (name, name)
class VarVarStackOutputBufferType(VarStackOutputBufferType):
! """Output buffer allocated on the stack -- passed as (buffer, size, &size).
! Instantiate with the buffer size as parameter.
! """
! def passOutput(self, name):
! return "%s__out__, %s__len__, &%s__len__" % (name, name, name)
class ReturnVarStackOutputBufferType(VarStackOutputBufferType):
! """Output buffer allocated on the stack -- passed as (buffer, size) -> size.
! Instantiate with the buffer size as parameter.
! The function's return value is the size.
! (XXX Should have a way to suppress returning it separately, too.)
! """
! def passOutput(self, name):
! return "%s__out__, %s__len__" % (name, name)
! def mkvalueArgs(self, name):
! return "%s__out__, (int)_rv" % name
Index: bgenStringBuffer.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Tools/bgen/bgen/bgenStringBuffer.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** bgenStringBuffer.py 25 Jan 1995 22:59:18 -0000 1.1
--- bgenStringBuffer.py 19 Jan 2003 21:53:57 -0000 1.2
***************
*** 9,64 ****
class StringBufferMixIn:
! """Mix-in class to create various string buffer types.
! Strings are character arrays terminated by a null byte.
! (For input, this is also covered by stringptr.)
! For output, there are again three variants:
! - Fixed: size is a constant given in the documentation; or
! - Stack: size is passed to the C function but we decide on a size at
! code generation time so we can still allocate on the heap); or
! - Heap: size is passed to the C function and we let the Python caller
! pass a size.
! (Note that this doesn't cover output parameters in which a string
! pointer is returned. These are actually easier (no allocation) but far
! less common. I'll write the classes when there is demand.)
! """
!
! def declareSize(self, name):
! pass
!
! def getargsFormat(self):
! return "s"
!
! def getargsArgs(self, name):
! return "&%s__in__" % name
! def mkvalueFormat(self):
! return "s"
! def mkvalueArgs(self, name):
! return "%s__out__" % name
class FixedOutputStringType(StringBufferMixIn, FixedOutputBufferType):
! """Null-terminated output string -- passed without size.
! Instantiate with buffer size as parameter.
! """
class StackOutputStringType(StringBufferMixIn, StackOutputBufferType):
! """Null-terminated output string -- passed as (buffer, size).
! Instantiate with buffer size as parameter.
! """
class HeapOutputStringType(StringBufferMixIn, HeapOutputBufferType):
! """Null-terminated output string -- passed as (buffer, size).
! Instantiate without parameters.
! Call from Python with buffer size.
! """
--- 9,64 ----
class StringBufferMixIn:
! """Mix-in class to create various string buffer types.
! Strings are character arrays terminated by a null byte.
! (For input, this is also covered by stringptr.)
! For output, there are again three variants:
! - Fixed: size is a constant given in the documentation; or
! - Stack: size is passed to the C function but we decide on a size at
! code generation time so we can still allocate on the heap); or
! - Heap: size is passed to the C function and we let the Python caller
! pass a size.
! (Note that this doesn't cover output parameters in which a string
! pointer is returned. These are actually easier (no allocation) but far
! less common. I'll write the classes when there is demand.)
! """
!
! def declareSize(self, name):
! pass
!
! def getargsFormat(self):
! return "s"
!
! def getargsArgs(self, name):
! return "&%s__in__" % name
! def mkvalueFormat(self):
! return "s"
! def mkvalueArgs(self, name):
! return "%s__out__" % name
class FixedOutputStringType(StringBufferMixIn, FixedOutputBufferType):
! """Null-terminated output string -- passed without size.
! Instantiate with buffer size as parameter.
! """
class StackOutputStringType(StringBufferMixIn, StackOutputBufferType):
! """Null-terminated output string -- passed as (buffer, size).
! Instantiate with buffer size as parameter.
! """
class HeapOutputStringType(StringBufferMixIn, HeapOutputBufferType):
! """Null-terminated output string -- passed as (buffer, size).
! Instantiate without parameters.
! Call from Python with buffer size.
! """
Index: bgenType.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Tools/bgen/bgen/bgenType.py,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** bgenType.py 12 Apr 2002 13:14:54 -0000 1.9
--- bgenType.py 19 Jan 2003 21:53:57 -0000 1.10
***************
*** 7,109 ****
class Type:
! """Define the various things you can do with a C type.
! Most methods are intended to be extended or overridden.
! """
! def __init__(self, typeName, fmt):
! """Call with the C name and getargs format for the type.
! Example: int = Type("int", "i")
! """
! self.typeName = typeName
! self.fmt = fmt
! def declare(self, name):
! """Declare a variable of the type with a given name.
! Example: int.declare('spam') prints "int spam;"
! """
! Output("%s %s;", self.typeName, name)
! def getargs(self):
! return self.getargsFormat(), self.getargsArgs()
! def getargsFormat(self):
! """Return the format for this type for use with [new]getargs().
! Example: int.getargsFormat() returns the string "i".
! """
! return self.fmt
! def getargsArgs(self, name):
! """Return an argument for use with [new]getargs().
! Example: int.getargsArgs("spam") returns the string "&spam".
! """
! return "&" + name
! def getargsCheck(self, name):
! """Perform any needed post-[new]getargs() checks.
! This is type-dependent; the default does not check for errors.
! An example would be a check for a maximum string length."""
! def passInput(self, name):
! """Return an argument for passing a variable into a call.
! Example: int.passInput("spam") returns the string "spam".
! """
! return name
! def passOutput(self, name):
! """Return an argument for returning a variable out of a call.
! Example: int.passOutput("spam") returns the string "&spam".
! """
! return "&" + name
! def errorCheck(self, name):
! """Check for an error returned in the variable.
! This is type-dependent; the default does not check for errors.
! An example would be a check for a NULL pointer.
! If an error is found, the generated routine should
! raise an exception and return NULL.
! XXX There should be a way to add error clean-up code.
! """
! Output("/* XXX no err check for %s %s */", self.typeName, name)
! def mkvalue(self):
! return self.mkvalueFormat(), self.mkvalueArgs()
! def mkvalueFormat(self):
! """Return the format for this type for use with mkvalue().
! This is normally the same as getargsFormat() but it is
! a separate function to allow future divergence.
! """
! return self.getargsFormat()
! def mkvalueArgs(self, name):
! """Return an argument for use with mkvalue().
! Example: int.mkvalueArgs("spam") returns the string "spam".
! """
! return name
! def cleanup(self, name):
! """Clean up if necessary.
! This is normally empty; it may deallocate buffers etc.
! """
! pass
class ByAddressType(Type):
! "Simple type that is also passed by address for input"
! def passInput(self, name):
! return "&%s" % name
--- 7,109 ----
class Type:
! """Define the various things you can do with a C type.
! Most methods are intended to be extended or overridden.
! """
! def __init__(self, typeName, fmt):
! """Call with the C name and getargs format for the type.
! Example: int = Type("int", "i")
! """
! self.typeName = typeName
! self.fmt = fmt
! def declare(self, name):
! """Declare a variable of the type with a given name.
! Example: int.declare('spam') prints "int spam;"
! """
! Output("%s %s;", self.typeName, name)
! def getargs(self):
! return self.getargsFormat(), self.getargsArgs()
! def getargsFormat(self):
! """Return the format for this type for use with [new]getargs().
! Example: int.getargsFormat() returns the string "i".
! """
! return self.fmt
! def getargsArgs(self, name):
! """Return an argument for use with [new]getargs().
! Example: int.getargsArgs("spam") returns the string "&spam".
! """
! return "&" + name
! def getargsCheck(self, name):
! """Perform any needed post-[new]getargs() checks.
! This is type-dependent; the default does not check for errors.
! An example would be a check for a maximum string length."""
! def passInput(self, name):
! """Return an argument for passing a variable into a call.
! Example: int.passInput("spam") returns the string "spam".
! """
! return name
! def passOutput(self, name):
! """Return an argument for returning a variable out of a call.
! Example: int.passOutput("spam") returns the string "&spam".
! """
! return "&" + name
! def errorCheck(self, name):
! """Check for an error returned in the variable.
! This is type-dependent; the default does not check for errors.
! An example would be a check for a NULL pointer.
! If an error is found, the generated routine should
! raise an exception and return NULL.
! XXX There should be a way to add error clean-up code.
! """
! Output("/* XXX no err check for %s %s */", self.typeName, name)
! def mkvalue(self):
! return self.mkvalueFormat(), self.mkvalueArgs()
! def mkvalueFormat(self):
! """Return the format for this type for use with mkvalue().
! This is normally the same as getargsFormat() but it is
! a separate function to allow future divergence.
! """
! return self.getargsFormat()
! def mkvalueArgs(self, name):
! """Return an argument for use with mkvalue().
! Example: int.mkvalueArgs("spam") returns the string "spam".
! """
! return name
! def cleanup(self, name):
! """Clean up if necessary.
! This is normally empty; it may deallocate buffers etc.
! """
! pass
class ByAddressType(Type):
! "Simple type that is also passed by address for input"
! def passInput(self, name):
! return "&%s" % name
***************
*** 113,135 ****
class InputOnlyMixIn:
! "Mix-in class to boobytrap passOutput"
! def passOutput(self, name):
! raise RuntimeError, "Type '%s' can only be used for input parameters" % self.typeName
class InputOnlyType(InputOnlyMixIn, Type):
! "Same as Type, but only usable for input parameters -- passOutput is boobytrapped"
class OutputOnlyMixIn:
! "Mix-in class to boobytrap passInput"
! def passInput(self, name):
! raise RuntimeError, "Type '%s' can only be used for output parameters" % self.typeName
class OutputOnlyType(OutputOnlyMixIn, Type):
! "Same as Type, but only usable for output parameters -- passInput is boobytrapped"
--- 113,135 ----
class InputOnlyMixIn:
! "Mix-in class to boobytrap passOutput"
! def passOutput(self, name):
! raise RuntimeError, "Type '%s' can only be used for input parameters" % self.typeName
class InputOnlyType(InputOnlyMixIn, Type):
! "Same as Type, but only usable for input parameters -- passOutput is boobytrapped"
class OutputOnlyMixIn:
! "Mix-in class to boobytrap passInput"
! def passInput(self, name):
! raise RuntimeError, "Type '%s' can only be used for output parameters" % self.typeName
class OutputOnlyType(OutputOnlyMixIn, Type):
! "Same as Type, but only usable for output parameters -- passInput is boobytrapped"
***************
*** 161,258 ****
class FakeType(InputOnlyType):
! """A type that is not represented in the Python version of the interface.
! Instantiate with a value to pass in the call.
! """
! def __init__(self, substitute):
! self.substitute = substitute
! self.typeName = None # Don't show this argument in __doc__ string
! def declare(self, name):
! pass
! def getargsFormat(self):
! return ""
! def getargsArgs(self, name):
! return None
! def passInput(self, name):
! return self.substitute
class OpaqueType(Type):
! """A type represented by an opaque object type, always passed by address.
! Instantiate with the type name and the names of the new and convert procs.
! If fewer than three arguments are passed, the second argument is used
! to derive the new and convert procs by appending _New and _Convert; it
! defaults to the first argument.
! """
! def __init__(self, name, arg = None, extra = None):
! self.typeName = name
! if extra is None:
! # Two arguments (name, usetype) or one (name)
! arg = arg or name
! self.new = arg + '_New'
! self.convert = arg + '_Convert'
! else:
! # Three arguments (name, new, convert)
! self.new = arg
! self.convert = extra
! def getargsFormat(self):
! return "O&"
! def getargsArgs(self, name):
! return "%s, &%s" % (self.convert, name)
! def passInput(self, name):
! return "&%s" % name
! def mkvalueFormat(self):
! return "O&"
! def mkvalueArgs(self, name):
! return "%s, &%s" % (self.new, name)
class OpaqueByValueType(OpaqueType):
! """A type represented by an opaque object type, on input passed BY VALUE.
! Instantiate with the type name, and optionally an object type name whose
! New/Convert functions will be used.
! """
! def passInput(self, name):
! return name
! def mkvalueArgs(self, name):
! return "%s, %s" % (self.new, name)
!
class OpaqueByValueStructType(OpaqueByValueType):
! """Similar to OpaqueByValueType, but we also pass this to mkvalue by
! address, in stead of by value.
! """
! def mkvalueArgs(self, name):
! return "%s, &%s" % (self.new, name)
class OpaqueArrayType(OpaqueByValueType):
! """A type represented by an opaque object type, with ARRAY passing semantics.
! Instantiate with the type name, and optional an object type name whose
! New/Convert functions will be used.
! """
! def getargsArgs(self, name):
! return "%s, %s" % (self.convert, name)
! def passOutput(self, name):
! return name
--- 161,258 ----
class FakeType(InputOnlyType):
! """A type that is not represented in the Python version of the interface.
! Instantiate with a value to pass in the call.
! """
! def __init__(self, substitute):
! self.substitute = substitute
! self.typeName = None # Don't show this argument in __doc__ string
! def declare(self, name):
! pass
! def getargsFormat(self):
! return ""
! def getargsArgs(self, name):
! return None
! def passInput(self, name):
! return self.substitute
class OpaqueType(Type):
! """A type represented by an opaque object type, always passed by address.
! Instantiate with the type name and the names of the new and convert procs.
! If fewer than three arguments are passed, the second argument is used
! to derive the new and convert procs by appending _New and _Convert; it
! defaults to the first argument.
! """
! def __init__(self, name, arg = None, extra = None):
! self.typeName = name
! if extra is None:
! # Two arguments (name, usetype) or one (name)
! arg = arg or name
! self.new = arg + '_New'
! self.convert = arg + '_Convert'
! else:
! # Three arguments (name, new, convert)
! self.new = arg
! self.convert = extra
! def getargsFormat(self):
! return "O&"
! def getargsArgs(self, name):
! return "%s, &%s" % (self.convert, name)
! def passInput(self, name):
! return "&%s" % name
! def mkvalueFormat(self):
! return "O&"
! def mkvalueArgs(self, name):
! return "%s, &%s" % (self.new, name)
class OpaqueByValueType(OpaqueType):
! """A type represented by an opaque object type, on input passed BY VALUE.
! Instantiate with the type name, and optionally an object type name whose
! New/Convert functions will be used.
! """
! def passInput(self, name):
! return name
! def mkvalueArgs(self, name):
! return "%s, %s" % (self.new, name)
!
class OpaqueByValueStructType(OpaqueByValueType):
! """Similar to OpaqueByValueType, but we also pass this to mkvalue by
! address, in stead of by value.
! """
! def mkvalueArgs(self, name):
! return "%s, &%s" % (self.new, name)
class OpaqueArrayType(OpaqueByValueType):
! """A type represented by an opaque object type, with ARRAY passing semantics.
! Instantiate with the type name, and optional an object type name whose
! New/Convert functions will be used.
! """
! def getargsArgs(self, name):
! return "%s, %s" % (self.convert, name)
! def passOutput(self, name):
! return name
Index: bgenVariable.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Tools/bgen/bgen/bgenVariable.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** bgenVariable.py 25 Jan 1995 22:59:20 -0000 1.1
--- bgenVariable.py 19 Jan 2003 21:53:57 -0000 1.2
***************
*** 18,88 ****
class Variable:
! """A Variable holds a type, a name, a transfer mode and flags.
! Most of its methods call the correponding type method with the
! variable name.
! """
! def __init__(self, type, name = None, flags = InMode):
! """Call with a type, a name and flags.
! If name is None, it muse be set later.
! flags defaults to InMode.
! """
! self.type = type
! self.name = name
! self.flags = flags
! self.mode = flags & ModeMask
! def declare(self):
! """Declare the variable if necessary.
! If it is "self", it is not declared.
! """
! if self.flags != SelfMode:
! self.type.declare(self.name)
! def getargsFormat(self):
! """Call the type's getargsFormatmethod."""
! return self.type.getargsFormat()
! def getargsArgs(self):
! """Call the type's getargsArgsmethod."""
! return self.type.getargsArgs(self.name)
! def getargsCheck(self):
! return self.type.getargsCheck(self.name)
! def passArgument(self):
! """Return the string required to pass the variable as argument.
! For "in" arguments, return the variable name.
! For "out" and "in out" arguments,
! return its name prefixed with "&".
! """
! if self.mode == InMode:
! return self.type.passInput(self.name)
! if self.mode in (OutMode, InOutMode):
! return self.type.passOutput(self.name)
! # XXX Shouldn't get here
! return "/*mode?*/" + self.type.passInput(self.name)
! def errorCheck(self):
! """Check for an error if necessary.
! This only generates code if the variable's mode is ErrorMode.
! """
! if self.flags == ErrorMode:
! self.type.errorCheck(self.name)
! def mkvalueFormat (self):
! """Call the type's mkvalueFormat method."""
! return self.type.mkvalueFormat()
! def mkvalueArgs(self):
! """Call the type's mkvalueArgs method."""
! return self.type.mkvalueArgs(self.name)
! def cleanup(self):
! """Call the type's cleanup method."""
! return self.type.cleanup(self.name)
--- 18,88 ----
class Variable:
! """A Variable holds a type, a name, a transfer mode and flags.
! Most of its methods call the correponding type method with the
! variable name.
! """
! def __init__(self, type, name = None, flags = InMode):
! """Call with a type, a name and flags.
! If name is None, it muse be set later.
! flags defaults to InMode.
! """
! self.type = type
! self.name = name
! self.flags = flags
! self.mode = flags & ModeMask
! def declare(self):
! """Declare the variable if necessary.
! If it is "self", it is not declared.
! """
! if self.flags != SelfMode:
! self.type.declare(self.name)
! def getargsFormat(self):
! """Call the type's getargsFormatmethod."""
! return self.type.getargsFormat()
! def getargsArgs(self):
! """Call the type's getargsArgsmethod."""
! return self.type.getargsArgs(self.name)
! def getargsCheck(self):
! return self.type.getargsCheck(self.name)
! def passArgument(self):
! """Return the string required to pass the variable as argument.
! For "in" arguments, return the variable name.
! For "out" and "in out" arguments,
! return its name prefixed with "&".
! """
! if self.mode == InMode:
! return self.type.passInput(self.name)
! if self.mode in (OutMode, InOutMode):
! return self.type.passOutput(self.name)
! # XXX Shouldn't get here
! return "/*mode?*/" + self.type.passInput(self.name)
! def errorCheck(self):
! """Check for an error if necessary.
! This only generates code if the variable's mode is ErrorMode.
! """
! if self.flags == ErrorMode:
! self.type.errorCheck(self.name)
! def mkvalueFormat (self):
! """Call the type's mkvalueFormat method."""
! return self.type.mkvalueFormat()
! def mkvalueArgs(self):
! """Call the type's mkvalueArgs method."""
! return self.type.mkvalueArgs(self.name)
! def cleanup(self):
! """Call the type's cleanup method."""
! return self.type.cleanup(self.name)
Index: macsupport.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Tools/bgen/bgen/macsupport.py,v
retrieving revision 1.28
retrieving revision 1.29
diff -C2 -d -r1.28 -r1.29
*** macsupport.py 22 Aug 2002 23:30:48 -0000 1.28
--- macsupport.py 19 Jan 2003 21:53:57 -0000 1.29
***************
*** 53,57 ****
# OSType and ResType: 4-byte character strings
def OSTypeType(typename):
! return OpaqueByValueType(typename, "PyMac_BuildOSType", "PyMac_GetOSType")
OSType = OSTypeType("OSType")
ResType = OSTypeType("ResType")
--- 53,57 ----
# OSType and ResType: 4-byte character strings
def OSTypeType(typename):
! return OpaqueByValueType(typename, "PyMac_BuildOSType", "PyMac_GetOSType")
OSType = OSTypeType("OSType")
ResType = OSTypeType("ResType")
***************
*** 105,111 ****
# (Could do this with less code using a variant of mkvalue("O&")?)
class OSErrType(Type):
! def errorCheck(self, name):
! Output("if (%s != noErr) return PyMac_Error(%s);", name, name)
! self.used = 1
OSErr = OSErrType("OSErr", 'h')
OSStatus = OSErrType("OSStatus", 'l')
--- 105,111 ----
# (Could do this with less code using a variant of mkvalue("O&")?)
class OSErrType(Type):
! def errorCheck(self, name):
! Output("if (%s != noErr) return PyMac_Error(%s);", name, name)
! self.used = 1
OSErr = OSErrType("OSErr", 'h')
OSStatus = OSErrType("OSStatus", 'l')
***************
*** 114,126 ****
# Various buffer types
! InBuffer = VarInputBufferType('char', 'long', 'l') # (buf, len)
! UcharInBuffer = VarInputBufferType('unsigned char', 'long', 'l') # (buf, len)
! OptionalInBuffer = OptionalVarInputBufferType('char', 'long', 'l') # (buf, len)
! InOutBuffer = HeapInputOutputBufferType('char', 'long', 'l') # (inbuf, outbuf, len)
VarInOutBuffer = VarHeapInputOutputBufferType('char', 'long', 'l') # (inbuf, outbuf, &len)
! OutBuffer = HeapOutputBufferType('char', 'long', 'l') # (buf, len)
! VarOutBuffer = VarHeapOutputBufferType('char', 'long', 'l') # (buf, &len)
VarVarOutBuffer = VarVarHeapOutputBufferType('char', 'long', 'l') # (buf, len, &len)
--- 114,126 ----
# Various buffer types
! InBuffer = VarInputBufferType('char', 'long', 'l') # (buf, len)
! UcharInBuffer = VarInputBufferType('unsigned char', 'long', 'l') # (buf, len)
! OptionalInBuffer = OptionalVarInputBufferType('char', 'long', 'l') # (buf, len)
! InOutBuffer = HeapInputOutputBufferType('char', 'long', 'l') # (inbuf, outbuf, len)
VarInOutBuffer = VarHeapInputOutputBufferType('char', 'long', 'l') # (inbuf, outbuf, &len)
! OutBuffer = HeapOutputBufferType('char', 'long', 'l') # (buf, len)
! VarOutBuffer = VarHeapOutputBufferType('char', 'long', 'l') # (buf, &len)
VarVarOutBuffer = VarVarHeapOutputBufferType('char', 'long', 'l') # (buf, len, &len)
***************
*** 128,137 ****
class VarUnicodeInputBufferType(VarInputBufferType):
! def getargsFormat(self):
! return "u#"
!
class VarUnicodeReverseInputBufferType(ReverseInputBufferMixin, VarUnicodeInputBufferType):
! pass
!
UnicodeInBuffer = VarUnicodeInputBufferType('UniChar', 'UniCharCount', 'l')
UnicodeReverseInBuffer = VarUnicodeReverseInputBufferType('UniChar', 'UniCharCount', 'l')
--- 128,137 ----
class VarUnicodeInputBufferType(VarInputBufferType):
! def getargsFormat(self):
! return "u#"
!
class VarUnicodeReverseInputBufferType(ReverseInputBufferMixin, VarUnicodeInputBufferType):
! pass
!
UnicodeInBuffer = VarUnicodeInputBufferType('UniChar', 'UniCharCount', 'l')
UnicodeReverseInBuffer = VarUnicodeReverseInputBufferType('UniChar', 'UniCharCount', 'l')
***************
*** 152,158 ****
/* Macro to test whether a weak-loaded CFM function exists */
#define PyMac_PRECHECK(rtn) do { if ( &rtn == NULL ) {\\
! PyErr_SetString(PyExc_NotImplementedError, \\
! "Not available in this shared library/OS version"); \\
! return NULL; \\
}} while(0)
--- 152,158 ----
/* Macro to test whether a weak-loaded CFM function exists */
#define PyMac_PRECHECK(rtn) do { if ( &rtn == NULL ) {\\
! PyErr_SetString(PyExc_NotImplementedError, \\
! "Not available in this shared library/OS version"); \\
! return NULL; \\
}} while(0)
***************
*** 174,183 ****
# errorCheck method.
class OSErrMixIn:
! "Mix-in class to treat OSErr/OSStatus return values special"
! def makereturnvar(self):
! if self.returntype.__class__ == OSErrType:
! return Variable(self.returntype, "_err", ErrorMode)
! else:
! return Variable(self.returntype, "_rv", OutMode)
class OSErrFunctionGenerator(OSErrMixIn, FunctionGenerator): pass
--- 174,183 ----
# errorCheck method.
class OSErrMixIn:
! "Mix-in class to treat OSErr/OSStatus return values special"
! def makereturnvar(self):
! if self.returntype.__class__ == OSErrType:
! return Variable(self.returntype, "_err", ErrorMode)
! else:
! return Variable(self.returntype, "_rv", OutMode)
class OSErrFunctionGenerator(OSErrMixIn, FunctionGenerator): pass
***************
*** 185,194 ****
class WeakLinkMixIn:
! "Mix-in to test the function actually exists (!= NULL) before calling"
!
! def precheck(self):
! Output('#ifndef %s', self.name)
! Output('PyMac_PRECHECK(%s);', self.name)
! Output('#endif')
class WeakLinkFunctionGenerator(WeakLinkMixIn, FunctionGenerator): pass
--- 185,194 ----
class WeakLinkMixIn:
! "Mix-in to test the function actually exists (!= NULL) before calling"
!
! def precheck(self):
! Output('#ifndef %s', self.name)
! Output('PyMac_PRECHECK(%s);', self.name)
! Output('#endif')
class WeakLinkFunctionGenerator(WeakLinkMixIn, FunctionGenerator): pass
***************
*** 198,210 ****
class MacModule(Module):
! "Subclass which gets the exception initializer from macglue.c"
! def exceptionInitializer(self):
! return "PyMac_GetOSErrException()"
_SetOutputFileName = SetOutputFileName # Save original
def SetOutputFileName(file = None):
! "Set the output file name and set its creator&type to CWIE&TEXT"
! _SetOutputFileName(file)
! if file:
! import MacOS
! MacOS.SetCreatorAndType(file, 'CWIE', 'TEXT')
--- 198,210 ----
class MacModule(Module):
! "Subclass which gets the exception initializer from macglue.c"
! def exceptionInitializer(self):
! return "PyMac_GetOSErrException()"
_SetOutputFileName = SetOutputFileName # Save original
def SetOutputFileName(file = None):
! "Set the output file name and set its creator&type to CWIE&TEXT"
! _SetOutputFileName(file)
! if file:
! import MacOS
! MacOS.SetCreatorAndType(file, 'CWIE', 'TEXT')
Index: scantools.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Tools/bgen/bgen/scantools.py,v
retrieving revision 1.32
retrieving revision 1.33
diff -C2 -d -r1.32 -r1.33
*** scantools.py 11 Sep 2002 20:36:00 -0000 1.32
--- scantools.py 19 Jan 2003 21:53:57 -0000 1.33
***************
*** 21,33 ****
from types import *
try:
! import MacOS
except ImportError:
! MacOS = None
try:
! from bgenlocations import CREATOR, INCLUDEDIR
except ImportError:
! CREATOR = None
[...1270 lines suppressed...]
! out = []
! for c in s:
! o = ord(c)
! if o >= 128:
! out.append("\\" + hex(o)[1:])
! else:
! out.append(c)
! s = "".join(out)
! return s
def test():
! input = "D:Development:THINK C:Mac #includes:Apple #includes:AppleEvents.h"
! output = "@aespecs.py"
! defsoutput = "@aedefs.py"
! s = Scanner(input, output, defsoutput)
! s.scan()
if __name__ == '__main__':
! test()