/Tools/bgen/bgen/bgenVariable.py

http://unladen-swallow.googlecode.com/ · Python · 112 lines · 77 code · 12 blank · 23 comment · 3 complexity · f04d4782046b31f988059c6a01ca086b MD5 · raw file

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