summaryrefslogtreecommitdiffstats
path: root/Tools/bgen/bgen/bgenVariable.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/bgen/bgen/bgenVariable.py')
-rw-r--r--Tools/bgen/bgen/bgenVariable.py112
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)