@@ -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
0 commit comments