From: Jeremy Hylton Date: Thu, 12 Oct 2000 20:23:23 +0000 (+0000) Subject: Fix SF bug #116263: support for from .. import * X-Git-Tag: v2.0~70 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4e1be72e6babf857d9f263b087dae3123ac8efe1;p=python Fix SF bug #116263: support for from .. import * transformer.py: return '*', None from com_import_as_name pycodegen.py: special case for name == '*' pyassem.py: fix stack counting for IMPORT_ opcodes --- diff --git a/Lib/compiler/pyassem.py b/Lib/compiler/pyassem.py index 74ea562f44..341127364b 100644 --- a/Lib/compiler/pyassem.py +++ b/Lib/compiler/pyassem.py @@ -515,12 +515,14 @@ class StackDepthTracker: 'BUILD_MAP': 1, 'COMPARE_OP': -1, 'STORE_FAST': -1, + 'IMPORT_STAR': -1, + 'IMPORT_NAME': 0, + 'IMPORT_FROM': 1, } # use pattern match patterns = [ ('BINARY_', -1), ('LOAD_', 1), - ('IMPORT_', 1), ] # special cases: diff --git a/Lib/compiler/pycodegen.py b/Lib/compiler/pycodegen.py index 2a1b3081c6..288872975a 100644 --- a/Lib/compiler/pycodegen.py +++ b/Lib/compiler/pycodegen.py @@ -439,9 +439,14 @@ class CodeGenerator: 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('IMPORT_STAR') + # There can only be one name w/ from ... import * + assert len(node.names) == 1 + return + else: + self.emit('IMPORT_FROM', name) + self._resolveDots(name) + self.storeName(alias or name) self.emit('POP_TOP') def _resolveDots(self, name): diff --git a/Lib/compiler/transformer.py b/Lib/compiler/transformer.py index 91d4b5b79d..c8a851865c 100644 --- a/Lib/compiler/transformer.py +++ b/Lib/compiler/transformer.py @@ -825,6 +825,8 @@ class Transformer: return dot, node[3][1] def com_import_as_name(self, node): + if node == '*': + return '*', None if node[0] == token.NAME: return node[1], None assert len(node) == 4 diff --git a/Tools/compiler/compiler/pyassem.py b/Tools/compiler/compiler/pyassem.py index 74ea562f44..341127364b 100644 --- a/Tools/compiler/compiler/pyassem.py +++ b/Tools/compiler/compiler/pyassem.py @@ -515,12 +515,14 @@ class StackDepthTracker: 'BUILD_MAP': 1, 'COMPARE_OP': -1, 'STORE_FAST': -1, + 'IMPORT_STAR': -1, + 'IMPORT_NAME': 0, + 'IMPORT_FROM': 1, } # use pattern match patterns = [ ('BINARY_', -1), ('LOAD_', 1), - ('IMPORT_', 1), ] # special cases: diff --git a/Tools/compiler/compiler/pycodegen.py b/Tools/compiler/compiler/pycodegen.py index 2a1b3081c6..288872975a 100644 --- a/Tools/compiler/compiler/pycodegen.py +++ b/Tools/compiler/compiler/pycodegen.py @@ -439,9 +439,14 @@ class CodeGenerator: 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('IMPORT_STAR') + # There can only be one name w/ from ... import * + assert len(node.names) == 1 + return + else: + self.emit('IMPORT_FROM', name) + self._resolveDots(name) + self.storeName(alias or name) self.emit('POP_TOP') def _resolveDots(self, name): diff --git a/Tools/compiler/compiler/transformer.py b/Tools/compiler/compiler/transformer.py index 91d4b5b79d..c8a851865c 100644 --- a/Tools/compiler/compiler/transformer.py +++ b/Tools/compiler/compiler/transformer.py @@ -825,6 +825,8 @@ class Transformer: return dot, node[3][1] def com_import_as_name(self, node): + if node == '*': + return '*', None if node[0] == token.NAME: return node[1], None assert len(node) == 4