You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-03 00:45:53 +08:00
add pos_arg ::= expr to make params of fns clear
This commit is contained in:
@@ -435,6 +435,9 @@ class PythonParser(GenericASTBuilder):
|
|||||||
exprlist ::= exprlist expr
|
exprlist ::= exprlist expr
|
||||||
exprlist ::= expr
|
exprlist ::= expr
|
||||||
|
|
||||||
|
# Positional arguments in make_function
|
||||||
|
pos_arg ::= expr
|
||||||
|
|
||||||
nullexprlist ::=
|
nullexprlist ::=
|
||||||
|
|
||||||
expr32 ::= expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr
|
expr32 ::= expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr expr
|
||||||
|
@@ -337,7 +337,7 @@ class Python2Parser(PythonParser):
|
|||||||
'''
|
'''
|
||||||
|
|
||||||
def add_custom_rules(self, tokens, customize):
|
def add_custom_rules(self, tokens, customize):
|
||||||
"""
|
'''
|
||||||
Special handling for opcodes that take a variable number
|
Special handling for opcodes that take a variable number
|
||||||
of arguments -- we add a new rule for each:
|
of arguments -- we add a new rule for each:
|
||||||
|
|
||||||
@@ -354,7 +354,7 @@ class Python2Parser(PythonParser):
|
|||||||
expr ::= expr {expr}^n CALL_FUNCTION_VAR_n POP_TOP
|
expr ::= expr {expr}^n CALL_FUNCTION_VAR_n POP_TOP
|
||||||
expr ::= expr {expr}^n CALL_FUNCTION_VAR_KW_n POP_TOP
|
expr ::= expr {expr}^n CALL_FUNCTION_VAR_KW_n POP_TOP
|
||||||
expr ::= expr {expr}^n CALL_FUNCTION_KW_n POP_TOP
|
expr ::= expr {expr}^n CALL_FUNCTION_KW_n POP_TOP
|
||||||
"""
|
'''
|
||||||
for k, v in list(customize.items()):
|
for k, v in list(customize.items()):
|
||||||
# avoid adding the same rule twice to this parser
|
# avoid adding the same rule twice to this parser
|
||||||
if k in self.customized:
|
if k in self.customized:
|
||||||
@@ -375,7 +375,7 @@ class Python2Parser(PythonParser):
|
|||||||
# rule = 'dup_topx ::= ' + 'expr '*v + k
|
# rule = 'dup_topx ::= ' + 'expr '*v + k
|
||||||
elif op == 'MAKE_FUNCTION':
|
elif op == 'MAKE_FUNCTION':
|
||||||
self.addRule('mklambda ::= %s LOAD_LAMBDA %s' %
|
self.addRule('mklambda ::= %s LOAD_LAMBDA %s' %
|
||||||
('expr '*v, k), nop_func)
|
('pos_arg '*v, k), nop_func)
|
||||||
rule = 'mkfunc ::= %s LOAD_CONST %s' % ('expr '*v, k)
|
rule = 'mkfunc ::= %s LOAD_CONST %s' % ('expr '*v, k)
|
||||||
elif op == 'MAKE_CLOSURE':
|
elif op == 'MAKE_CLOSURE':
|
||||||
self.addRule('mklambda ::= %s load_closure LOAD_LAMBDA %s' %
|
self.addRule('mklambda ::= %s load_closure LOAD_LAMBDA %s' %
|
||||||
|
@@ -368,7 +368,7 @@ class Python3Parser(PythonParser):
|
|||||||
return 'CALL_FUNCTION_%i' % token.attr
|
return 'CALL_FUNCTION_%i' % token.attr
|
||||||
|
|
||||||
def custom_build_class_rule(self, opname, i, token, tokens, customize):
|
def custom_build_class_rule(self, opname, i, token, tokens, customize):
|
||||||
"""
|
'''
|
||||||
# Should the first rule be somehow folded into the 2nd one?
|
# Should the first rule be somehow folded into the 2nd one?
|
||||||
build_class ::= LOAD_BUILD_CLASS mkfunc
|
build_class ::= LOAD_BUILD_CLASS mkfunc
|
||||||
LOAD_CLASSNAME {expr}^n CALL_FUNCTION_n+2
|
LOAD_CLASSNAME {expr}^n CALL_FUNCTION_n+2
|
||||||
@@ -377,7 +377,7 @@ class Python3Parser(PythonParser):
|
|||||||
expr
|
expr
|
||||||
call_function
|
call_function
|
||||||
CALL_FUNCTION_3
|
CALL_FUNCTION_3
|
||||||
"""
|
'''
|
||||||
# FIXME: I bet this can be simplified
|
# FIXME: I bet this can be simplified
|
||||||
# look for next MAKE_FUNCTION
|
# look for next MAKE_FUNCTION
|
||||||
for i in range(i+1, len(tokens)):
|
for i in range(i+1, len(tokens)):
|
||||||
@@ -422,7 +422,7 @@ class Python3Parser(PythonParser):
|
|||||||
nak = ( len(opname)-len('CALL_FUNCTION') ) // 3
|
nak = ( len(opname)-len('CALL_FUNCTION') ) // 3
|
||||||
token.type = self.call_fn_name(token)
|
token.type = self.call_fn_name(token)
|
||||||
rule = ('call_function ::= expr '
|
rule = ('call_function ::= expr '
|
||||||
+ ('expr ' * args_pos)
|
+ ('pos_arg ' * args_pos)
|
||||||
+ ('kwarg ' * args_kw)
|
+ ('kwarg ' * args_kw)
|
||||||
+ 'expr ' * nak + token.type)
|
+ 'expr ' * nak + token.type)
|
||||||
self.add_unique_rule(rule, token.type, args_pos, customize)
|
self.add_unique_rule(rule, token.type, args_pos, customize)
|
||||||
@@ -432,13 +432,22 @@ class Python3Parser(PythonParser):
|
|||||||
Special handling for opcodes that take a variable number
|
Special handling for opcodes that take a variable number
|
||||||
of arguments -- we add a new rule for each:
|
of arguments -- we add a new rule for each:
|
||||||
|
|
||||||
Python 3.4:
|
Python 3.4+:
|
||||||
listcomp ::= LOAD_LISTCOMP LOAD_CONST MAKE_FUNCTION_0 expr
|
listcomp ::= LOAD_LISTCOMP LOAD_CONST MAKE_FUNCTION_0 expr
|
||||||
GET_ITER CALL_FUNCTION_1
|
GET_ITER CALL_FUNCTION_1
|
||||||
|
listcomp ::= {expr}^n LOAD_LISTCOMP MAKE_CLOSURE
|
||||||
|
GET_ITER CALL_FUNCTION_1
|
||||||
Python < 3.4
|
Python < 3.4
|
||||||
listcomp ::= LOAD_LISTCOMP MAKE_FUNCTION_0 expr
|
listcomp ::= LOAD_LISTCOMP MAKE_FUNCTION_0 expr
|
||||||
GET_ITER CALL_FUNCTION_1
|
GET_ITER CALL_FUNCTION_1
|
||||||
|
|
||||||
|
|
||||||
|
setcomp ::= {expr}^n LOAD_SETCOMP MAKE_CLOSURE
|
||||||
|
GET_ITER CALL_FUNCTION_1
|
||||||
|
|
||||||
|
dictcomp ::= LOAD_DICTCOMP MAKE_FUNCTION_0 expr
|
||||||
|
GET_ITER CALL_FUNCTION_1
|
||||||
|
|
||||||
# build_class (see load_build_class)
|
# build_class (see load_build_class)
|
||||||
|
|
||||||
build_list ::= {expr}^n BUILD_LIST_n
|
build_list ::= {expr}^n BUILD_LIST_n
|
||||||
@@ -450,11 +459,11 @@ class Python3Parser(PythonParser):
|
|||||||
unpack ::= UNPACK_TUPLE {expr}^n
|
unpack ::= UNPACK_TUPLE {expr}^n
|
||||||
unpack ::= UNPACK_SEQEUENCE {expr}^n
|
unpack ::= UNPACK_SEQEUENCE {expr}^n
|
||||||
|
|
||||||
mkfunc ::= {expr}^n LOAD_CONST MAKE_FUNCTION_n
|
mkfunc ::= {pos_arg}^n LOAD_CONST MAKE_FUNCTION_n
|
||||||
mklambda ::= {expr}^n LOAD_LAMBDA MAKE_FUNCTION_n
|
mklambda ::= {pos_arg}^n LOAD_LAMBDA MAKE_FUNCTION_n
|
||||||
mkfunc ::= {expr}^n load_closure LOAD_CONST MAKE_FUNCTION_n
|
mkfunc ::= {pos_arg}^n load_closure LOAD_CONST MAKE_FUNCTION_n
|
||||||
|
|
||||||
listcomp ::= load_closure expr GET_ITER CALL_FUNCTION_1"
|
listcomp ::= load_closure expr GET_ITER CALL_FUNCTION_1
|
||||||
|
|
||||||
# call_function (see custom_classfunc_rule)
|
# call_function (see custom_classfunc_rule)
|
||||||
"""
|
"""
|
||||||
@@ -500,52 +509,49 @@ class Python3Parser(PythonParser):
|
|||||||
elif opname_base.startswith('MAKE_FUNCTION'):
|
elif opname_base.startswith('MAKE_FUNCTION'):
|
||||||
self.addRule('mklambda ::= %s LOAD_LAMBDA %s' %
|
self.addRule('mklambda ::= %s LOAD_LAMBDA %s' %
|
||||||
('expr ' * token.attr, opname), nop_func)
|
('expr ' * token.attr, opname), nop_func)
|
||||||
if self.version >= 3.2:
|
rule = 'mkfunc ::= %sLOAD_CONST %s' % ('expr ' * token.attr, opname)
|
||||||
rule = 'mkfunc ::= %s LOAD_CONST %s' % ('expr ' * token.attr, opname)
|
self.add_unique_rule(rule, opname, token.attr, customize)
|
||||||
self.add_unique_rule(rule, opname, token.attr, customize)
|
if opname.startswith('MAKE_FUNCTION_N'):
|
||||||
if opname.startswith('MAKE_FUNCTION_N'):
|
args_pos = token.attr & 0xff
|
||||||
args_pos = token.attr & 0xff
|
args_kw = (token.attr >> 8) & 0xff
|
||||||
args_kw = (token.attr >> 8) & 0xff
|
rule = ('mkfunc ::= %s %s %s %s' %
|
||||||
rule = ('mkfunc ::= %s %s %s %s' %
|
('pos_arg ' * args_pos,
|
||||||
('expr ' * args_pos,
|
'expr ' * args_kw,
|
||||||
'expr ' * args_kw,
|
'LOAD_CONST ' * 3,
|
||||||
'LOAD_CONST ' * 3,
|
opname))
|
||||||
opname))
|
else:
|
||||||
else:
|
rule = 'mkfunc ::= %sLOAD_CONST LOAD_CONST %s' % ('pos_arg ' * token.attr, opname)
|
||||||
rule = 'mkfunc ::= %s LOAD_CONST LOAD_CONST %s' % ('expr ' * token.attr, opname)
|
pass
|
||||||
else:
|
|
||||||
rule = 'mkfunc ::= %s LOAD_CONST %s' % ('expr ' * token.attr, opname)
|
|
||||||
self.add_unique_rule(rule, opname, token.attr, customize)
|
self.add_unique_rule(rule, opname, token.attr, customize)
|
||||||
pass
|
|
||||||
elif opname.startswith('MAKE_CLOSURE'):
|
elif opname.startswith('MAKE_CLOSURE'):
|
||||||
self.add_unique_rule('mklambda ::= %s load_closure LOAD_LAMBDA %s' %
|
self.add_unique_rule('mklambda ::= %sload_closure LOAD_LAMBDA %s' %
|
||||||
('expr ' * token.attr, opname), opname, token.attr,
|
('pos_arg ' * token.attr, opname), opname, token.attr,
|
||||||
customize)
|
customize)
|
||||||
self.add_unique_rule('genexpr ::= %s load_closure '
|
self.add_unique_rule('genexpr ::= %sload_closure '
|
||||||
'load_genexpr %s '
|
'load_genexpr %s '
|
||||||
'expr GET_ITER CALL_FUNCTION_1' %
|
'expr GET_ITER CALL_FUNCTION_1' %
|
||||||
('expr ' * token.attr, opname),
|
('pos_arg ' * token.attr, opname),
|
||||||
opname, token.attr, customize)
|
opname, token.attr, customize)
|
||||||
if self.version >= 3.4:
|
if self.version >= 3.4:
|
||||||
self.add_unique_rule('listcomp ::= %s load_closure '
|
self.add_unique_rule('listcomp ::= %sload_closure '
|
||||||
'LOAD_LISTCOMP LOAD_CONST %s expr '
|
'LOAD_LISTCOMP LOAD_CONST %s expr '
|
||||||
'GET_ITER CALL_FUNCTION_1' %
|
'GET_ITER CALL_FUNCTION_1' %
|
||||||
('expr ' * token.attr, opname),
|
('expr ' * token.attr, opname),
|
||||||
opname, token.attr, customize)
|
opname, token.attr, customize)
|
||||||
else:
|
else:
|
||||||
self.add_unique_rule('listcomp ::= %s load_closure '
|
self.add_unique_rule('listcomp ::= %sload_closure '
|
||||||
'LOAD_LISTCOMP %s expr '
|
'LOAD_LISTCOMP %s expr '
|
||||||
'GET_ITER CALL_FUNCTION_1' %
|
'GET_ITER CALL_FUNCTION_1' %
|
||||||
('expr ' * token.attr, opname),
|
('expr ' * token.attr, opname),
|
||||||
opname, token.attr, customize)
|
opname, token.attr, customize)
|
||||||
|
|
||||||
self.add_unique_rule('setcomp ::= %s load_closure LOAD_SETCOMP %s expr '
|
self.add_unique_rule('setcomp ::= %sload_closure LOAD_SETCOMP %s expr '
|
||||||
'GET_ITER CALL_FUNCTION_1' %
|
'GET_ITER CALL_FUNCTION_1' %
|
||||||
('expr ' * token.attr, opname),
|
('expr ' * token.attr, opname),
|
||||||
opname, token.attr, customize)
|
opname, token.attr, customize)
|
||||||
self.add_unique_rule('dictcomp ::= %s load_closure LOAD_DICTCOMP %s '
|
self.add_unique_rule('dictcomp ::= %sload_closure LOAD_DICTCOMP %s '
|
||||||
'expr GET_ITER CALL_FUNCTION_1' %
|
'expr GET_ITER CALL_FUNCTION_1' %
|
||||||
('expr '* token.attr, opname),
|
('pos_arg '* token.attr, opname),
|
||||||
opname, token.attr, customize)
|
opname, token.attr, customize)
|
||||||
|
|
||||||
rule = ('mkfunc ::= %s load_closure LOAD_CONST %s'
|
rule = ('mkfunc ::= %s load_closure LOAD_CONST %s'
|
||||||
@@ -557,7 +563,7 @@ class Python3Parser(PythonParser):
|
|||||||
|
|
||||||
self.add_unique_rule(rule, opname, token.attr, customize)
|
self.add_unique_rule(rule, opname, token.attr, customize)
|
||||||
rule = ('mkfunc ::= %s load_closure load_genexpr %s'
|
rule = ('mkfunc ::= %s load_closure load_genexpr %s'
|
||||||
% ('expr ' * token.attr, opname))
|
% ('pos_arg ' * token.attr, opname))
|
||||||
self.add_unique_rule(rule, opname, token.attr, customize)
|
self.add_unique_rule(rule, opname, token.attr, customize)
|
||||||
rule = ('mkfunc ::= %s load_closure LOAD_CONST %s'
|
rule = ('mkfunc ::= %s load_closure LOAD_CONST %s'
|
||||||
% ('expr ' * token.attr, opname))
|
% ('expr ' * token.attr, opname))
|
||||||
|
@@ -1031,7 +1031,8 @@ class SourceWalker(GenericASTTraversal, object):
|
|||||||
self.prune()
|
self.prune()
|
||||||
|
|
||||||
def listcomprehension_walk3(self, node, iter_index, code_index=-5):
|
def listcomprehension_walk3(self, node, iter_index, code_index=-5):
|
||||||
"""List comprehensions the way they are done in Python3.
|
"""
|
||||||
|
List comprehensions the way they are done in Python3.
|
||||||
They're more other comprehensions, e.g. set comprehensions
|
They're more other comprehensions, e.g. set comprehensions
|
||||||
See if we can combine code.
|
See if we can combine code.
|
||||||
"""
|
"""
|
||||||
@@ -1538,6 +1539,7 @@ class SourceWalker(GenericASTTraversal, object):
|
|||||||
|
|
||||||
if default:
|
if default:
|
||||||
if self.showast:
|
if self.showast:
|
||||||
|
print()
|
||||||
print('--', name)
|
print('--', name)
|
||||||
print(default)
|
print(default)
|
||||||
print('--')
|
print('--')
|
||||||
@@ -1573,7 +1575,6 @@ class SourceWalker(GenericASTTraversal, object):
|
|||||||
return
|
return
|
||||||
|
|
||||||
# build parameters
|
# build parameters
|
||||||
|
|
||||||
params = [build_param(ast, name, default) for
|
params = [build_param(ast, name, default) for
|
||||||
name, default in zip_longest(paramnames, defparams, fillvalue=None)]
|
name, default in zip_longest(paramnames, defparams, fillvalue=None)]
|
||||||
# params = [ build_param(ast, name, default) for
|
# params = [ build_param(ast, name, default) for
|
||||||
|
Reference in New Issue
Block a user