2
0
mirror of https://github.com/m-labs/artiq.git synced 2024-12-19 08:26:30 +08:00

Use ".k" instead of "k" for the finalizer continuation variable.

The dot signifies that this is an internal variable and it
does not need to be tracked as if it was a user-defined one.
This commit is contained in:
whitequark 2015-07-19 10:30:42 +03:00
parent 8eedb3bc44
commit 4bd83fb43d

View File

@ -424,30 +424,30 @@ class IRGenerator(algorithm.Visitor):
if any(node.finalbody): if any(node.finalbody):
# k for continuation # k for continuation
final_state = self.append(ir.Alloc([], ir.TEnvironment({ "k": ir.TBasicBlock() }))) final_state = self.append(ir.Alloc([], ir.TEnvironment({ ".k": ir.TBasicBlock() })))
final_targets = [] final_targets = []
if self.break_target is not None: if self.break_target is not None:
break_proxy = self.add_block("try.break") break_proxy = self.add_block("try.break")
old_break, self.break_target = self.break_target, break_proxy old_break, self.break_target = self.break_target, break_proxy
break_proxy.append(ir.SetLocal(final_state, "k", old_break)) break_proxy.append(ir.SetLocal(final_state, ".k", old_break))
final_targets.append(old_break) final_targets.append(old_break)
if self.continue_target is not None: if self.continue_target is not None:
continue_proxy = self.add_block("try.continue") continue_proxy = self.add_block("try.continue")
old_continue, self.continue_target = self.continue_target, continue_proxy old_continue, self.continue_target = self.continue_target, continue_proxy
continue_proxy.append(ir.SetLocal(final_state, "k", old_continue)) continue_proxy.append(ir.SetLocal(final_state, ".k", old_continue))
final_targets.append(old_continue) final_targets.append(old_continue)
return_proxy = self.add_block("try.return") return_proxy = self.add_block("try.return")
old_return, self.return_target = self.return_target, return_proxy old_return, self.return_target = self.return_target, return_proxy
if old_return is not None: if old_return is not None:
return_proxy.append(ir.SetLocal(final_state, "k", old_return)) return_proxy.append(ir.SetLocal(final_state, ".k", old_return))
final_targets.append(old_return) final_targets.append(old_return)
else: else:
return_action = self.add_block("try.doreturn") return_action = self.add_block("try.doreturn")
value = return_action.append(ir.GetLocal(self.current_private_env, ".return")) value = return_action.append(ir.GetLocal(self.current_private_env, ".return"))
return_action.append(ir.Return(value)) return_action.append(ir.Return(value))
return_proxy.append(ir.SetLocal(final_state, "k", return_action)) return_proxy.append(ir.SetLocal(final_state, ".k", return_action))
final_targets.append(return_action) final_targets.append(return_action)
body = self.add_block("try.body") body = self.add_block("try.body")
@ -489,7 +489,7 @@ class IRGenerator(algorithm.Visitor):
self.visit(node.finalbody) self.visit(node.finalbody)
if not self.current_block.is_terminated(): if not self.current_block.is_terminated():
dest = self.append(ir.GetLocal(final_state, "k")) dest = self.append(ir.GetLocal(final_state, ".k"))
self.append(ir.IndirectBranch(dest, final_targets)) self.append(ir.IndirectBranch(dest, final_targets))
tail = self.add_block("try.tail") tail = self.add_block("try.tail")
@ -501,11 +501,11 @@ class IRGenerator(algorithm.Visitor):
return_proxy.append(ir.Branch(finalizer)) return_proxy.append(ir.Branch(finalizer))
if not body.is_terminated(): if not body.is_terminated():
if any(node.finalbody): if any(node.finalbody):
body.append(ir.SetLocal(final_state, "k", tail)) body.append(ir.SetLocal(final_state, ".k", tail))
body.append(ir.Branch(finalizer)) body.append(ir.Branch(finalizer))
for handler in handlers: for handler in handlers:
if not handler.is_terminated(): if not handler.is_terminated():
handler.append(ir.SetLocal(final_state, "k", tail)) handler.append(ir.SetLocal(final_state, ".k", tail))
handler.append(ir.Branch(tail)) handler.append(ir.Branch(tail))
else: else:
body.append(ir.Branch(tail)) body.append(ir.Branch(tail))