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
This commit is contained in:
Jeremy Hylton 2000-10-12 20:23:23 +00:00
parent babe326c65
commit 4e1be72e6b
6 changed files with 26 additions and 8 deletions

View file

@ -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:

View file

@ -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):

View file

@ -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

View file

@ -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:

View file

@ -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):

View file

@ -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