@@ -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 = [ ]
@@ -62,7 +62,14 @@ def new_contravariant_vertex(genv, sig_type_node)
6262 end
6363
6464 def add_edge ( genv , src , dst )
65- @new_edges << [ src , dst ]
65+ key = [ src , dst ]
66+ return if @new_edges [ key ]
67+ @new_edges [ key ] = @edges [ key ] || begin
68+ bridge = Vertex . new ( @node )
69+ src . add_edge ( genv , bridge )
70+ bridge . add_edge ( genv , dst )
71+ bridge
72+ end
6673 end
6774
6875 # TODO: if an edge is removed during one analysis, we may need to remove sub-boxes?
@@ -158,12 +165,12 @@ def add_depended_superclass(mod)
158165 end
159166
160167 def reinstall ( genv )
161- @new_edges . uniq!
162- @new_edges . each do | src , dst |
163- src . add_edge ( genv , dst ) unless @edges . include? ( [ src , dst ] )
164- end
165- @edges . each do | src , dst |
166- src . remove_edge ( genv , dst ) unless @new_edges . include? ( [ src , dst ] )
168+ @edges . each do | key , bridge |
169+ unless @new_edges . key? ( key )
170+ src , dst = key
171+ src . remove_edge ( genv , bridge )
172+ bridge . remove_edge ( genv , dst )
173+ end
167174 end
168175 @edges , @new_edges = @new_edges , @edges
169176 @new_edges . clear
0 commit comments