@@ -6,8 +6,8 @@ def initialize(node, target)
66 @new_vertexes = { }
77 @covariant_types = { }
88 @contravariant_types = { }
9- @edges = [ ]
10- @new_edges = [ ]
9+ @edges = { }
10+ @new_edges = { }
1111 @boxes = { }
1212 @new_boxes = { }
1313 @diagnostics = [ ]
@@ -64,7 +64,7 @@ def new_contravariant_vertex(genv, sig_type_node)
6464 end
6565
6666 def add_edge ( genv , src , dst )
67- @new_edges << [ src , dst ]
67+ ( @new_edges [ src ] ||= { } ) [ dst ] = true
6868 end
6969
7070 # TODO: if an edge is removed during one analysis, we may need to remove sub-boxes?
@@ -160,14 +160,21 @@ def add_depended_superclass(mod)
160160 end
161161
162162 def reinstall ( genv )
163- @new_edges . uniq!
164- @new_edges . each do |src , dst |
165- src . add_edge ( genv , dst ) unless @edges . include? ( [ src , dst ] )
163+ # Edges stored as nested hashes: {src => {dst => true}}
164+ @new_edges . each do |src , new_dsts |
165+ old_dsts = @edges [ src ]
166+ new_dsts . each_key do |dst |
167+ src . add_edge ( genv , dst ) unless old_dsts &.key? ( dst )
168+ end
166169 end
167- @edges . each do |src , dst |
168- src . remove_edge ( genv , dst ) unless @new_edges . include? ( [ src , dst ] )
170+ @edges . each do |src , old_dsts |
171+ new_dsts = @new_edges [ src ]
172+ old_dsts . each_key do |dst |
173+ src . remove_edge ( genv , dst ) unless new_dsts &.key? ( dst )
174+ end
169175 end
170176 @edges , @new_edges = @new_edges , @edges
177+ @new_edges . each_value ( &:clear )
171178 @new_edges . clear
172179
173180 @boxes . each do |key , box |
0 commit comments