diff options
Diffstat (limited to 'Tools/bgen/bgen/bgenVariable.py')
-rw-r--r-- | Tools/bgen/bgen/bgenVariable.py | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/Tools/bgen/bgen/bgenVariable.py b/Tools/bgen/bgen/bgenVariable.py new file mode 100644 index 0000000..566438a --- /dev/null +++ b/Tools/bgen/bgen/bgenVariable.py @@ -0,0 +1,112 @@ +"""Variables, arguments and argument transfer modes etc.""" + + +# Values to represent argument transfer modes +InMode = 1 # input-only argument +OutMode = 2 # output-only argument +InOutMode = 3 # input-output argument +ModeMask = 3 # bits to keep for mode + + +# Special cases for mode/flags argument +# XXX This is still a mess! +SelfMode = 4+InMode # this is 'self' -- don't declare it +ReturnMode = 8+OutMode # this is the function return value +ErrorMode = 16+OutMode # this is an error status -- turn it into an exception +RefMode = 32 +ConstMode = 64 + +class Variable: + + """A Variable holds a type, a name, a transfer mode and flags. + + Most of its methods call the corresponding 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 == ReturnMode+RefMode: + self.type.declare(self.name, reference=True) + elif self.flags != SelfMode: + self.type.declare(self.name) + + def getArgDeclarations(self, fullmodes=False): + refmode = (self.flags & RefMode) + constmode = False + outmode = False + if fullmodes: + constmode = (self.flags & ConstMode) + outmode = (self.flags & OutMode) + return self.type.getArgDeclarations(self.name, + reference=refmode, constmode=constmode, outmode=outmode) + + def getAuxDeclarations(self): + return self.type.getAuxDeclarations(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 getargsPreCheck(self): + return self.type.getargsPreCheck(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 & RefMode: + return self.type.passReference(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 mkvaluePreCheck(self): + return self.type.mkvaluePreCheck(self.name) + + def cleanup(self): + """Call the type's cleanup method.""" + return self.type.cleanup(self.name) |