Skip to content

Commit b93d846

Browse files
committed
Improve ForNode to process loop variable and track modified vars
1 parent 810f410 commit b93d846

3 files changed

Lines changed: 37 additions & 5 deletions

File tree

lib/typeprof/core/ast/misc.rb

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -265,19 +265,39 @@ def install0(genv)
265265
class ForNode < Node
266266
def initialize(raw_node, lenv)
267267
super(raw_node, lenv)
268-
# XXX: tentative implementation
269-
# raw_node.index
268+
@index = AST.create_target_node(raw_node.index, lenv)
270269
@expr = AST.create_node(raw_node.collection, lenv)
271270
@body = raw_node.statements ? AST.create_node(raw_node.statements, lenv) : DummyNilNode.new(TypeProf::CodeRange.new(code_range.last, code_range.last), lenv)
272271
end
273272

274-
attr_reader :expr, :body
273+
attr_reader :index, :expr, :body
275274

276-
def subnodes = { expr:, body: }
275+
def subnodes = { index:, expr:, body: }
277276

278277
def install0(genv)
279278
@expr.install(genv)
279+
280+
vars = []
281+
@index.modified_vars(@lenv.locals.keys, vars)
282+
@body.modified_vars(@lenv.locals.keys, vars)
283+
vars.uniq!
284+
285+
old_vtxs = {}
286+
vars.each do |var|
287+
vtx = @lenv.get_var(var)
288+
nvtx = vtx.new_vertex(genv, self)
289+
old_vtxs[var] = nvtx
290+
@lenv.set_var(var, nvtx)
291+
end
292+
293+
@index.install(genv)
280294
@body.install(genv)
295+
296+
vars.each do |var|
297+
@changes.add_edge(genv, @lenv.get_var(var), old_vtxs[var])
298+
@lenv.set_var(var, old_vtxs[var])
299+
end
300+
281301
Source.new(genv.nil_type)
282302
end
283303
end

scenario/misc/for-variable-leak.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
## update
2+
def foo
3+
x = "hello"
4+
for i in [1, 2, 3]
5+
x = 42
6+
end
7+
x
8+
end
9+
10+
## assert
11+
class Object
12+
def foo: -> (Integer | String)
13+
end

scenario/misc/for.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
## update
22
def foo
33
for i in 1..100
4-
# currently, TypeProf does not initialize i
54
return 1
65
end
76
end

0 commit comments

Comments
 (0)