[Python-checkins] CVS: python/dist/src/Tools/compiler/compiler pycodegen.py,1.28,1.29

Jeremy Hylton jhylton@users.sourceforge.net
Wed, 11 Apr 2001 09:24:32 -0700


Update of /cvsroot/python/python/dist/src/Tools/compiler/compiler
In directory usw-pr-cvs1:/tmp/cvs-serv27760

Modified Files:
	pycodegen.py 
Log Message:
Generate docstrings.

Fixes SF buf #217004

Add method fixDocstring() to CodeGenerator.  It converts the Discard
node containing the docstring into an assignment to __doc__.


Index: pycodegen.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Tools/compiler/compiler/pycodegen.py,v
retrieving revision 1.28
retrieving revision 1.29
diff -C2 -r1.28 -r1.29
*** pycodegen.py	2001/04/09 04:28:48	1.28
--- pycodegen.py	2001/04/11 16:24:30	1.29
***************
*** 142,146 ****
          lnf = walk(node.node, LocalNameFinder(), 0)
          self.locals.push(lnf.getLocals())
!         self.setDocstring(node.doc)
          self.visit(node.node)
          self.emit('LOAD_CONST', None)
--- 142,147 ----
          lnf = walk(node.node, LocalNameFinder(), 0)
          self.locals.push(lnf.getLocals())
!         if node.doc:
!             self.fixDocstring(node.node)
          self.visit(node.node)
          self.emit('LOAD_CONST', None)
***************
*** 149,152 ****
--- 150,155 ----
      def visitFunction(self, node):
          self._visitFuncOrLambda(node, isLambda=0)
+         if node.doc:
+             self.setDocstring(node.doc)
          self.storeName(node.name)
  
***************
*** 166,169 ****
--- 169,174 ----
      def visitClass(self, node):
          gen = ClassCodeGenerator(node, self.filename)
+         if node.doc:
+             self.fixDocstring(node.code)
          walk(node.code, gen)
          gen.finish()
***************
*** 179,182 ****
--- 184,200 ----
          self.storeName(node.name)
  
+     def fixDocstring(self, node):
+         """Rewrite the ast for a class with a docstring.
+ 
+         The AST includes a Discard(Const(docstring)) node.  Replace
+         this with an Assign([AssName('__doc__', ...])
+         """
+         assert isinstance(node, ast.Stmt)
+         stmts = node.nodes
+         discard = stmts[0]
+         assert isinstance(discard, ast.Discard)
+         stmts[0] = ast.Assign([ast.AssName('__doc__', 'OP_ASSIGN')],
+                               discard.expr)
+         stmts[0].lineno = discard.lineno
      # The rest are standard visitor methods
  
***************
*** 628,632 ****
      def visitAugSlice(self, node, mode):
          if mode == "load":
!             self.visitSlice(node, 1)
          elif mode == "store":
              slice = 0
--- 646,650 ----
      def visitAugSlice(self, node, mode):
          if mode == "load":
!             self.visitlSice(node, 1)
          elif mode == "store":
              slice = 0
***************
*** 897,904 ****
          args, hasTupleArg = generateArgList(func.argnames)
          self.graph = pyassem.PyFlowGraph(name, filename, args, 
!                                            optimized=1) 
          self.isLambda = isLambda
          self.super_init(filename)
  
          lnf = walk(func.code, LocalNameFinder(args), 0)
          self.locals.push(lnf.getLocals())
--- 915,925 ----
          args, hasTupleArg = generateArgList(func.argnames)
          self.graph = pyassem.PyFlowGraph(name, filename, args, 
!                                          optimized=1) 
          self.isLambda = isLambda
          self.super_init(filename)
  
+         if not isLambda and func.doc:
+             self.setDocstring(func.doc)
+ 
          lnf = walk(func.code, LocalNameFinder(args), 0)
          self.locals.push(lnf.getLocals())
***************
*** 948,951 ****
--- 969,974 ----
          self.locals.push(lnf.getLocals())
          self.graph.setFlag(CO_NEWLOCALS)
+         if klass.doc:
+             self.setDocstring(klass.doc)
  
      def finish(self):