[Python-checkins] CVS: python/dist/src/Tools/compiler/compiler pycodegen.py,1.22,1.23 transformer.py,1.12,1.13

Jeremy Hylton python-dev@python.org
Fri, 1 Sep 2000 13:33:29 -0700


Update of /cvsroot/python/python/dist/src/Tools/compiler/compiler
In directory slayer.i.sourceforge.net:/tmp/cvs-serv5706/compiler

Modified Files:
	pycodegen.py transformer.py 
Log Message:
Update magic number.

Fix import support to work with import as variant of Python 2.0.  The
grammar for import changed, requiring changes in transformer and code
generator, even to handle compilation of imports with as.



Index: pycodegen.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Tools/compiler/compiler/pycodegen.py,v
retrieving revision 1.22
retrieving revision 1.23
diff -C2 -r1.22 -r1.23
*** pycodegen.py	2000/08/12 20:32:46	1.22
--- pycodegen.py	2000/09/01 20:33:26	1.23
***************
*** 2,5 ****
--- 2,6 ----
  import marshal
  import stat
+ import string
  import struct
  import types
***************
*** 45,49 ****
          marshal.dump(self.code, f)
  
!     MAGIC = (50811 | (ord('\r')<<16) | (ord('\n')<<24))
  
      def getPycHeader(self):
--- 46,50 ----
          marshal.dump(self.code, f)
  
!     MAGIC = (50823 | (ord('\r')<<16) | (ord('\n')<<24))
  
      def getPycHeader(self):
***************
*** 421,437 ****
      def visitImport(self, node):
          self.set_lineno(node)
!         for name in node.names:
              self.emit('IMPORT_NAME', name)
!             self.storeName(name)
  
      def visitFrom(self, node):
          self.set_lineno(node)
          self.emit('IMPORT_NAME', node.modname)
!         for name in node.names:
              if name == '*':
                  self.namespace = 0
              self.emit('IMPORT_FROM', name)
          self.emit('POP_TOP')
  
      def visitGetattr(self, node):
          self.visit(node.expr)
--- 422,451 ----
      def visitImport(self, node):
          self.set_lineno(node)
!         for name, alias in node.names:
!             self.emit('LOAD_CONST', None)
              self.emit('IMPORT_NAME', name)
!             self._resolveDots(name)
!             self.storeName(alias or name)
  
      def visitFrom(self, node):
          self.set_lineno(node)
+         fromlist = map(lambda (name, alias): name, node.names)
+         self.emit('LOAD_CONST', tuple(fromlist))
          self.emit('IMPORT_NAME', node.modname)
!         for name, alias in node.names:
              if name == '*':
                  self.namespace = 0
              self.emit('IMPORT_FROM', name)
+             self._resolveDots(name)
+             self.storeName(alias or name)
          self.emit('POP_TOP')
  
+     def _resolveDots(self, name):
+         elts = string.split(name, ".")
+         if len(elts) == 1:
+             return
+         for elt in elts[1:]:
+             self.emit('LOAD_ATTR', elt)
+ 
      def visitGetattr(self, node):
          self.visit(node.expr)
***************
*** 788,797 ****
  
      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 visitClass(self, node):
--- 802,811 ----
  
      def visitImport(self, node):
!         for name, alias in node.names:
!             self.names.add(alias or name)
  
      def visitFrom(self, node):
!         for name, alias in node.names:
!             self.names.add(alias or name)
  
      def visitClass(self, node):

Index: transformer.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Tools/compiler/compiler/transformer.py,v
retrieving revision 1.12
retrieving revision 1.13
diff -C2 -r1.12 -r1.13
*** transformer.py	2000/08/04 16:54:54	1.12
--- transformer.py	2000/09/01 20:33:26	1.13
***************
*** 403,413 ****
  
    def import_stmt(self, nodelist):
!     # import: dotted_name (',' dotted_name)* |
!     # from: dotted_name 'import' ('*' | NAME (',' NAME)*)
!     names = [ ]
!     if nodelist[0][1][0] == 'f':
        for i in range(3, len(nodelist), 2):
!         # note: nodelist[i] could be (token.STAR, '*') or (token.NAME, name)
!         names.append(nodelist[i][1])
        n = Node('from', self.com_dotted_name(nodelist[1]), names)
        n.lineno = nodelist[0][2]
--- 403,414 ----
  
    def import_stmt(self, nodelist):
!     # import_stmt: 'import' dotted_as_name (',' dotted_as_name)* |
!     # from: 'from' dotted_name 'import'
!     #                        ('*' | import_as_name (',' import_as_name)*)
!     names = []
!     is_as = 0
!     if nodelist[0][1] == 'from':
        for i in range(3, len(nodelist), 2):
!         names.append(self.com_import_as_name(nodelist[i][1]))
        n = Node('from', self.com_dotted_name(nodelist[1]), names)
        n.lineno = nodelist[0][2]
***************
*** 415,419 ****
  
      for i in range(1, len(nodelist), 2):
!       names.append(self.com_dotted_name(nodelist[i]))
      n = Node('import', names)
      n.lineno = nodelist[0][2]
--- 416,420 ----
  
      for i in range(1, len(nodelist), 2):
!       names.append(self.com_dotted_as_name(nodelist[i]))
      n = Node('import', names)
      n.lineno = nodelist[0][2]
***************
*** 739,742 ****
--- 740,744 ----
        raise error, 'illegal node passed to com_node: %s' % node[0]
  
+ #    print "dispatch", self._dispatch[node[0]].__name__, node
      return self._dispatch[node[0]](node[1:])
  
***************
*** 814,817 ****
--- 816,835 ----
          name = name + n[1] + '.'
      return name[:-1]
+ 
+   def com_dotted_as_name(self, node):
+     dot = self.com_dotted_name(node[1])
+     if len(node) == 2:
+       return dot, None
+     assert node[2][1] == 'as'
+     assert node[3][0] == token.NAME
+     return dot, node[3][1]
+ 
+   def com_import_as_name(self, node):
+     if node[0] == token.NAME:
+       return node[1], None
+     assert len(node) == 4
+     assert node[2][1] == 'as'
+     assert node[3][0] == token.NAME
+     return node[1][1], node[3][1]
  
    def com_bases(self, node):