PageRenderTime 23ms CodeModel.GetById 12ms app.highlight 8ms RepoModel.GetById 1ms app.codeStats 0ms

/Tools/bgen/bgen/bgenVariable.py

http://unladen-swallow.googlecode.com/
Python | 112 lines | 88 code | 8 blank | 16 comment | 0 complexity | f04d4782046b31f988059c6a01ca086b MD5 | raw file
  1"""Variables, arguments and argument transfer modes etc."""
  2
  3
  4# Values to represent argument transfer modes
  5InMode    = 1 # input-only argument
  6OutMode   = 2 # output-only argument
  7InOutMode = 3 # input-output argument
  8ModeMask  = 3 # bits to keep for mode
  9
 10
 11# Special cases for mode/flags argument
 12# XXX This is still a mess!
 13SelfMode   =  4+InMode  # this is 'self' -- don't declare it
 14ReturnMode =  8+OutMode # this is the function return value
 15ErrorMode  = 16+OutMode # this is an error status -- turn it into an exception
 16RefMode    = 32
 17ConstMode  = 64
 18
 19class Variable:
 20
 21    """A Variable holds a type, a name, a transfer mode and flags.
 22
 23    Most of its methods call the correponding type method with the
 24    variable name.
 25    """
 26
 27    def __init__(self, type, name = None, flags = InMode):
 28        """Call with a type, a name and flags.
 29
 30        If name is None, it muse be set later.
 31        flags defaults to InMode.
 32        """
 33        self.type = type
 34        self.name = name
 35        self.flags = flags
 36        self.mode = flags & ModeMask
 37
 38    def declare(self):
 39        """Declare the variable if necessary.
 40
 41        If it is "self", it is not declared.
 42        """
 43        if self.flags == ReturnMode+RefMode:
 44            self.type.declare(self.name, reference=True)
 45        elif self.flags != SelfMode:
 46            self.type.declare(self.name)
 47
 48    def getArgDeclarations(self, fullmodes=False):
 49        refmode = (self.flags & RefMode)
 50        constmode = False
 51        outmode = False
 52        if fullmodes:
 53            constmode = (self.flags & ConstMode)
 54            outmode = (self.flags & OutMode)
 55        return self.type.getArgDeclarations(self.name,
 56                reference=refmode, constmode=constmode, outmode=outmode)
 57
 58    def getAuxDeclarations(self):
 59        return self.type.getAuxDeclarations(self.name)
 60
 61    def getargsFormat(self):
 62        """Call the type's getargsFormatmethod."""
 63        return self.type.getargsFormat()
 64
 65    def getargsArgs(self):
 66        """Call the type's getargsArgsmethod."""
 67        return self.type.getargsArgs(self.name)
 68
 69    def getargsCheck(self):
 70        return self.type.getargsCheck(self.name)
 71
 72    def getargsPreCheck(self):
 73        return self.type.getargsPreCheck(self.name)
 74
 75    def passArgument(self):
 76        """Return the string required to pass the variable as argument.
 77
 78        For "in" arguments, return the variable name.
 79        For "out" and "in out" arguments,
 80        return its name prefixed with "&".
 81        """
 82        if self.mode == InMode:
 83            return self.type.passInput(self.name)
 84        if self.mode & RefMode:
 85            return self.type.passReference(self.name)
 86        if self.mode in (OutMode, InOutMode):
 87            return self.type.passOutput(self.name)
 88        # XXX Shouldn't get here
 89        return "/*mode?*/" + self.type.passInput(self.name)
 90
 91    def errorCheck(self):
 92        """Check for an error if necessary.
 93
 94        This only generates code if the variable's mode is ErrorMode.
 95        """
 96        if self.flags == ErrorMode:
 97            self.type.errorCheck(self.name)
 98
 99    def mkvalueFormat (self):
100        """Call the type's mkvalueFormat method."""
101        return self.type.mkvalueFormat()
102
103    def mkvalueArgs(self):
104        """Call the type's mkvalueArgs method."""
105        return self.type.mkvalueArgs(self.name)
106
107    def mkvaluePreCheck(self):
108        return self.type.mkvaluePreCheck(self.name)
109
110    def cleanup(self):
111        """Call the type's cleanup method."""
112        return self.type.cleanup(self.name)