Skip to content

Commit 8cf2963

Browse files
committed
Fix rescue clause install
1 parent ee137fb commit 8cf2963

2 files changed

Lines changed: 70 additions & 5 deletions

File tree

lib/typeprof/core/ast/control.rb

Lines changed: 69 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -392,11 +392,77 @@ def undefine0(genv)
392392

393393
def install0(genv)
394394
ret = Vertex.new(self)
395+
396+
vars = []
397+
@body.modified_vars(@lenv.locals.keys, vars) if @body
398+
@rescue_clauses.each do |clause|
399+
clause.modified_vars(@lenv.locals.keys, vars)
400+
end
401+
@else_clause.modified_vars(@lenv.locals.keys, vars) if @else_clause
402+
@ensure_clause.modified_vars(@lenv.locals.keys, vars) if @ensure_clause
403+
vars.uniq!
404+
405+
old_vtxs = {}
406+
vars.each do |var|
407+
vtx = @lenv.get_var(var)
408+
old_vtxs[var] = vtx
409+
end
410+
395411
@changes.add_edge(genv, @body.install(genv), ret)
396-
@rescue_conds.each {|cond| cond.install(genv) }
397-
@rescue_clauses.each {|clause| @changes.add_edge(genv, clause.install(genv), ret) }
398-
@changes.add_edge(genv, @else_clause.install(genv), ret) if @else_clause
412+
413+
body_vtxs = {}
414+
vars.each do |var|
415+
body_vtxs[var] = @lenv.get_var(var)
416+
end
417+
418+
@rescue_conds.each { |cond| cond.install(genv) }
419+
420+
rescue_vtxs = []
421+
@rescue_clauses.each do |clause|
422+
vars.each do |var|
423+
old_vtx = old_vtxs[var]
424+
nvtx = old_vtx.new_vertex(genv, self)
425+
426+
if body_vtxs[var]
427+
@changes.add_edge(genv, body_vtxs[var], nvtx)
428+
end
429+
430+
@lenv.set_var(var, nvtx)
431+
end
432+
433+
@changes.add_edge(genv, clause.install(genv), ret)
434+
435+
rescue_vtxs << {}
436+
vars.each do |var|
437+
rescue_vtxs.last[var] = @lenv.get_var(var)
438+
end
439+
end
440+
441+
if @else_clause
442+
vars.each do |var|
443+
@lenv.set_var(var, body_vtxs[var])
444+
end
445+
@changes.add_edge(genv, @else_clause.install(genv), ret)
446+
end
447+
399448
@ensure_clause.install(genv) if @ensure_clause
449+
450+
result_vtxs = {}
451+
vars.each do |var|
452+
result_vtx = old_vtxs[var].new_vertex(genv, self)
453+
result_vtxs[var] = result_vtx
454+
455+
@changes.add_edge(genv, body_vtxs[var], result_vtx)
456+
457+
rescue_vtxs.each do |rescue_vtx|
458+
@changes.add_edge(genv, rescue_vtx[var], result_vtx)
459+
end
460+
end
461+
462+
vars.each do |var|
463+
@lenv.set_var(var, result_vtxs[var])
464+
end
465+
400466
ret
401467
end
402468
end

scenario/control/rescue.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ def foo(n)
1212
rescue SyntaxError
1313
:b
1414
rescue Exception
15-
## TODO: bar should accept "Integer | String" ???
1615
bar(n)
1716
else
1817
:d
@@ -28,7 +27,7 @@ def baz(n)
2827

2928
## assert
3029
class Object
31-
def bar: (String) -> :c
30+
def bar: (Integer | String) -> :c
3231
def foo: (Integer) -> (:a | :b | :c | :d | Float)
3332
def baz: (Integer) -> (:a | Integer)
3433
end

0 commit comments

Comments
 (0)