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