]> granicus.if.org Git - python/commitdiff
Update magic number.
authorJeremy Hylton <jeremy@alum.mit.edu>
Fri, 1 Sep 2000 20:33:26 +0000 (20:33 +0000)
committerJeremy Hylton <jeremy@alum.mit.edu>
Fri, 1 Sep 2000 20:33:26 +0000 (20:33 +0000)
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.

Lib/compiler/pycodegen.py
Lib/compiler/transformer.py
Tools/compiler/compiler/pycodegen.py
Tools/compiler/compiler/transformer.py

index 9d9b9825518250faa126b365b95735f893401c1c..a4c9e5b18f50267edf46253d180528e8510601ee 100644 (file)
@@ -1,6 +1,7 @@
 import os
 import marshal
 import stat
+import string
 import struct
 import types
 from cStringIO import StringIO
@@ -44,7 +45,7 @@ class Module:
         f.write(self.getPycHeader())
         marshal.dump(self.code, f)
 
-    MAGIC = (50811 | (ord('\r')<<16) | (ord('\n')<<24))
+    MAGIC = (50823 | (ord('\r')<<16) | (ord('\n')<<24))
 
     def getPycHeader(self):
         # compile.c uses marshal to write a long directly, with
@@ -420,19 +421,32 @@ class CodeGenerator:
 
     def visitImport(self, node):
         self.set_lineno(node)
-        for name in node.names:
+        for name, alias in node.names:
+            self.emit('LOAD_CONST', None)
             self.emit('IMPORT_NAME', name)
-            self.storeName(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 in node.names:
+        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)
         self.emit('LOAD_ATTR', node.attrname)
@@ -787,12 +801,12 @@ class LocalNameFinder:
         pass
 
     def visitImport(self, node):
-        for name in node.names:
-            self.names.add(name)
+        for name, alias in node.names:
+            self.names.add(alias or name)
 
     def visitFrom(self, node):
-        for name in node.names:
-            self.names.add(name)
+        for name, alias in node.names:
+            self.names.add(alias or name)
 
     def visitClass(self, node):
         self.names.add(node.name)
index 16d1d8ba4c6d9eb3fcc654bb4864eb89e09e5ea9..9562aa68a6825ff7aa5b209334f42ebbc9291356 100644 (file)
@@ -402,19 +402,20 @@ class Transformer:
     return n
 
   def import_stmt(self, nodelist):
-    # import: dotted_name (',' dotted_name)* |
-    # from: dotted_name 'import' ('*' | NAME (',' NAME)*)
-    names = [ ]
-    if nodelist[0][1][0] == 'f':
+    # 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):
-        # note: nodelist[i] could be (token.STAR, '*') or (token.NAME, name)
-        names.append(nodelist[i][1])
+        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]
       return n
 
     for i in range(1, len(nodelist), 2):
-      names.append(self.com_dotted_name(nodelist[i]))
+      names.append(self.com_dotted_as_name(nodelist[i]))
     n = Node('import', names)
     n.lineno = nodelist[0][2]
     return n
@@ -738,6 +739,7 @@ class Transformer:
     if node[0] not in _legal_node_types:
       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:])
 
   def com_arglist(self, nodelist):
@@ -814,6 +816,22 @@ class Transformer:
         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):
     bases = [ ]
     for i in range(1, len(node), 2):
index 9d9b9825518250faa126b365b95735f893401c1c..a4c9e5b18f50267edf46253d180528e8510601ee 100644 (file)
@@ -1,6 +1,7 @@
 import os
 import marshal
 import stat
+import string
 import struct
 import types
 from cStringIO import StringIO
@@ -44,7 +45,7 @@ class Module:
         f.write(self.getPycHeader())
         marshal.dump(self.code, f)
 
-    MAGIC = (50811 | (ord('\r')<<16) | (ord('\n')<<24))
+    MAGIC = (50823 | (ord('\r')<<16) | (ord('\n')<<24))
 
     def getPycHeader(self):
         # compile.c uses marshal to write a long directly, with
@@ -420,19 +421,32 @@ class CodeGenerator:
 
     def visitImport(self, node):
         self.set_lineno(node)
-        for name in node.names:
+        for name, alias in node.names:
+            self.emit('LOAD_CONST', None)
             self.emit('IMPORT_NAME', name)
-            self.storeName(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 in node.names:
+        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)
         self.emit('LOAD_ATTR', node.attrname)
@@ -787,12 +801,12 @@ class LocalNameFinder:
         pass
 
     def visitImport(self, node):
-        for name in node.names:
-            self.names.add(name)
+        for name, alias in node.names:
+            self.names.add(alias or name)
 
     def visitFrom(self, node):
-        for name in node.names:
-            self.names.add(name)
+        for name, alias in node.names:
+            self.names.add(alias or name)
 
     def visitClass(self, node):
         self.names.add(node.name)
index 16d1d8ba4c6d9eb3fcc654bb4864eb89e09e5ea9..9562aa68a6825ff7aa5b209334f42ebbc9291356 100644 (file)
@@ -402,19 +402,20 @@ class Transformer:
     return n
 
   def import_stmt(self, nodelist):
-    # import: dotted_name (',' dotted_name)* |
-    # from: dotted_name 'import' ('*' | NAME (',' NAME)*)
-    names = [ ]
-    if nodelist[0][1][0] == 'f':
+    # 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):
-        # note: nodelist[i] could be (token.STAR, '*') or (token.NAME, name)
-        names.append(nodelist[i][1])
+        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]
       return n
 
     for i in range(1, len(nodelist), 2):
-      names.append(self.com_dotted_name(nodelist[i]))
+      names.append(self.com_dotted_as_name(nodelist[i]))
     n = Node('import', names)
     n.lineno = nodelist[0][2]
     return n
@@ -738,6 +739,7 @@ class Transformer:
     if node[0] not in _legal_node_types:
       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:])
 
   def com_arglist(self, nodelist):
@@ -814,6 +816,22 @@ class Transformer:
         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):
     bases = [ ]
     for i in range(1, len(node), 2):