Skip to content

Commit

Permalink
unwarper: Remove need for the second slot elimination pass
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrian Nord authored and Andrian Nord committed Jan 24, 2014
1 parent 6e40398 commit 20bad90
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 21 deletions.
25 changes: 12 additions & 13 deletions ljd/ast/unwarper.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ def visit_statements_list(self, node):
self.result.append(node)


def primary_pass(node):
def unwarp(node):
# There could be many negative jumps within while conditions, so
# filter them first
_run_step(_unwarp_loops, node, repeat_until=False)
Expand All @@ -38,11 +38,6 @@ def primary_pass(node):
_glue_flows(node)


def final_pass(node):
for statements in _gather_statements_lists(node):
statements.contents = statements.contents[0].contents


def _run_step(step, node, **kargs):
for statements in _gather_statements_lists(node):
statements.contents = step(statements.contents, **kargs)
Expand Down Expand Up @@ -77,7 +72,7 @@ def _glue_flows(node):
target.contents = block.contents + target.contents
block.contents = []

statements.contents = [blocks[-1]]
statements.contents = blocks[-1].contents


#
Expand Down Expand Up @@ -199,14 +194,15 @@ def _try_unwarp_logical_expression(start, blocks, end, topmost_end):

_unwarp_logical_expression(start, end, body, topmost_end)

if i == len(expressions) - 1:
break

end.contents = start.contents + end.contents
if i == len(expressions):
slotworks.eliminate_temporary(start)
else:
end.contents = start.contents + end.contents
start.contents = []

blocks = blocks[:start_index] + blocks[end_index:]
blocks = blocks[:start_index] + blocks[end_index:]

slotworks.eliminate_temporary(end)
slotworks.eliminate_temporary(end)

return True

Expand Down Expand Up @@ -1027,6 +1023,8 @@ def _unwarp_loop(start, end, body):
loop.statements.contents = body
loop.identifiers = start.warp.variables
loop.expressions = start.warp.controls
loop._addr = body[0].first_address

_set_flow_to(start, body[0])

elif isinstance(start.warp, nodes.NumericLoopWarp):
Expand All @@ -1037,6 +1035,7 @@ def _unwarp_loop(start, end, body):
loop.statements.contents = body
loop.variable = start.warp.index
loop.expressions = start.warp.controls
loop._addr = body[0].first_address
_set_flow_to(start, body[0])

# While (including "while true" and "repeat until false" which will be
Expand Down
8 changes: 0 additions & 8 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,16 +105,8 @@ def main():

ljd.ast.validator.validate(ast, warped=True)

ljd.ast.slotworks.eliminate_temporary(ast)

ljd.ast.validator.validate(ast, warped=True)

ljd.ast.locals.mark_local_definitions(ast)

ljd.ast.validator.validate(ast, warped=True)

ljd.ast.unwarper.final_pass(ast)

ljd.ast.validator.validate(ast, warped=False)

ljd.ast.mutator.primary_pass(ast)
Expand Down

0 comments on commit 20bad90

Please sign in to comment.