From b134d08e912517a69ebc8b240c98c4fda6d45fec Mon Sep 17 00:00:00 2001 From: rocky Date: Tue, 10 May 2016 18:05:25 -0400 Subject: [PATCH] add pos_arg ::= expr to make params of fns clear --- uncompyle6/parser.py | 3 ++ uncompyle6/parsers/parse2.py | 6 +-- uncompyle6/parsers/parse3.py | 74 +++++++++++++++++--------------- uncompyle6/semantics/pysource.py | 5 ++- 4 files changed, 49 insertions(+), 39 deletions(-) diff --git a/uncompyle6/parser.py b/uncompyle6/parser.py index 0c2c12cf..89f249c0 100644 --- a/uncompyle6/parser.py +++ b/uncompyle6/parser.py @@ -435,6 +435,9 @@ class PythonParser(GenericASTBuilder): exprlist ::= exprlist expr exprlist ::= expr + # Positional arguments in make_function + pos_arg ::= expr + 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 diff --git a/uncompyle6/parsers/parse2.py b/uncompyle6/parsers/parse2.py index 64709855..e2712b70 100644 --- a/uncompyle6/parsers/parse2.py +++ b/uncompyle6/parsers/parse2.py @@ -337,7 +337,7 @@ class Python2Parser(PythonParser): ''' def add_custom_rules(self, tokens, customize): - """ + ''' Special handling for opcodes that take a variable number 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_KW_n POP_TOP expr ::= expr {expr}^n CALL_FUNCTION_KW_n POP_TOP - """ + ''' for k, v in list(customize.items()): # avoid adding the same rule twice to this parser if k in self.customized: @@ -375,7 +375,7 @@ class Python2Parser(PythonParser): # rule = 'dup_topx ::= ' + 'expr '*v + k elif op == 'MAKE_FUNCTION': 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) elif op == 'MAKE_CLOSURE': self.addRule('mklambda ::= %s load_closure LOAD_LAMBDA %s' % diff --git a/uncompyle6/parsers/parse3.py b/uncompyle6/parsers/parse3.py index f48e4e46..f6d4a5d9 100644 --- a/uncompyle6/parsers/parse3.py +++ b/uncompyle6/parsers/parse3.py @@ -368,7 +368,7 @@ class Python3Parser(PythonParser): return 'CALL_FUNCTION_%i' % token.attr def custom_build_class_rule(self, opname, i, token, tokens, customize): - """ + ''' # Should the first rule be somehow folded into the 2nd one? build_class ::= LOAD_BUILD_CLASS mkfunc LOAD_CLASSNAME {expr}^n CALL_FUNCTION_n+2 @@ -377,7 +377,7 @@ class Python3Parser(PythonParser): expr call_function CALL_FUNCTION_3 - """ + ''' # FIXME: I bet this can be simplified # look for next MAKE_FUNCTION for i in range(i+1, len(tokens)): @@ -422,7 +422,7 @@ class Python3Parser(PythonParser): nak = ( len(opname)-len('CALL_FUNCTION') ) // 3 token.type = self.call_fn_name(token) rule = ('call_function ::= expr ' - + ('expr ' * args_pos) + + ('pos_arg ' * args_pos) + ('kwarg ' * args_kw) + 'expr ' * nak + token.type) 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 of arguments -- we add a new rule for each: - Python 3.4: + Python 3.4+: listcomp ::= LOAD_LISTCOMP LOAD_CONST MAKE_FUNCTION_0 expr GET_ITER CALL_FUNCTION_1 + listcomp ::= {expr}^n LOAD_LISTCOMP MAKE_CLOSURE + GET_ITER CALL_FUNCTION_1 Python < 3.4 listcomp ::= LOAD_LISTCOMP MAKE_FUNCTION_0 expr 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_list ::= {expr}^n BUILD_LIST_n @@ -450,11 +459,11 @@ class Python3Parser(PythonParser): unpack ::= UNPACK_TUPLE {expr}^n unpack ::= UNPACK_SEQEUENCE {expr}^n - mkfunc ::= {expr}^n LOAD_CONST MAKE_FUNCTION_n - mklambda ::= {expr}^n LOAD_LAMBDA MAKE_FUNCTION_n - mkfunc ::= {expr}^n load_closure LOAD_CONST MAKE_FUNCTION_n + mkfunc ::= {pos_arg}^n LOAD_CONST MAKE_FUNCTION_n + mklambda ::= {pos_arg}^n LOAD_LAMBDA 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) """ @@ -500,52 +509,49 @@ class Python3Parser(PythonParser): elif opname_base.startswith('MAKE_FUNCTION'): self.addRule('mklambda ::= %s LOAD_LAMBDA %s' % ('expr ' * token.attr, opname), nop_func) - if self.version >= 3.2: - rule = 'mkfunc ::= %s LOAD_CONST %s' % ('expr ' * token.attr, opname) - self.add_unique_rule(rule, opname, token.attr, customize) - if opname.startswith('MAKE_FUNCTION_N'): - args_pos = token.attr & 0xff - args_kw = (token.attr >> 8) & 0xff - rule = ('mkfunc ::= %s %s %s %s' % - ('expr ' * args_pos, - 'expr ' * args_kw, - 'LOAD_CONST ' * 3, - opname)) - else: - rule = 'mkfunc ::= %s LOAD_CONST LOAD_CONST %s' % ('expr ' * token.attr, opname) - else: - rule = 'mkfunc ::= %s LOAD_CONST %s' % ('expr ' * token.attr, opname) + rule = 'mkfunc ::= %sLOAD_CONST %s' % ('expr ' * token.attr, opname) + self.add_unique_rule(rule, opname, token.attr, customize) + if opname.startswith('MAKE_FUNCTION_N'): + args_pos = token.attr & 0xff + args_kw = (token.attr >> 8) & 0xff + rule = ('mkfunc ::= %s %s %s %s' % + ('pos_arg ' * args_pos, + 'expr ' * args_kw, + 'LOAD_CONST ' * 3, + opname)) + else: + rule = 'mkfunc ::= %sLOAD_CONST LOAD_CONST %s' % ('pos_arg ' * token.attr, opname) + pass self.add_unique_rule(rule, opname, token.attr, customize) - pass elif opname.startswith('MAKE_CLOSURE'): - self.add_unique_rule('mklambda ::= %s load_closure LOAD_LAMBDA %s' % - ('expr ' * token.attr, opname), opname, token.attr, + self.add_unique_rule('mklambda ::= %sload_closure LOAD_LAMBDA %s' % + ('pos_arg ' * token.attr, opname), opname, token.attr, customize) - self.add_unique_rule('genexpr ::= %s load_closure ' + self.add_unique_rule('genexpr ::= %sload_closure ' 'load_genexpr %s ' 'expr GET_ITER CALL_FUNCTION_1' % - ('expr ' * token.attr, opname), + ('pos_arg ' * token.attr, opname), opname, token.attr, customize) 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 ' 'GET_ITER CALL_FUNCTION_1' % ('expr ' * token.attr, opname), opname, token.attr, customize) else: - self.add_unique_rule('listcomp ::= %s load_closure ' + self.add_unique_rule('listcomp ::= %sload_closure ' 'LOAD_LISTCOMP %s expr ' 'GET_ITER CALL_FUNCTION_1' % ('expr ' * token.attr, opname), 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' % ('expr ' * token.attr, opname), 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 '* token.attr, opname), + ('pos_arg '* token.attr, opname), opname, token.attr, customize) rule = ('mkfunc ::= %s load_closure LOAD_CONST %s' @@ -557,7 +563,7 @@ class Python3Parser(PythonParser): self.add_unique_rule(rule, opname, token.attr, customize) 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) rule = ('mkfunc ::= %s load_closure LOAD_CONST %s' % ('expr ' * token.attr, opname)) diff --git a/uncompyle6/semantics/pysource.py b/uncompyle6/semantics/pysource.py index eb84e802..479e5635 100644 --- a/uncompyle6/semantics/pysource.py +++ b/uncompyle6/semantics/pysource.py @@ -1031,7 +1031,8 @@ class SourceWalker(GenericASTTraversal, object): self.prune() 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 See if we can combine code. """ @@ -1538,6 +1539,7 @@ class SourceWalker(GenericASTTraversal, object): if default: if self.showast: + print() print('--', name) print(default) print('--') @@ -1573,7 +1575,6 @@ class SourceWalker(GenericASTTraversal, object): return # build parameters - params = [build_param(ast, name, default) for name, default in zip_longest(paramnames, defparams, fillvalue=None)] # params = [ build_param(ast, name, default) for