From 4e1be72e6babf857d9f263b087dae3123ac8efe1 Mon Sep 17 00:00:00 2001 From: Jeremy Hylton Date: Thu, 12 Oct 2000 20:23:23 +0000 Subject: 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 --- Lib/compiler/pyassem.py | 4 +++- Lib/compiler/pycodegen.py | 11 ++++++++--- Lib/compiler/transformer.py | 2 ++ Tools/compiler/compiler/pyassem.py | 4 +++- Tools/compiler/compiler/pycodegen.py | 11 ++++++++--- Tools/compiler/compiler/transformer.py | 2 ++ 6 files changed, 26 insertions(+), 8 deletions(-) diff --git a/Lib/compiler/pyassem.py b/Lib/compiler/pyassem.py index 74ea562..3411273 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 2a1b308..2888729 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 91d4b5b..c8a8518 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 74ea562..3411273 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 2a1b308..2888729 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 91d4b5b..c8a8518 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 -- cgit v0.12