def topologically_sort_vtables(all_vtables: dict, type_: str) -> List[int]: graph = Graph() for name, vtables in all_vtables[type_].items(): classes = list(dict.fromkeys(reversed(vtables))) for i in range(len(classes) - 1): graph.add_edge(classes[i + 1], classes[i]) return graph.topological_sort()
def build_graph(all_vtables: dict, type_: str, graph: Graph, reverse_graph: Graph): for name, vtables in all_vtables[type_].items(): classes = [name] + list(reversed(vtables)) # Each class has at least one parent, so the -1 is fine. for i in range(len(classes) - 1): from_ = classes[i] to_ = classes[i + 1] # Skip base classes to reduce noise. if to_ in BaseClasses: break reverse_graph.add_edge(to_, from_) guess_vtable_names(reverse_graph) for name, vtables in all_vtables[type_].items(): classes = [name] + list(reversed(vtables)) for i in range(len(classes) - 1): if classes[i + 1] in BaseClasses: break from_ = get_name_for_vtable(classes[i]) to_ = get_name_for_vtable(classes[i + 1]) graph.add_edge(from_, to_)