Skip to content

Commit 24cf28e

Browse files
sinsokumame
authored andcommitted
Fix infinite loop caused by inline RBS comments
When analyzing the following code with TypeProf, an infinite loop occurs. ```ruby class C #: (Array[untyped]) -> Array[untyped] def foo(x) x end end ``` TypeProf generates duplicate vertices for the same sig node. To resolve this issue, it restores the code removed in 3251cbc.
1 parent 5d26f86 commit 24cf28e

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

lib/typeprof/core/graph/change_set.rb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def initialize(node, target)
2222
@new_depended_superclasses = []
2323
end
2424

25-
attr_reader :node, :target, :covariant_types, :edges, :boxes, :diagnostics
25+
attr_reader :node, :target, :covariant_types, :contravariant_types, :edges, :boxes, :diagnostics
2626

2727
def reuse(new_node)
2828
@node = new_node
@@ -33,11 +33,13 @@ def reuse(new_node)
3333

3434
def copy_from(other)
3535
@covariant_types = other.covariant_types.dup
36+
@contravariant_types = other.contravariant_types.dup
3637
@edges = other.edges.dup
3738
@boxes = other.boxes.dup
3839
@diagnostics = other.diagnostics.dup
3940

4041
other.covariant_types.clear
42+
other.contravariant_types.clear
4143
other.edges.clear
4244
other.boxes.clear
4345
other.diagnostics.clear
@@ -55,7 +57,8 @@ def new_covariant_vertex(genv, sig_type_node)
5557
end
5658

5759
def new_contravariant_vertex(genv, sig_type_node)
58-
Vertex.new(sig_type_node)
60+
# This is used to avoid duplicated vertex generation for the same sig node
61+
@contravariant_types[sig_type_node] ||= Vertex.new(sig_type_node)
5962
end
6063

6164
def add_edge(genv, src, dst)

scenario/rbs/inline2.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
## update
2+
class C
3+
#: (Array[untyped]) -> Array[untyped]
4+
def foo(x)
5+
x
6+
end
7+
end
8+
9+
## assert
10+
class C
11+
def foo: (Array[untyped]) -> Array[untyped]
12+
end

0 commit comments

Comments
 (0)