[Python-checkins] CVS: /python/nondist/src/Compiler compile.py,1.15,1.16
Jeremy Hylton
jhylton@cnri.reston.va.us
Thu, 17 Feb 2000 12:56:33 -0500
Update of /projects/cvsroot//python/nondist/src/Compiler
In directory goon.cnri.reston.va.us:/home/jhylton/python/nondist/src/Compiler
Modified Files:
compile.py
Log Message:
satisfy the tabnanny
fix broken references to filename var in generateXXX methods
Index: compile.py
===================================================================
RCS file: /projects/cvsroot//python/nondist/src/Compiler/compile.py,v
retrieving revision 1.15
retrieving revision 1.16
diff -C2 -r1.15 -r1.16
*** compile.py 2000/02/16 00:55:44 1.15
--- compile.py 2000/02/17 17:56:29 1.16
***************
*** 81,85 ****
def __init__(self):
! self.node = None
def preorder(self, tree, visitor):
--- 81,85 ----
def __init__(self):
! self.node = None
def preorder(self, tree, visitor):
***************
*** 164,170 ****
def __init__(self, filename="<?>"):
self.filename = filename
! self.code = PyAssembler()
self.code.setFlags(0)
! self.locals = misc.Stack()
self.loops = misc.Stack()
self.namespace = 0
--- 164,170 ----
def __init__(self, filename="<?>"):
self.filename = filename
! self.code = PyAssembler()
self.code.setFlags(0)
! self.locals = misc.Stack()
self.loops = misc.Stack()
self.namespace = 0
***************
*** 173,188 ****
def emit(self, *args):
! # XXX could just use self.emit = self.code.emit
! apply(self.code.emit, args)
def _generateFunctionOrLambdaCode(self, func):
self.name = func.name
! self.filename = filename
!
# keep a lookout for 'def foo((x,y)):'
args, hasTupleArg = self.generateArglist(func.argnames)
! self.code = PyAssembler(args=args, name=func.name,
! filename=filename)
self.namespace = self.OPTIMIZED
if func.varargs:
--- 173,187 ----
def emit(self, *args):
! # XXX could just use self.emit = self.code.emit
! apply(self.code.emit, args)
def _generateFunctionOrLambdaCode(self, func):
self.name = func.name
!
# keep a lookout for 'def foo((x,y)):'
args, hasTupleArg = self.generateArglist(func.argnames)
! self.code = PyAssembler(args=args, name=func.name,
! filename=self.filename)
self.namespace = self.OPTIMIZED
if func.varargs:
***************
*** 192,197 ****
lnf = walk(func.code, LocalNameFinder(args), 0)
self.locals.push(lnf.getLocals())
! self.emit('SET_LINENO', func.lineno)
! if hasTupleArg:
self.generateArgUnpack(func.argnames)
walk(func.code, self)
--- 191,196 ----
lnf = walk(func.code, LocalNameFinder(args), 0)
self.locals.push(lnf.getLocals())
! self.emit('SET_LINENO', func.lineno)
! if hasTupleArg:
self.generateArgUnpack(func.argnames)
walk(func.code, self)
***************
*** 240,244 ****
def generateClassCode(self, klass):
self.code = PyAssembler(name=klass.name,
! filename=filename)
self.emit('SET_LINENO', klass.lineno)
lnf = walk(klass.code, LocalNameFinder(), 0)
--- 239,243 ----
def generateClassCode(self, klass):
self.code = PyAssembler(name=klass.name,
! filename=self.filename)
self.emit('SET_LINENO', klass.lineno)
lnf = walk(klass.code, LocalNameFinder(), 0)
***************
*** 255,259 ****
def isLocalName(self, name):
! return self.locals.top().has_elt(name)
def _nameOp(self, prefix, name):
--- 254,258 ----
def isLocalName(self, name):
! return self.locals.top().has_elt(name)
def _nameOp(self, prefix, name):
***************
*** 291,296 ****
def visitModule(self, node):
! lnf = walk(node.node, LocalNameFinder(), 0)
! self.locals.push(lnf.getLocals())
self.visit(node.node)
self.emit('LOAD_CONST', None)
--- 290,295 ----
def visitModule(self, node):
! lnf = walk(node.node, LocalNameFinder(), 0)
! self.locals.push(lnf.getLocals())
self.visit(node.node)
self.emit('LOAD_CONST', None)
***************
*** 354,366 ****
if hasattr(node, 'lineno'):
self.emit('SET_LINENO', node.lineno)
! self.visit(node.node)
! for arg in node.args:
! self.visit(arg)
if isinstance(arg, ast.Keyword):
kw = kw + 1
else:
pos = pos + 1
! self.emit('CALL_FUNCTION', kw << 8 | pos)
! return 1
def visitKeyword(self, node):
--- 353,365 ----
if hasattr(node, 'lineno'):
self.emit('SET_LINENO', node.lineno)
! self.visit(node.node)
! for arg in node.args:
! self.visit(arg)
if isinstance(arg, ast.Keyword):
kw = kw + 1
else:
pos = pos + 1
! self.emit('CALL_FUNCTION', kw << 8 | pos)
! return 1
def visitKeyword(self, node):
***************
*** 370,391 ****
def visitIf(self, node):
! after = StackRef()
! for test, suite in node.tests:
if hasattr(test, 'lineno'):
self.emit('SET_LINENO', test.lineno)
else:
print "warning", "no line number"
! self.visit(test)
! dest = StackRef()
! self.emit('JUMP_IF_FALSE', dest)
! self.emit('POP_TOP')
! self.visit(suite)
! self.emit('JUMP_FORWARD', after)
! dest.bind(self.code.getCurInst())
! self.emit('POP_TOP')
! if node.else_:
! self.visit(node.else_)
! after.bind(self.code.getCurInst())
! return 1
def startLoop(self):
--- 369,390 ----
def visitIf(self, node):
! after = StackRef()
! for test, suite in node.tests:
if hasattr(test, 'lineno'):
self.emit('SET_LINENO', test.lineno)
else:
print "warning", "no line number"
! self.visit(test)
! dest = StackRef()
! self.emit('JUMP_IF_FALSE', dest)
! self.emit('POP_TOP')
! self.visit(suite)
! self.emit('JUMP_FORWARD', after)
! dest.bind(self.code.getCurInst())
! self.emit('POP_TOP')
! if node.else_:
! self.visit(node.else_)
! after.bind(self.code.getCurInst())
! return 1
def startLoop(self):
***************
*** 517,578 ****
def visitCompare(self, node):
! """Comment from compile.c follows:
! The following code is generated for all but the last
! comparison in a chain:
!
! label: on stack: opcode: jump to:
!
! a <code to load b>
! a, b DUP_TOP
! a, b, b ROT_THREE
! b, a, b COMPARE_OP
! b, 0-or-1 JUMP_IF_FALSE L1
! b, 1 POP_TOP
! b
!
! We are now ready to repeat this sequence for the next
! comparison in the chain.
!
! For the last we generate:
!
! b <code to load c>
! b, c COMPARE_OP
! 0-or-1
!
! If there were any jumps to L1 (i.e., there was more than one
! comparison), we generate:
!
! 0-or-1 JUMP_FORWARD L2
! L1: b, 0 ROT_TWO
! 0, b POP_TOP
! 0
! L2: 0-or-1
! """
! self.visit(node.expr)
! # if refs are never emitted, subsequent bind call has no effect
! l1 = StackRef()
! l2 = StackRef()
! for op, code in node.ops[:-1]:
! # emit every comparison except the last
! self.visit(code)
! self.emit('DUP_TOP')
! self.emit('ROT_THREE')
! self.emit('COMPARE_OP', op)
# dupTop and compareOp cancel stack effect
! self.emit('JUMP_IF_FALSE', l1)
! self.emit('POP_TOP')
! if node.ops:
! # emit the last comparison
! op, code = node.ops[-1]
! self.visit(code)
! self.emit('COMPARE_OP', op)
! if len(node.ops) > 1:
! self.emit('JUMP_FORWARD', l2)
! l1.bind(self.code.getCurInst())
! self.emit('ROT_TWO')
! self.emit('POP_TOP')
! l2.bind(self.code.getCurInst())
! return 1
def visitGetattr(self, node):
--- 516,577 ----
def visitCompare(self, node):
! """Comment from compile.c follows:
! The following code is generated for all but the last
! comparison in a chain:
!
! label: on stack: opcode: jump to:
!
! a <code to load b>
! a, b DUP_TOP
! a, b, b ROT_THREE
! b, a, b COMPARE_OP
! b, 0-or-1 JUMP_IF_FALSE L1
! b, 1 POP_TOP
! b
!
! We are now ready to repeat this sequence for the next
! comparison in the chain.
!
! For the last we generate:
!
! b <code to load c>
! b, c COMPARE_OP
! 0-or-1
!
! If there were any jumps to L1 (i.e., there was more than one
! comparison), we generate:
!
! 0-or-1 JUMP_FORWARD L2
! L1: b, 0 ROT_TWO
! 0, b POP_TOP
! 0
! L2: 0-or-1
! """
! self.visit(node.expr)
! # if refs are never emitted, subsequent bind call has no effect
! l1 = StackRef()
! l2 = StackRef()
! for op, code in node.ops[:-1]:
! # emit every comparison except the last
! self.visit(code)
! self.emit('DUP_TOP')
! self.emit('ROT_THREE')
! self.emit('COMPARE_OP', op)
# dupTop and compareOp cancel stack effect
! self.emit('JUMP_IF_FALSE', l1)
! self.emit('POP_TOP')
! if node.ops:
! # emit the last comparison
! op, code = node.ops[-1]
! self.visit(code)
! self.emit('COMPARE_OP', op)
! if len(node.ops) > 1:
! self.emit('JUMP_FORWARD', l2)
! l1.bind(self.code.getCurInst())
! self.emit('ROT_TWO')
! self.emit('POP_TOP')
! l2.bind(self.code.getCurInst())
! return 1
def visitGetattr(self, node):
***************
*** 591,595 ****
elif node.flags == 'OP_ASSIGN':
self.emit('STORE_SUBSCR')
! elif node.flags == 'OP_DELETE':
self.emit('DELETE_SUBSCR')
return 1
--- 590,594 ----
elif node.flags == 'OP_ASSIGN':
self.emit('STORE_SUBSCR')
! elif node.flags == 'OP_DELETE':
self.emit('DELETE_SUBSCR')
return 1
***************
*** 625,633 ****
self.emit('SET_LINENO', node.lineno)
self.visit(node.expr)
! dups = len(node.nodes) - 1
for i in range(len(node.nodes)):
! elt = node.nodes[i]
! if i < dups:
! self.emit('DUP_TOP')
if isinstance(elt, ast.Node):
self.visit(elt)
--- 624,632 ----
self.emit('SET_LINENO', node.lineno)
self.visit(node.expr)
! dups = len(node.nodes) - 1
for i in range(len(node.nodes)):
! elt = node.nodes[i]
! if i < dups:
! self.emit('DUP_TOP')
if isinstance(elt, ast.Node):
self.visit(elt)
***************
*** 660,667 ****
def binaryOp(self, node, op):
! self.visit(node.left)
! self.visit(node.right)
! self.emit(op)
! return 1
def unaryOp(self, node, op):
--- 659,666 ----
def binaryOp(self, node, op):
! self.visit(node.left)
! self.visit(node.right)
! self.emit(op)
! return 1
def unaryOp(self, node, op):
***************
*** 671,696 ****
def visitAdd(self, node):
! return self.binaryOp(node, 'BINARY_ADD')
def visitSub(self, node):
! return self.binaryOp(node, 'BINARY_SUBTRACT')
def visitMul(self, node):
! return self.binaryOp(node, 'BINARY_MULTIPLY')
def visitDiv(self, node):
! return self.binaryOp(node, 'BINARY_DIVIDE')
def visitMod(self, node):
! return self.binaryOp(node, 'BINARY_MODULO')
def visitPower(self, node):
! return self.binaryOp(node, 'BINARY_POWER')
def visitLeftShift(self, node):
! return self.binaryOp(node, 'BINARY_LSHIFT')
def visitRightShift(self, node):
! return self.binaryOp(node, 'BINARY_RSHIFT')
def visitInvert(self, node):
--- 670,695 ----
def visitAdd(self, node):
! return self.binaryOp(node, 'BINARY_ADD')
def visitSub(self, node):
! return self.binaryOp(node, 'BINARY_SUBTRACT')
def visitMul(self, node):
! return self.binaryOp(node, 'BINARY_MULTIPLY')
def visitDiv(self, node):
! return self.binaryOp(node, 'BINARY_DIVIDE')
def visitMod(self, node):
! return self.binaryOp(node, 'BINARY_MODULO')
def visitPower(self, node):
! return self.binaryOp(node, 'BINARY_POWER')
def visitLeftShift(self, node):
! return self.binaryOp(node, 'BINARY_LSHIFT')
def visitRightShift(self, node):
! return self.binaryOp(node, 'BINARY_RSHIFT')
def visitInvert(self, node):
***************
*** 713,730 ****
def bitOp(self, nodes, op):
! self.visit(nodes[0])
! for node in nodes[1:]:
! self.visit(node)
! self.emit(op)
! return 1
def visitBitand(self, node):
! return self.bitOp(node.nodes, 'BINARY_AND')
def visitBitor(self, node):
! return self.bitOp(node.nodes, 'BINARY_OR')
def visitBitxor(self, node):
! return self.bitOp(node.nodes, 'BINARY_XOR')
def visitTest(self, node, jump):
--- 712,729 ----
def bitOp(self, nodes, op):
! self.visit(nodes[0])
! for node in nodes[1:]:
! self.visit(node)
! self.emit(op)
! return 1
def visitBitand(self, node):
! return self.bitOp(node.nodes, 'BINARY_AND')
def visitBitor(self, node):
! return self.bitOp(node.nodes, 'BINARY_OR')
def visitBitxor(self, node):
! return self.bitOp(node.nodes, 'BINARY_XOR')
def visitTest(self, node, jump):
***************
*** 739,758 ****
def visitAssert(self, node):
! # XXX __debug__ and AssertionError appear to be special cases
! # -- they are always loaded as globals even if there are local
! # names. I guess this is a sort of renaming op.
! skip = StackRef()
! self.emit('SET_LINENO', node.lineno)
! self.emit('LOAD_GLOBAL', '__debug__')
! self.emit('JUMP_IF_FALSE', skip)
! self.emit('POP_TOP')
! self.visit(node.test)
! self.emit('JUMP_IF_TRUE', skip)
! self.emit('LOAD_GLOBAL', 'AssertionError')
! self.visit(node.fail)
! self.emit('RAISE_VARARGS', 2)
! skip.bind(self.code.getCurInst())
! self.emit('POP_TOP')
! return 1
def visitAnd(self, node):
--- 738,757 ----
def visitAssert(self, node):
! # XXX __debug__ and AssertionError appear to be special cases
! # -- they are always loaded as globals even if there are local
! # names. I guess this is a sort of renaming op.
! skip = StackRef()
! self.emit('SET_LINENO', node.lineno)
! self.emit('LOAD_GLOBAL', '__debug__')
! self.emit('JUMP_IF_FALSE', skip)
! self.emit('POP_TOP')
! self.visit(node.test)
! self.emit('JUMP_IF_TRUE', skip)
! self.emit('LOAD_GLOBAL', 'AssertionError')
! self.visit(node.fail)
! self.emit('RAISE_VARARGS', 2)
! skip.bind(self.code.getCurInst())
! self.emit('POP_TOP')
! return 1
def visitAnd(self, node):
***************
*** 766,775 ****
def visitConst(self, node):
! self.emit('LOAD_CONST', node.value)
return 1
def visitEllipsis(self, node):
! self.emit('LOAD_CONST', Ellipsis)
! return 1
def visitTuple(self, node):
--- 765,774 ----
def visitConst(self, node):
! self.emit('LOAD_CONST', node.value)
return 1
def visitEllipsis(self, node):
! self.emit('LOAD_CONST', Ellipsis)
! return 1
def visitTuple(self, node):
***************
*** 786,850 ****
def visitDict(self, node):
! self.emit('BUILD_MAP', 0)
! for k, v in node.items:
! # XXX need to add set lineno when there aren't constants
! self.emit('DUP_TOP')
! self.visit(v)
! self.emit('ROT_TWO')
! self.visit(k)
! self.emit('STORE_SUBSCR')
! return 1
def visitReturn(self, node):
! self.emit('SET_LINENO', node.lineno)
! self.visit(node.value)
! self.emit('RETURN_VALUE')
! return 1
def visitRaise(self, node):
! self.emit('SET_LINENO', node.lineno)
! n = 0
! if node.expr1:
! self.visit(node.expr1)
! n = n + 1
! if node.expr2:
! self.visit(node.expr2)
! n = n + 1
! if node.expr3:
! self.visit(node.expr3)
! n = n + 1
! self.emit('RAISE_VARARGS', n)
! return 1
def visitPrint(self, node):
! self.emit('SET_LINENO', node.lineno)
! for child in node.nodes:
! self.visit(child)
! self.emit('PRINT_ITEM')
! return 1
def visitPrintnl(self, node):
! self.visitPrint(node)
! self.emit('PRINT_NEWLINE')
! return 1
def visitExec(self, node):
! self.visit(node.expr)
! if node.locals is None:
! self.emit('LOAD_CONST', None)
! else:
! self.visit(node.locals)
! if node.globals is None:
! self.emit('DUP_TOP')
! else:
! self.visit(node.globals)
! self.emit('EXEC_STMT')
class LocalNameFinder:
def __init__(self, names=()):
! self.names = misc.Set()
self.globals = misc.Set()
! for name in names:
! self.names.add(name)
def getLocals(self):
--- 785,849 ----
def visitDict(self, node):
! self.emit('BUILD_MAP', 0)
! for k, v in node.items:
! # XXX need to add set lineno when there aren't constants
! self.emit('DUP_TOP')
! self.visit(v)
! self.emit('ROT_TWO')
! self.visit(k)
! self.emit('STORE_SUBSCR')
! return 1
def visitReturn(self, node):
! self.emit('SET_LINENO', node.lineno)
! self.visit(node.value)
! self.emit('RETURN_VALUE')
! return 1
def visitRaise(self, node):
! self.emit('SET_LINENO', node.lineno)
! n = 0
! if node.expr1:
! self.visit(node.expr1)
! n = n + 1
! if node.expr2:
! self.visit(node.expr2)
! n = n + 1
! if node.expr3:
! self.visit(node.expr3)
! n = n + 1
! self.emit('RAISE_VARARGS', n)
! return 1
def visitPrint(self, node):
! self.emit('SET_LINENO', node.lineno)
! for child in node.nodes:
! self.visit(child)
! self.emit('PRINT_ITEM')
! return 1
def visitPrintnl(self, node):
! self.visitPrint(node)
! self.emit('PRINT_NEWLINE')
! return 1
def visitExec(self, node):
! self.visit(node.expr)
! if node.locals is None:
! self.emit('LOAD_CONST', None)
! else:
! self.visit(node.locals)
! if node.globals is None:
! self.emit('DUP_TOP')
! else:
! self.visit(node.globals)
! self.emit('EXEC_STMT')
class LocalNameFinder:
def __init__(self, names=()):
! self.names = misc.Set()
self.globals = misc.Set()
! for name in names:
! self.names.add(name)
def getLocals(self):
***************
*** 852,859 ****
if self.names.has_elt(elt):
self.names.remove(elt)
! return self.names
def visitDict(self, node):
! return 1
def visitGlobal(self, node):
--- 851,858 ----
if self.names.has_elt(elt):
self.names.remove(elt)
! return self.names
def visitDict(self, node):
! return 1
def visitGlobal(self, node):
***************
*** 864,868 ****
def visitFunction(self, node):
self.names.add(node.name)
! return 1
def visitLambda(self, node):
--- 863,867 ----
def visitFunction(self, node):
self.names.add(node.name)
! return 1
def visitLambda(self, node):
***************
*** 870,886 ****
def visitImport(self, node):
! for name in node.names:
! self.names.add(name)
def visitFrom(self, node):
! for name in node.names:
! self.names.add(name)
def visitClassdef(self, node):
! self.names.add(node.name)
! return 1
def visitAssName(self, node):
! self.names.add(node.name)
class Loop:
--- 869,885 ----
def visitImport(self, node):
! for name in node.names:
! self.names.add(name)
def visitFrom(self, node):
! for name in node.names:
! self.names.add(name)
def visitClassdef(self, node):
! self.names.add(node.name)
! return 1
def visitAssName(self, node):
! self.names.add(node.name)
class Loop:
***************
*** 927,931 ****
mtime = struct.pack('i', mtime)
return magic + mtime
!
if __name__ == "__main__":
import getopt
--- 926,936 ----
mtime = struct.pack('i', mtime)
return magic + mtime
!
! def compile(filename):
! buf = open(filename).read()
! mod = CompiledModule(buf, filename)
! mod.compile()
! mod.dump(filename + 'c')
!
if __name__ == "__main__":
import getopt
***************
*** 946,951 ****
if VERBOSE:
print filename
! buf = open(filename).read()
! mod = CompiledModule(buf, filename)
! mod.compile()
! mod.dump(filename + 'c')
--- 951,953 ----
if VERBOSE:
print filename
! compile(filename)