You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-04 01:09:52 +08:00
WIP: start 3.6 MAKE_FUNCTION handling
This commit is contained in:
@@ -701,7 +701,10 @@ class Python3Parser(PythonParser):
|
|||||||
rule = 'unpack_list ::= ' + opname + ' designator' * token.attr
|
rule = 'unpack_list ::= ' + opname + ' designator' * token.attr
|
||||||
elif opname_base.startswith('MAKE_FUNCTION'):
|
elif opname_base.startswith('MAKE_FUNCTION'):
|
||||||
# DRY with MAKE_CLOSURE
|
# 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 "
|
rule_pat = ("genexpr ::= %sload_genexpr %%s%s expr "
|
||||||
"GET_ITER CALL_FUNCTION_1" % ('pos_arg '* args_pos, opname))
|
"GET_ITER CALL_FUNCTION_1" % ('pos_arg '* args_pos, opname))
|
||||||
|
@@ -130,6 +130,13 @@ class Scanner3(Scanner):
|
|||||||
varargs_ops.add(self.opc.CALL_METHOD)
|
varargs_ops.add(self.opc.CALL_METHOD)
|
||||||
if self.version >= 3.6:
|
if self.version >= 3.6:
|
||||||
varargs_ops.add(self.opc.BUILD_CONST_KEY_MAP)
|
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)
|
self.varargs_ops = frozenset(varargs_ops)
|
||||||
# FIXME: remove the above in favor of:
|
# FIXME: remove the above in favor of:
|
||||||
@@ -271,20 +278,37 @@ class Scanner3(Scanner):
|
|||||||
pattr = const
|
pattr = const
|
||||||
pass
|
pass
|
||||||
elif opname in ('MAKE_FUNCTION', 'MAKE_CLOSURE'):
|
elif opname in ('MAKE_FUNCTION', 'MAKE_CLOSURE'):
|
||||||
pos_args, name_pair_args, annotate_args = parse_fn_counts(inst.argval)
|
if self.version >= 3.6:
|
||||||
if name_pair_args > 0:
|
# 3.6+ doesn't have MAKE_CLOSURE, so opname == 'MAKE_CLOSURE'
|
||||||
opname = '%s_N%d' % (opname, name_pair_args)
|
flags = inst.argval
|
||||||
pass
|
opname = 'MAKE_FUNCTION_%d' % (flags)
|
||||||
if annotate_args > 0:
|
attr = []
|
||||||
opname = '%s_A_%d' % (opname, annotate_args)
|
for tup in self.MAKE_FUNCTION_FLAGS:
|
||||||
pass
|
bit = flags & 1
|
||||||
opname = '%s_%d' % (opname, pos_args)
|
if bit:
|
||||||
pattr = ("%d positional, %d keyword pair, %d annotated" %
|
if pattr:
|
||||||
(pos_args, name_pair_args, annotate_args))
|
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(
|
tokens.append(
|
||||||
Token(
|
Token(
|
||||||
type_ = opname,
|
type_ = opname,
|
||||||
attr = (pos_args, name_pair_args, annotate_args),
|
attr = attr,
|
||||||
pattr = pattr,
|
pattr = pattr,
|
||||||
offset = inst.offset,
|
offset = inst.offset,
|
||||||
linestart = inst.starts_line,
|
linestart = inst.starts_line,
|
||||||
|
@@ -461,7 +461,17 @@ def make_function3(self, node, isLambda, nested=1, codeNode=None):
|
|||||||
defparams = node[:args_node.attr[0]]
|
defparams = node[:args_node.attr[0]]
|
||||||
pos_args, kw_args, annotate_argc = args_node.attr
|
pos_args, kw_args, annotate_argc = args_node.attr
|
||||||
else:
|
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
|
kw_args = 0
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user