+++ /dev/null
-"""Variables, arguments and argument transfer modes etc."""\r
-\r
-\r
-# Values to represent argument transfer modes\r
-InMode = 1 # input-only argument\r
-OutMode = 2 # output-only argument\r
-InOutMode = 3 # input-output argument\r
-ModeMask = 3 # bits to keep for mode\r
-\r
-\r
-# Special cases for mode/flags argument\r
-# XXX This is still a mess!\r
-SelfMode = 4+InMode # this is 'self' -- don't declare it\r
-ReturnMode = 8+OutMode # this is the function return value\r
-ErrorMode = 16+OutMode # this is an error status -- turn it into an exception\r
-RefMode = 32\r
-ConstMode = 64\r
-\r
-class Variable:\r
-\r
- """A Variable holds a type, a name, a transfer mode and flags.\r
-\r
- Most of its methods call the correponding type method with the\r
- variable name.\r
- """\r
-\r
- def __init__(self, type, name = None, flags = InMode):\r
- """Call with a type, a name and flags.\r
-\r
- If name is None, it muse be set later.\r
- flags defaults to InMode.\r
- """\r
- self.type = type\r
- self.name = name\r
- self.flags = flags\r
- self.mode = flags & ModeMask\r
-\r
- def declare(self):\r
- """Declare the variable if necessary.\r
-\r
- If it is "self", it is not declared.\r
- """\r
- if self.flags == ReturnMode+RefMode:\r
- self.type.declare(self.name, reference=True)\r
- elif self.flags != SelfMode:\r
- self.type.declare(self.name)\r
-\r
- def getArgDeclarations(self, fullmodes=False):\r
- refmode = (self.flags & RefMode)\r
- constmode = False\r
- outmode = False\r
- if fullmodes:\r
- constmode = (self.flags & ConstMode)\r
- outmode = (self.flags & OutMode)\r
- return self.type.getArgDeclarations(self.name,\r
- reference=refmode, constmode=constmode, outmode=outmode)\r
-\r
- def getAuxDeclarations(self):\r
- return self.type.getAuxDeclarations(self.name)\r
-\r
- def getargsFormat(self):\r
- """Call the type's getargsFormatmethod."""\r
- return self.type.getargsFormat()\r
-\r
- def getargsArgs(self):\r
- """Call the type's getargsArgsmethod."""\r
- return self.type.getargsArgs(self.name)\r
-\r
- def getargsCheck(self):\r
- return self.type.getargsCheck(self.name)\r
-\r
- def getargsPreCheck(self):\r
- return self.type.getargsPreCheck(self.name)\r
-\r
- def passArgument(self):\r
- """Return the string required to pass the variable as argument.\r
-\r
- For "in" arguments, return the variable name.\r
- For "out" and "in out" arguments,\r
- return its name prefixed with "&".\r
- """\r
- if self.mode == InMode:\r
- return self.type.passInput(self.name)\r
- if self.mode & RefMode:\r
- return self.type.passReference(self.name)\r
- if self.mode in (OutMode, InOutMode):\r
- return self.type.passOutput(self.name)\r
- # XXX Shouldn't get here\r
- return "/*mode?*/" + self.type.passInput(self.name)\r
-\r
- def errorCheck(self):\r
- """Check for an error if necessary.\r
-\r
- This only generates code if the variable's mode is ErrorMode.\r
- """\r
- if self.flags == ErrorMode:\r
- self.type.errorCheck(self.name)\r
-\r
- def mkvalueFormat (self):\r
- """Call the type's mkvalueFormat method."""\r
- return self.type.mkvalueFormat()\r
-\r
- def mkvalueArgs(self):\r
- """Call the type's mkvalueArgs method."""\r
- return self.type.mkvalueArgs(self.name)\r
-\r
- def mkvaluePreCheck(self):\r
- return self.type.mkvaluePreCheck(self.name)\r
-\r
- def cleanup(self):\r
- """Call the type's cleanup method."""\r
- return self.type.cleanup(self.name)\r