diff --git a/test/bytecode_3.3_run/02_make_closure.pyc b/test/bytecode_3.3_run/02_make_closure.pyc new file mode 100644 index 00000000..0828c6cb Binary files /dev/null and b/test/bytecode_3.3_run/02_make_closure.pyc differ diff --git a/test/bytecode_3.4_run/02_make_closure.pyc b/test/bytecode_3.4_run/02_make_closure.pyc new file mode 100644 index 00000000..5cfb0446 Binary files /dev/null and b/test/bytecode_3.4_run/02_make_closure.pyc differ diff --git a/test/simple_source/bug34/02_make_closure.py b/test/simple_source/bug34/02_make_closure.py new file mode 100644 index 00000000..86f8c225 --- /dev/null +++ b/test/simple_source/bug34/02_make_closure.py @@ -0,0 +1,18 @@ +# Related to #426 + +# This file is RUNNABLE! +"""This program is self-checking!""" + +a = 5 +class MakeClosureTest(): + # This function uses MAKE_CLOSURE with annotation args + def __init__(self, dev: str, b: bool): + super().__init__() + self.dev = dev + self.b = b + self.a = a + +x = MakeClosureTest("dev", True) +assert x.dev == "dev" +assert x.b == True +assert x.a == 5 diff --git a/uncompyle6/parsers/parse3.py b/uncompyle6/parsers/parse3.py index 80bcc874..bb26495c 100644 --- a/uncompyle6/parsers/parse3.py +++ b/uncompyle6/parsers/parse3.py @@ -845,18 +845,18 @@ class Python3Parser(PythonParser): elif opname in ("BUILD_CONST_LIST", "BUILD_CONST_DICT", "BUILD_CONST_SET"): if opname == "BUILD_CONST_DICT": - rule = f""" + rule = """ add_consts ::= ADD_VALUE* - const_list ::= COLLECTION_START add_consts {opname} + const_list ::= COLLECTION_START add_consts %s dict ::= const_list expr ::= dict - """ + """ % opname else: - rule = f""" + rule = """ add_consts ::= ADD_VALUE* - const_list ::= COLLECTION_START add_consts {opname} + const_list ::= COLLECTION_START add_consts %s expr ::= const_list - """ + """ % opname self.addRule(rule, nop_func) elif opname_base in ( @@ -1178,7 +1178,9 @@ class Python3Parser(PythonParser): "pos_arg " * args_pos, opname, ) - elif self.version == (3, 3): + self.add_unique_rule(rule, opname, token.attr, customize) + + elif (3, 3) <= self.version < (3, 5): if annotate_args > 0: rule = ( "mkfunc_annotate ::= %s%s%sannotate_tuple load_closure LOAD_CODE LOAD_STR %s" @@ -1195,8 +1197,10 @@ class Python3Parser(PythonParser): "pos_arg " * args_pos, opname, ) + self.add_unique_rule(rule, opname, token.attr, customize) - elif self.version >= (3, 4): + + if self.version >= (3, 4): if not self.is_pypy: load_op = "LOAD_STR" else: @@ -1221,7 +1225,7 @@ class Python3Parser(PythonParser): opname, ) - self.add_unique_rule(rule, opname, token.attr, customize) + self.add_unique_rule(rule, opname, token.attr, customize) if args_kw == 0: rule = "mkfunc ::= %sload_closure load_genexpr %s" % (