From d372617ef332eda474a9fb7d7d43cb1381d00bd7 Mon Sep 17 00:00:00 2001 From: Thomas Kluyver Date: Sun, 22 Feb 2015 10:04:58 -0800 Subject: [PATCH 1/3] Remove unused import wr_long doesn't seem to exist, but neither of these names are used in the module anyway. --- meta/decompiler/recompile.py | 1 - 1 file changed, 1 deletion(-) diff --git a/meta/decompiler/recompile.py b/meta/decompiler/recompile.py index 08e88b9..ee4c916 100644 --- a/meta/decompiler/recompile.py +++ b/meta/decompiler/recompile.py @@ -17,7 +17,6 @@ import marshal import imp -from py_compile import PyCompileError, wr_long MAGIC = imp.get_magic() From be2ddff497c16c11d18f2103419a8c2ae66917f0 Mon Sep 17 00:00:00 2001 From: Thomas Kluyver Date: Sun, 22 Feb 2015 10:06:29 -0800 Subject: [PATCH 2/3] MAKE_FUNCTION expects a name on the top of the stack in Python >= 3.3 The name is also in the code object, so for now the name from the stack is ignored; this seems to work OK. --- meta/decompiler/instructions.py | 1 + 1 file changed, 1 insertion(+) diff --git a/meta/decompiler/instructions.py b/meta/decompiler/instructions.py index dab4171..9b110bc 100644 --- a/meta/decompiler/instructions.py +++ b/meta/decompiler/instructions.py @@ -351,6 +351,7 @@ def make_block(self, to, inclusive=True, raise_=True): @py3op def MAKE_FUNCTION(self, instr): + name = self.pop_ast_item() code = self.pop_ast_item() ndefaults = bitrange(instr.oparg, 0, 8) From 550317466070ce75d926a98cf4ca5882ccd84724 Mon Sep 17 00:00:00 2001 From: Thomas Kluyver Date: Sun, 22 Feb 2015 10:08:57 -0800 Subject: [PATCH 3/3] Handle unified Try AST node This combines TryExcept and TryFinally handlers from earlier versions. Try is used in Python 3.3 and above. --- meta/asttools/visitors/pysourcegen.py | 26 ++++++++++++++++++++ meta/decompiler/control_flow_instructions.py | 3 ++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/meta/asttools/visitors/pysourcegen.py b/meta/asttools/visitors/pysourcegen.py index c0f0f74..d9bbdc6 100644 --- a/meta/asttools/visitors/pysourcegen.py +++ b/meta/asttools/visitors/pysourcegen.py @@ -709,6 +709,32 @@ def visitReturn(self, node): if node.value is not None: self.print('return {:node}\n', node.value) + def visitTry(self, node): + # From Python 3.3, TryExcept and TryFinally are unified as Try + self.print('try:') + + with self.indenter: + if node.body: + for stmnt in node.body: + self.visit(stmnt) + else: + self.print('pass') + + for hndlr in node.handlers: + self.visit(hndlr) + + if node.orelse: + self.print('else:') + with self.indenter: + for stmnt in node.orelse: + self.visit(smnt) + + if node.finalbody: + self.print('finally:') + with self.indenter: + for stmnt in node.finalbody: + self.visit(stmnt) + def visitTryExcept(self, node): self.print('try:') diff --git a/meta/decompiler/control_flow_instructions.py b/meta/decompiler/control_flow_instructions.py index c8777db..331d3c5 100644 --- a/meta/decompiler/control_flow_instructions.py +++ b/meta/decompiler/control_flow_instructions.py @@ -376,7 +376,8 @@ def SETUP_EXCEPT(self, instr): else: else_ = [] - try_except = _ast.TryExcept(body=body, handlers=handlers, orelse=else_, lineno=instr.lineno, col_offset=0) + try_except = _ast.Try(body=body, handlers=handlers, orelse=else_, + finalbody=[], lineno=instr.lineno, col_offset=0) self.push_ast_item(try_except)