WIP: start 3.6 MAKE_FUNCTION handling

This commit is contained in:
rocky
2017-05-11 07:00:46 -04:00
parent e9a17010c7
commit d540146d5a
3 changed files with 50 additions and 13 deletions

View File

@@ -701,7 +701,10 @@ class Python3Parser(PythonParser):
rule = 'unpack_list ::= ' + opname + ' designator' * token.attr
elif opname_base.startswith('MAKE_FUNCTION'):
# DRY with MAKE_CLOSURE
args_pos, args_kw, annotate_args = token.attr
if self.version < 3.6:
args_pos, args_kw, annotate_args = token.attr
else:
args_pos, args_kw, annotate_args, closure = token.attr
rule_pat = ("genexpr ::= %sload_genexpr %%s%s expr "
"GET_ITER CALL_FUNCTION_1" % ('pos_arg '* args_pos, opname))

View File

@@ -130,6 +130,13 @@ class Scanner3(Scanner):
varargs_ops.add(self.opc.CALL_METHOD)
if self.version >= 3.6:
varargs_ops.add(self.opc.BUILD_CONST_KEY_MAP)
# Below is in bit order, "defaultt = bit 0, closure = bit 3
self.MAKE_FUNCTION_FLAGS = (
("default", 'D'),
("keyword-only", "K"),
("annotation", "A"),
("closure", "C")
)
self.varargs_ops = frozenset(varargs_ops)
# FIXME: remove the above in favor of:
@@ -271,20 +278,37 @@ class Scanner3(Scanner):
pattr = const
pass
elif opname in ('MAKE_FUNCTION', 'MAKE_CLOSURE'):
pos_args, name_pair_args, annotate_args = parse_fn_counts(inst.argval)
if name_pair_args > 0:
opname = '%s_N%d' % (opname, name_pair_args)
pass
if annotate_args > 0:
opname = '%s_A_%d' % (opname, annotate_args)
pass
opname = '%s_%d' % (opname, pos_args)
pattr = ("%d positional, %d keyword pair, %d annotated" %
(pos_args, name_pair_args, annotate_args))
if self.version >= 3.6:
# 3.6+ doesn't have MAKE_CLOSURE, so opname == 'MAKE_CLOSURE'
flags = inst.argval
opname = 'MAKE_FUNCTION_%d' % (flags)
attr = []
for tup in self.MAKE_FUNCTION_FLAGS:
bit = flags & 1
if bit:
if pattr:
pattr += ", " + tup[0]
else:
pattr += tup[0]
attr.append(bit)
flags >>= 1
attr = attr[:4] # remove last value: attr[5] == False
else:
pos_args, name_pair_args, annotate_args = parse_fn_counts(inst.argval)
pattr = ("%d positional, %d keyword pair, %d annotated" %
(pos_args, name_pair_args, annotate_args))
if name_pair_args > 0:
opname = '%s_N%d' % (opname, name_pair_args)
pass
if annotate_args > 0:
opname = '%s_A_%d' % (opname, annotate_args)
pass
opname = '%s_%d' % (opname, pos_args)
attr = (pos_args, name_pair_args, annotate_args)
tokens.append(
Token(
type_ = opname,
attr = (pos_args, name_pair_args, annotate_args),
attr = attr,
pattr = pattr,
offset = inst.offset,
linestart = inst.starts_line,

View File

@@ -461,7 +461,17 @@ def make_function3(self, node, isLambda, nested=1, codeNode=None):
defparams = node[:args_node.attr[0]]
pos_args, kw_args, annotate_argc = args_node.attr
else:
defparams = node[:args_node.attr]
if self.version < 3.6:
defparams = node[:args_node.attr]
else:
default, kw, annotate, closure = args_node.attr
# FIXME: start here.
defparams = []
# if default:
# defparams = node[-(2 + kw + annotate + closure)]
# else:
# defparams = []
kw_args = 0
pass