git @ Cat's Eye Technologies
Find the longest chain of routines in R and remove it. Chris Pressey 4 years ago
1 changed file(s) with 25 addition(s) and 8 deletion(s).
 9 9 if sub not in s: 10 10 s.add(sub) 11 11 make_transitive_closure(d, sub, s) 12 13 14 def find_chains(d, key, pred): 15 chains = [] 16 for sub in d.get(key, []): 17 if pred(sub): 18 subchains = find_chains(d, sub, pred) 19 for subchain in subchains: 20 chains.append([key] + subchain) 21 chains.append([key]) 22 return chains 12 23 13 24 14 25 class FallthruAnalyzer(object): 62 73 self.fall_out_map[routine.name] = None 63 74 64 75 routine_list = [] 65 fall_out_map = copy(self.fall_out_map) 66 while fall_out_map: 67 key = fall_out_map.keys()[0] 76 pending_routines = copy(self.fall_out_map) 77 while pending_routines: 78 # Pick a routine that is still pending to be serialized. 79 key = pending_routines.keys()[0] 80 68 81 in_set = self.fall_in_map.get(key, []) 69 # Find the longest chain of routines r1,r2,...rn in R where out(r1) = {r2}, out(r2} = {r3}, ... out(rn-1) = {rn}, and rn = r. 70 # TODO implement this 71 routines = [key] 72 82 73 # Remove (r1,r2,...,rn) from R and append them to L in that order. Mark (r1,r2,...rn-1) as "will have their final goto removed." 83 # Find the longest chain of routines r1,r2,...rn in R 84 # where out(r1) = {r2}, out(r2} = {r3}, ... out(rn-1) = {rn}, and rn = r. 85 chains = find_chains(self.fall_in_map, key, lambda k: k in pending_routines) 86 chains.sort(key=len, reverse=True) 87 routines = chains[0] 88 89 # Remove (r1,r2,...,rn) from R and append them to L in that order. 90 # Mark (r1,r2,...rn-1) as "will have their final goto removed." 74 91 for r in routines: 75 del fall_out_map[r] 92 del pending_routines[r] 76 93 if r == routines[-1]: 77 94 routine_list.append(['retain', r]) 78 95 else: