mirror of
https://github.com/python/cpython.git
synced 2025-10-17 12:18:23 +00:00
patches from Mark Hammond
Attached is a set of diffs for the .py compiler that adds support for the new extended call syntax. compiler/ast.py: CallFunc node gets 2 new children to support extended call syntax - "star_args" (for "*args") and "dstar_args" (for "**args") compiler/pyassem.py It appear that self.lnotab is supposed to be responsible for tracking line numbers, but self.firstlineno was still hanging around. Removed self.firstlineno completely. NOTE - I didnt actually test that the generated code has the correct line numbers!! Stack depth tracking appeared a little broken - the checks never made it beyond the "self.patterns" check - thus, the custom methods were never called! Fixed this. (XXX Jeremy notes: I think this code is still broken because it doesn't track stack effects across block bounaries.) Added support for the new extended call syntax opcodes for depth calculations. compiler/pycodegen.py Added support for the new extended call syntax opcodes. compiler/transformer.py Added support for the new extended call syntax.
This commit is contained in:
parent
0a4f1ff64e
commit
be317e615e
8 changed files with 116 additions and 28 deletions
|
@ -984,10 +984,32 @@ class Transformer:
|
|||
return Node('call_func', primaryNode, [ ])
|
||||
args = [ ]
|
||||
kw = 0
|
||||
for i in range(1, len(nodelist), 2):
|
||||
kw, result = self.com_argument(nodelist[i], kw)
|
||||
len_nodelist = len(nodelist)
|
||||
for i in range(1, len_nodelist, 2):
|
||||
node = nodelist[i]
|
||||
if node[0] == token.STAR or node[0] == token.DOUBLESTAR:
|
||||
break
|
||||
kw, result = self.com_argument(node, kw)
|
||||
args.append(result)
|
||||
return Node('call_func', primaryNode, args)
|
||||
else:
|
||||
i = i + 1 # No broken by star arg, so skip the last one we processed.
|
||||
star_node = dstar_node = None
|
||||
while i < len_nodelist:
|
||||
tok = nodelist[i]
|
||||
ch = nodelist[i+1]
|
||||
i = i + 3
|
||||
if tok[0]==token.STAR:
|
||||
if star_node is not None:
|
||||
raise SyntaxError, 'already have the varargs indentifier'
|
||||
star_node = self.com_node(ch)
|
||||
elif tok[0]==token.DOUBLESTAR:
|
||||
if dstar_node is not None:
|
||||
raise SyntaxError, 'already have the kwargs indentifier'
|
||||
dstar_node = self.com_node(ch)
|
||||
else:
|
||||
raise SyntaxError, 'unknown node type: %s' % tok
|
||||
|
||||
return Node('call_func', primaryNode, args, star_node, dstar_node)
|
||||
|
||||
def com_argument(self, nodelist, kw):
|
||||
if len(nodelist) == 2:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue