Skip to content

Commit 3251cbc

Browse files
committed
Replace contravariant_vertex+check_match with typecheck
1 parent d6c1caa commit 3251cbc

23 files changed

Lines changed: 428 additions & 165 deletions

lib/typeprof/core/ast/base.rb

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@ def initialize(raw_node, lenv)
99
@ret = nil
1010

1111
@changes = ChangeSet.new(self, nil)
12+
@diagnostics = Set[]
1213
end
1314

1415
attr_reader :lenv
1516
attr_reader :prev_node
1617
attr_reader :static_ret
1718
attr_reader :ret
1819
attr_reader :changes
20+
attr_reader :diagnostics
1921

2022
def subnodes = {}
2123
def attrs = {}
@@ -99,6 +101,10 @@ def install(genv)
99101
def install_copy(genv)
100102
@changes.copy_from((@prev_node || raise).changes)
101103
@changes.reuse(self)
104+
(@prev_node || raise).diagnostics.each do |diag|
105+
diag.reuse(self)
106+
@diagnostics << diag
107+
end
102108
each_subnode do |subnode|
103109
subnode.install_copy(genv)
104110
end
@@ -120,6 +126,14 @@ def narrowings
120126
Narrowing::EmptyNarrowings
121127
end
122128

129+
def add_diagnostic(diag)
130+
@diagnostics << diag
131+
end
132+
133+
def remove_diagnostic(diag)
134+
@diagnostics.delete(diag)
135+
end
136+
123137
def diff(prev_node)
124138
if prev_node.is_a?(self.class) && attrs.all? {|key, attr| attr == prev_node.send(key) }
125139
raise unless prev_node # annotation
@@ -163,13 +177,10 @@ def boxes(key)
163177
end
164178
end
165179

166-
def diagnostics(genv, &blk)
167-
@changes.diagnostics.each(&blk)
168-
@changes.boxes.each_value do |box|
169-
box.diagnostics(genv, &blk)
170-
end
180+
def each_diagnostic(genv, &blk)
181+
@diagnostics.each(&blk)
171182
each_subnode do |subnode|
172-
subnode.diagnostics(genv, &blk)
183+
subnode.each_diagnostic(genv, &blk)
173184
end
174185
end
175186

lib/typeprof/core/ast/call.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,9 +130,9 @@ def install0(genv)
130130
block_body.lenv.set_var(var, nvtx)
131131
end
132132

133-
e_ret = @block_body.lenv.locals[:"*expected_block_ret"] = Vertex.new(self)
133+
@block_body.lenv.locals[:"*expected_block_ret"] = Vertex.new(self)
134134
@block_body.install(genv)
135-
@block_body.lenv.add_next_box(@changes.add_escape_box(genv, @block_body.ret, e_ret))
135+
@block_body.lenv.add_next_box(@changes.add_escape_box(genv, @block_body.ret))
136136

137137
vars.each do |var|
138138
@changes.add_edge(genv, block_body.lenv.get_var(var), @lenv.get_var(var))

lib/typeprof/core/ast/control.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ def subnodes = { arg: }
234234
def install0(genv)
235235
@arg.install(genv)
236236
if @lenv.exist_var?(:"*expected_block_ret")
237-
@lenv.add_next_box(@changes.add_escape_box(genv, @arg.ret, @lenv.get_var(:"*expected_block_ret")))
237+
@lenv.add_next_box(@changes.add_escape_box(genv, @arg.ret))
238238
end
239239
Source.new(Type::Bot.new(genv))
240240
end
@@ -495,7 +495,7 @@ def subnodes = { arg: }
495495
def install0(genv)
496496
@arg.install(genv)
497497
e_ret = @lenv.locals[:"*expected_method_ret"]
498-
@lenv.add_return_box(@changes.add_escape_box(genv, @arg.ret, e_ret)) if e_ret
498+
@lenv.add_return_box(@changes.add_escape_box(genv, @arg.ret)) if e_ret
499499
Source.new(Type::Bot.new(genv))
500500
end
501501
end

lib/typeprof/core/ast/meta.rb

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,7 @@ def install0(genv)
7979
@args.each do |arg|
8080
ivar_name = :"@#{ arg }"
8181
ivar_box = @changes.add_ivar_read_box(genv, @lenv.cref.cpath, false, ivar_name)
82-
e_ret = Vertex.new(self)
83-
ret_box = @changes.add_escape_box(genv, ivar_box.ret, e_ret)
82+
ret_box = @changes.add_escape_box(genv, ivar_box.ret)
8483
@changes.add_method_def_box(genv, @lenv.cref.cpath, false, arg, FormalArguments::Empty, [ret_box])
8584
end
8685
Source.new
@@ -136,8 +135,7 @@ def undefine0(genv)
136135
def install0(genv)
137136
@args.zip(@static_ret) do |arg, ive|
138137
ivar_box = @changes.add_ivar_read_box(genv, @lenv.cref.cpath, false, :"@#{ arg }")
139-
e_ret = Vertex.new(self)
140-
ret_box = @changes.add_escape_box(genv, ivar_box.ret, e_ret)
138+
ret_box = @changes.add_escape_box(genv, ivar_box.ret)
141139
@changes.add_method_def_box(genv, @lenv.cref.cpath, false, arg, FormalArguments::Empty, [ret_box])
142140

143141
vtx = Vertex.new(self)

lib/typeprof/core/ast/method.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -248,9 +248,9 @@ def install0(genv)
248248
end
249249

250250
if @body
251-
e_ret = @body.lenv.locals[:"*expected_method_ret"] = Vertex.new(self)
251+
@body.lenv.locals[:"*expected_method_ret"] = Vertex.new(self)
252252
@body.install(genv)
253-
@body.lenv.add_return_box(@changes.add_escape_box(genv, @body.ret, e_ret))
253+
@body.lenv.add_return_box(@changes.add_escape_box(genv, @body.ret))
254254
end
255255

256256
f_args = FormalArguments.new(

0 commit comments

Comments
 (0)