1 from Visitor import CythonTransform
2 from sets import Set as set
4 class AnchorTemps(CythonTransform):
6 def init_scope(self, scope):
7 scope.free_temp_entries = []
9 def handle_node(self, node):
11 for temp in node.temps:
12 temp.cname = self.scope.allocate_temp(temp.type)
13 self.temps_beneath_try.add(temp.cname)
14 self.visitchildren(node)
15 for temp in node.temps:
16 self.scope.release_temp(temp.cname)
18 self.visitchildren(node)
20 def visit_Node(self, node):
21 self.handle_node(node)
24 def visit_ModuleNode(self, node):
25 self.scope = node.scope
26 self.temps_beneath_try = set()
27 self.init_scope(self.scope)
28 self.handle_node(node)
31 def visit_FuncDefNode(self, node):
33 pscope_temps = self.temps_beneath_try
34 self.scope = node.local_scope
35 self.init_scope(node.local_scope)
36 self.handle_node(node)
38 self.temps_beneath_try = pscope_temps
41 def visit_TryExceptNode(self, node):
42 old_tbt = self.temps_beneath_try
43 self.temps_beneath_try = set()
44 self.handle_node(node)
45 entries = [ scope.cname_to_entry[cname] for
46 cname in self.temps_beneath_try]
47 node.cleanup_list.extend(entries)