-
Notifications
You must be signed in to change notification settings - Fork 38
Open
Description
The following example results in an AssertionError.
If you remove the code in the outer "if", it works just fine.
import meta
def g():
pass
def f(x, y):
if x == y:
g() # <== offender
if x != y:
g()
f_ast = meta.decompiler.decompile_func(f)
meta.asttools.print_ast(f_ast)Result:
Traceback (most recent call last):
File "nested_ifs.py", line 12, in <module>
f_ast = meta.decompiler.decompile_func(f)
File "C:\Python27x64\lib\site-packages\meta\decompiler\__init__.py", line 37, in decompile_func
ast_node = make_function(code, defaults=[], lineno=code.co_firstlineno)
File "C:\Python27x64\lib\site-packages\meta\decompiler\instructions.py", line 70, in make_function
stmnts = instructions.stmnt()
File "C:\Python27x64\lib\site-packages\meta\decompiler\instructions.py", line 283, in stmnt
self.visit(instr)
File "C:\Python27x64\lib\site-packages\meta\decompiler\instructions.py", line 297, in visit
method(instr)
File "C:\Python27x64\lib\site-packages\meta\decompiler\control_flow_instructions.py", line 792, in POP_JUMP_IF_FALSE
self.make_if(instr, left, and_block)
File "C:\Python27x64\lib\site-packages\meta\decompiler\control_flow_instructions.py", line 715, in make_if
hi = self.process_logic(block[:idx + 1])
File "C:\Python27x64\lib\site-packages\meta\decompiler\control_flow_instructions.py", line 654, in process_logic
right = self.process_logic(logic_block[1:])
File "C:\Python27x64\lib\site-packages\meta\decompiler\control_flow_instructions.py", line 675, in process_logic
assert len(stmnts) == 1
AssertionErrorIt seems nested "if" is being optimized into one condition.
I think this might be the cause. It tries to produce the following, but tries to shove the outer "if" code in the condition as well.
if x == y and x != y:
g()Metadata
Metadata
Assignees
Labels
No labels