diff --git a/test/bytecode_3.2/05_closure_bug.pyc b/test/bytecode_3.2/05_closure_bug.pyc new file mode 100644 index 00000000..d5440b5a Binary files /dev/null and b/test/bytecode_3.2/05_closure_bug.pyc differ diff --git a/test/bytecode_3.5/05_closure_bug.pyc b/test/bytecode_3.5/05_closure_bug.pyc new file mode 100644 index 00000000..6b6b1454 Binary files /dev/null and b/test/bytecode_3.5/05_closure_bug.pyc differ diff --git a/test/simple_source/def/05_closure_bug.py b/test/simple_source/def/05_closure_bug.py new file mode 100644 index 00000000..fe192ca0 --- /dev/null +++ b/test/simple_source/def/05_closure_bug.py @@ -0,0 +1,25 @@ +# Tests bug in Python 3 + +# load_closure ::= LOAD_CLOSURE BUILD_TUPLE_1 + +# Python 3.5 +# mkfunc ::= load_closure LOAD_CONST LOAD_CONST MAKE_CLOSURE_0 + +# Python 3.2 +# mkfunc ::= load_closure LOAD_CONST MAKE_CLOSURE_0 + +# mkfuncdeco0 ::= mkfunc +# mkfuncdeco ::= expr mkfuncdeco0 CALL_FUNCTION_1 +# designator ::= STORE_FAST +# funcdefdeco ::= mkfuncdeco designator +# stmt ::= funcdefdeco + + + +from functools import wraps + +def contextmanager(func): + @wraps(func) + def helper(*args, **kwds): + return _GeneratorContextManager(func, *args, **kwds) + return helper diff --git a/uncompyle6/parsers/parse3.py b/uncompyle6/parsers/parse3.py index 30dac9be..c091ed3c 100644 --- a/uncompyle6/parsers/parse3.py +++ b/uncompyle6/parsers/parse3.py @@ -528,10 +528,19 @@ class Python3Parser(PythonParser): 'expr GET_ITER CALL_FUNCTION_1' % ('expr '* token.attr, opname), opname, token.attr, customize) - rule = ('mkfunc ::= %s load_closure BUILD_TUPLE_1 LOAD_CONST LOAD_CONST %s' + + rule = ('mkfunc ::= %s load_closure LOAD_CONST %s' + % ('expr ' * token.attr, opname)) + + # Python 3.5+ instead of above? + rule = ('mkfunc ::= %s load_closure LOAD_CONST LOAD_CONST %s' + % ('expr ' * token.attr, opname)) + + self.add_unique_rule(rule, opname, token.attr, customize) + rule = ('mkfunc ::= %s load_closure load_genexpr %s' % ('expr ' * token.attr, opname)) self.add_unique_rule(rule, opname, token.attr, customize) - rule = ('mkfunc ::= %s load_closure BUILD_TUPLE_1 LOAD_GENXPR LOAD_CONST %s' + rule = ('mkfunc ::= %s load_closure LOAD_CONST %s' % ('expr ' * token.attr, opname)) self.add_unique_rule(rule, opname, token.attr, customize) return