Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 4e1be72

Browse files
committed
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
1 parent babe326 commit 4e1be72

6 files changed

Lines changed: 26 additions & 8 deletions

File tree

Lib/compiler/pyassem.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -515,12 +515,14 @@ def findDepth(self, insts):
515515
'BUILD_MAP': 1,
516516
'COMPARE_OP': -1,
517517
'STORE_FAST': -1,
518+
'IMPORT_STAR': -1,
519+
'IMPORT_NAME': 0,
520+
'IMPORT_FROM': 1,
518521
}
519522
# use pattern match
520523
patterns = [
521524
('BINARY_', -1),
522525
('LOAD_', 1),
523-
('IMPORT_', 1),
524526
]
525527

526528
# special cases:

Lib/compiler/pycodegen.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -439,9 +439,14 @@ def visitFrom(self, node):
439439
for name, alias in node.names:
440440
if name == '*':
441441
self.namespace = 0
442-
self.emit('IMPORT_FROM', name)
443-
self._resolveDots(name)
444-
self.storeName(alias or name)
442+
self.emit('IMPORT_STAR')
443+
# There can only be one name w/ from ... import *
444+
assert len(node.names) == 1
445+
return
446+
else:
447+
self.emit('IMPORT_FROM', name)
448+
self._resolveDots(name)
449+
self.storeName(alias or name)
445450
self.emit('POP_TOP')
446451

447452
def _resolveDots(self, name):

Lib/compiler/transformer.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -825,6 +825,8 @@ def com_dotted_as_name(self, node):
825825
return dot, node[3][1]
826826

827827
def com_import_as_name(self, node):
828+
if node == '*':
829+
return '*', None
828830
if node[0] == token.NAME:
829831
return node[1], None
830832
assert len(node) == 4

Tools/compiler/compiler/pyassem.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -515,12 +515,14 @@ def findDepth(self, insts):
515515
'BUILD_MAP': 1,
516516
'COMPARE_OP': -1,
517517
'STORE_FAST': -1,
518+
'IMPORT_STAR': -1,
519+
'IMPORT_NAME': 0,
520+
'IMPORT_FROM': 1,
518521
}
519522
# use pattern match
520523
patterns = [
521524
('BINARY_', -1),
522525
('LOAD_', 1),
523-
('IMPORT_', 1),
524526
]
525527

526528
# special cases:

Tools/compiler/compiler/pycodegen.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -439,9 +439,14 @@ def visitFrom(self, node):
439439
for name, alias in node.names:
440440
if name == '*':
441441
self.namespace = 0
442-
self.emit('IMPORT_FROM', name)
443-
self._resolveDots(name)
444-
self.storeName(alias or name)
442+
self.emit('IMPORT_STAR')
443+
# There can only be one name w/ from ... import *
444+
assert len(node.names) == 1
445+
return
446+
else:
447+
self.emit('IMPORT_FROM', name)
448+
self._resolveDots(name)
449+
self.storeName(alias or name)
445450
self.emit('POP_TOP')
446451

447452
def _resolveDots(self, name):

Tools/compiler/compiler/transformer.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -825,6 +825,8 @@ def com_dotted_as_name(self, node):
825825
return dot, node[3][1]
826826

827827
def com_import_as_name(self, node):
828+
if node == '*':
829+
return '*', None
828830
if node[0] == token.NAME:
829831
return node[1], None
830832
assert len(node) == 4

0 commit comments

Comments
 (0)