[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):