From 6be6632e96e553a2aa3590c5cda0161dfc14f153 Mon Sep 17 00:00:00 2001 From: rocky Date: Sun, 15 May 2016 19:28:22 -0400 Subject: [PATCH] Bug in Python 3.x genexpr --- uncompyle6/parser.py | 3 --- uncompyle6/parsers/parse2.py | 5 +++++ uncompyle6/parsers/parse3.py | 6 ++++++ uncompyle6/semantics/fragments.py | 3 ++- uncompyle6/semantics/pysource.py | 3 ++- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/uncompyle6/parser.py b/uncompyle6/parser.py index 1ae83179..a8285d7a 100644 --- a/uncompyle6/parser.py +++ b/uncompyle6/parser.py @@ -102,9 +102,6 @@ class PythonParser(GenericASTBuilder): def p_genexpr(self, args): ''' expr ::= genexpr - - genexpr ::= LOAD_GENEXPR MAKE_FUNCTION_0 expr GET_ITER CALL_FUNCTION_1 - stmt ::= genexpr_func genexpr_func ::= LOAD_FAST FOR_ITER designator comp_iter JUMP_BACK diff --git a/uncompyle6/parsers/parse2.py b/uncompyle6/parsers/parse2.py index fac0a69d..97741e2d 100644 --- a/uncompyle6/parsers/parse2.py +++ b/uncompyle6/parsers/parse2.py @@ -320,6 +320,11 @@ class Python2Parser(PythonParser): ''' + def p_genexpr2(self, args): + ''' + genexpr ::= LOAD_GENEXPR MAKE_FUNCTION_0 expr GET_ITER CALL_FUNCTION_1 + ''' + def p_expr2(self, args): ''' expr ::= LOAD_LOCALS diff --git a/uncompyle6/parsers/parse3.py b/uncompyle6/parsers/parse3.py index 074de9c1..a085e16b 100644 --- a/uncompyle6/parsers/parse3.py +++ b/uncompyle6/parsers/parse3.py @@ -360,6 +360,11 @@ class Python3Parser(PythonParser): load_genexpr ::= BUILD_TUPLE_1 LOAD_GENEXPR LOAD_CONST ''' + def p_genexpr2(self, args): + ''' + genexpr ::= LOAD_GENEXPR LOAD_CONST MAKE_FUNCTION_0 expr GET_ITER CALL_FUNCTION_1 + ''' + def p_expr3(self, args): ''' expr ::= LOAD_CLASSNAME @@ -473,6 +478,7 @@ class Python3Parser(PythonParser): 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 + genexpr ::= {pos_arg}^n LOAD_GENEXPR MAKE_FUNCTION_n listcomp ::= load_closure expr GET_ITER CALL_FUNCTION_1 diff --git a/uncompyle6/semantics/fragments.py b/uncompyle6/semantics/fragments.py index abb15bf8..c610610a 100644 --- a/uncompyle6/semantics/fragments.py +++ b/uncompyle6/semantics/fragments.py @@ -637,7 +637,8 @@ class FragmentsWalker(pysource.SourceWalker, object): def n_genexpr(self, node): start = len(self.f.getvalue()) self.write('(') - self.comprehension_walk(node, 3) + code_index = -6 if self.version > 3.0 else -5 + self.comprehension_walk(node, iter_index=3, code_index=code_index) self.write(')') self.set_pos_info(node, start, len(self.f.getvalue())) self.prune() diff --git a/uncompyle6/semantics/pysource.py b/uncompyle6/semantics/pysource.py index 64e40c8d..64e17a2c 100644 --- a/uncompyle6/semantics/pysource.py +++ b/uncompyle6/semantics/pysource.py @@ -1025,7 +1025,8 @@ class SourceWalker(GenericASTTraversal, object): def n_genexpr(self, node): self.write('(') - self.comprehension_walk(node, iter_index=3) + code_index = -6 if self.version > 3.0 else -5 + self.comprehension_walk(node, iter_index=3, code_index=code_index) self.write(')') self.prune()