]> granicus.if.org Git - python/commitdiff
More factorization to help C++ support.
authorJack Jansen <jack.jansen@cwi.nl>
Tue, 28 Jun 2005 15:14:35 +0000 (15:14 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Tue, 28 Jun 2005 15:14:35 +0000 (15:14 +0000)
Tools/bgen/bgen/bgenBuffer.py
Tools/bgen/bgen/bgenStackBuffer.py
Tools/bgen/bgen/bgenStringBuffer.py
Tools/bgen/bgen/bgenType.py
Tools/bgen/bgen/bgenVariable.py
Tools/bgen/bgen/scantools.py

index f8953158fdafdde418c0afb2905de4d86aab8639..bc11e6420f3a6630db7d3965c806be0cdcf4998b 100644 (file)
@@ -38,10 +38,11 @@ class FixedInputOutputBufferType(InputOnlyType):
         self.sizeformat = sizeformat or type2format[sizetype]
         self.label_needed = 0
 
-    def getDeclarations(self, name, reference=False):
+    def getArgDeclarations(self, name, reference=False):
         if reference:
             raise RuntimeError, "Cannot pass buffer types by reference"
-        return self.getBufferDeclarations(name) + self.getSizeDeclarations(name)
+        return (self.getBufferDeclarations(name) + 
+                self.getSizeDeclarations(name))
 
     def getBufferDeclarations(self, name):
         return self.getInputBufferDeclarations(name) + self.getOutputBufferDeclarations(name)
@@ -53,10 +54,10 @@ class FixedInputOutputBufferType(InputOnlyType):
         return ["%s %s__out__[%s]" % (self.datatype, name, self.size)]
 
     def getSizeDeclarations(self, name):
-        return [
-            "%s %s__len__" %(self.sizetype, name),
-            "int %s__in_len__" %(name)
-            ]
+        return ["%s %s__len__" %(self.sizetype, name)]
+
+    def getAuxDeclarations(self, name):
+        return ["int %s__in_len__" %(name)]
 
     def getargsFormat(self):
         return "s#"
@@ -189,6 +190,9 @@ class StructInputOutputBufferType(FixedInputOutputBufferType):
         return ["%s *%s__in__" % (self.type, name)]
 
     def getSizeDeclarations(self, name):
+        return []
+        
+    def getAuxDeclarations(self, name):
         return ["int %s__in_len__" % (name)]
 
     def getOutputBufferDeclarations(self, name):
@@ -248,6 +252,9 @@ class StructOutputBufferType(OutputOnlyBufferMixIn, StructInputOutputBufferType)
     def getSizeDeclarations(self, name):
         return []
 
+    def getAuxDeclarations(self, name):
+        return []
+
     def passOutput(self, name):
         return "&%s__out__" % name
 
@@ -262,5 +269,8 @@ class ArrayOutputBufferType(OutputOnlyBufferMixIn, StructInputOutputBufferType):
     def getSizeDeclarations(self, name):
         return []
 
+    def getAuxDeclarations(self, name):
+        return []
+
     def passOutput(self, name):
         return "%s__out__" % name
index 32f97f9412ebd05908406ba778e6deb0d4da5642..431bb73bea379a795dad8b69cb700bac10ad2844 100644 (file)
@@ -23,6 +23,9 @@ class VarStackOutputBufferType(StackOutputBufferType):
     """
 
     def getSizeDeclarations(self, name):
+        return []
+
+    def getAuxDeclarations(self, name):
         return ["int %s__len__ = %s" % (name, self.size)]
 
     def passOutput(self, name):
index 01155b3c1294192ad31e3b7ebd7d4b112c150e94..a232f83d2ace8cebe4d7dcabf1e2fe89a7d93565 100644 (file)
@@ -26,6 +26,9 @@ class StringBufferMixIn:
     def getSizeDeclarations(self, name):
         return []
 
+    def getAuxDeclarations(self, name):
+        return []
+
     def getargsFormat(self):
         return "s"
 
index a31aa74cefe1459e9037493b16e0587afaf14131..f7cb3886373f3d76583aed546fe05a207e23da28 100644 (file)
@@ -24,17 +24,25 @@ class Type:
 
         Example: int.declare('spam') prints "int spam;"
         """
-        for decl in self.getDeclarations(name, reference):
+        for decl in self.getArgDeclarations(name, reference):
+            Output("%s;", decl)
+        for decl in self.getAuxDeclarations(name):
             Output("%s;", decl)
 
-    def getDeclarations(self, name, reference=False):
-        """Return a string declaring a variable or argument, without
-        any syntactic adornment"""
+    def getArgDeclarations(self, name, reference=False):
+        """Return the main part of the declarations for this type: the items
+        that will be passed as arguments in the C/C++ function call."""
         if reference:
             return ["%s& %s" % (self.typeName, name)]
         else:
             return ["%s %s" % (self.typeName, name)]
 
+    def getAuxDeclarations(self, name):
+        """Return any auxiliary declarations needed for implementing this
+        type, such as helper variables used to hold sizes, etc. These declarations
+        are not part of the C/C++ function call interface."""
+        return []
+        
     def getargs(self):
         return self.getargsFormat(), self.getargsArgs()
 
@@ -187,7 +195,10 @@ class FakeType(InputOnlyType):
         self.substitute = substitute
         self.typeName = None    # Don't show this argument in __doc__ string
 
-    def getDeclarations(self, name, reference=False):
+    def getArgDeclarations(self, name, reference=False):
+        return []
+
+    def getAuxDeclarations(self, name, reference=False):
         return []
 
     def getargsFormat(self):
index bc1199cd89d11cb3c7ced7a0d3306aa798439aaf..6edeb873fca2b94872a4e6349457e057bac2d71e 100644 (file)
@@ -45,11 +45,12 @@ class Variable:
         elif self.flags != SelfMode:
             self.type.declare(self.name)
 
-    def getDeclarations(self):
-        """Return the unadorned declaration of the variable,
-        suitable for use in a formal parameter list."""
+    def getArgDeclarations(self):
         refmode = (self.flags & RefMode)
-        return self.type.getDeclarations(self.name, reference=refmode)
+        return self.type.getArgDeclarations(self.name, reference=refmode)
+    
+    def getAuxDeclarations(self):
+        return self.type.getAuxDeclarations(self.name)
 
     def getargsFormat(self):
         """Call the type's getargsFormatmethod."""
index 67539e08bcd8e249cffb64ed07cbc73663e4cd59..1ebf70de18a0cf20022f40132140e759c7dc29d7 100644 (file)
@@ -482,8 +482,7 @@ if missing: raise "Missing Types"
         modifiers = self.getmodifiers(match)
         type = self.pythonizename(type)
         name = self.pythonizename(name)
-        if name in self.alreadydone:
-            self.report("Name has already been defined: %r", name)
+        if self.checkduplicate(name):
             return
         self.report("==> %s %s <==", type, name)
         if self.blacklisted(type, name):
@@ -499,7 +498,6 @@ if missing: raise "Missing Types"
             ##  self.report("    %r", arg)
             self.report("*** %s %s unmanageable", type, name)
             return
-        self.alreadydone.append(name)
         if modifiers:
             self.generate(type, name, arglist, modifiers)
         else:
@@ -508,6 +506,13 @@ if missing: raise "Missing Types"
     def getmodifiers(self, match):
         return []
 
+    def checkduplicate(self, name):
+        if name in self.alreadydone:
+            self.report("Name has already been defined: %r", name)
+            return True
+        self.alreadydone.append(name)
+        return False
+
     def pythonizename(self, name):
         name = re.sub("\*", " ptr", name)
         name = name.strip()