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

Jeremy Hylton jhylton@users.sourceforge.net
2001年4月11日 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):

AltStyle によって変換されたページ (->オリジナル) /