class TypeProf::Core::AST::BranchNode::LoopNode::BreakNode::NextNode::WhenNode::CaseNode::CaseMatchNode::AndNode::OrNode::ReturnNode::RescueNode::BeginNode
Attributes
Public Class Methods
Source
# File bundled-src/typeprof-0.31.1/lib/typeprof/core/ast/control.rb, line 558 def initialize(raw_node, lenv) super(raw_node, lenv) @body = raw_node.statements ? AST.create_node(raw_node.statements, lenv) : DummyNilNode.new(code_range, lenv) @rescue_clauses = [] raw_res = raw_node.rescue_clause while raw_res @rescue_clauses << AST.create_node(raw_res, lenv) raw_res = raw_res.subsequent end @else_clause = AST.create_node(raw_node.else_clause.statements, lenv) if raw_node.else_clause&.statements @ensure_clause = AST.create_node(raw_node.ensure_clause.statements, lenv) if raw_node.ensure_clause&.statements end
Calls superclass method
TypeProf::Core::AST::Node::new
Public Instance Methods
Source
# File bundled-src/typeprof-0.31.1/lib/typeprof/core/ast/control.rb, line 576 def define0(genv) @body.define(genv) @rescue_clauses.each {|clause| clause.define(genv) } @else_clause.define(genv) if @else_clause @ensure_clause.define(genv) if @ensure_clause end
Source
# File bundled-src/typeprof-0.31.1/lib/typeprof/core/ast/control.rb, line 590 def install0(genv) ret = Vertex.new(self) vars = [] @body.modified_vars(@lenv.locals.keys, vars) if @body vars.uniq! old_vtxs = {} vars.each do |var| vtx = @lenv.get_var(var) old_vtxs[var] = vtx end @changes.add_edge(genv, @body.install(genv), ret) body_vtxs = {} vars.each do |var| body_vtxs[var] = @lenv.get_var(var) end clause_vtxs_list = [] @rescue_clauses.each do |clause| vars.each do |var| old_vtx = old_vtxs[var] nvtx = old_vtx.new_vertex(genv, self) @changes.add_edge(genv, body_vtxs[var], nvtx) unless body_vtxs[var] == old_vtxs[var] @lenv.set_var(var, nvtx) end @changes.add_edge(genv, clause.install(genv), ret) clause_vtxs_list << {} vars.each do |var| clause_vtxs_list.last[var] = @lenv.get_var(var) end end if @else_clause vars.each do |var| @lenv.set_var(var, body_vtxs[var]) end @changes.add_edge(genv, @else_clause.install(genv), ret) clause_vtxs_list << {} vars.each do |var| clause_vtxs_list.last[var] = @lenv.get_var(var) end end if @ensure_clause vars.each do |var| union_vtx = old_vtxs[var].new_vertex(genv, self) @changes.add_edge(genv, body_vtxs[var], union_vtx) clause_vtxs_list.each do |clause_vtx| @changes.add_edge(genv, clause_vtx[var], union_vtx) end @lenv.set_var(var, union_vtx) end @ensure_clause.install(genv) clause_vtxs_list << {} vars.each do |var| clause_vtxs_list.last[var] = @lenv.get_var(var) end end result_vtxs = {} vars.each do |var| result_vtx = old_vtxs[var].new_vertex(genv, self) result_vtxs[var] = result_vtx @changes.add_edge(genv, body_vtxs[var], result_vtx) unless body_vtxs[var] == old_vtxs[var] clause_vtxs_list.each do |clause_vtx| @changes.add_edge(genv, clause_vtx[var], result_vtx) end end vars.each do |var| @lenv.set_var(var, result_vtxs[var]) end ret end
Source
# File bundled-src/typeprof-0.31.1/lib/typeprof/core/ast/control.rb, line 574 def subnodes = { body:, rescue_clauses:, else_clause:, ensure_clause: } def define0(genv) @body.define(genv) @rescue_clauses.each {|clause| clause.define(genv) } @else_clause.define(genv) if @else_clause @ensure_clause.define(genv) if @ensure_clause end def undefine0(genv) @body.undefine(genv) @rescue_clauses.each {|clause| clause.undefine(genv) } @else_clause.undefine(genv) if @else_clause @ensure_clause.undefine(genv) if @ensure_clause end def install0(genv) ret = Vertex.new(self) vars = [] @body.modified_vars(@lenv.locals.keys, vars) if @body vars.uniq! old_vtxs = {} vars.each do |var| vtx = @lenv.get_var(var) old_vtxs[var] = vtx end @changes.add_edge(genv, @body.install(genv), ret) body_vtxs = {} vars.each do |var| body_vtxs[var] = @lenv.get_var(var) end clause_vtxs_list = [] @rescue_clauses.each do |clause| vars.each do |var| old_vtx = old_vtxs[var] nvtx = old_vtx.new_vertex(genv, self) @changes.add_edge(genv, body_vtxs[var], nvtx) unless body_vtxs[var] == old_vtxs[var] @lenv.set_var(var, nvtx) end @changes.add_edge(genv, clause.install(genv), ret) clause_vtxs_list << {} vars.each do |var| clause_vtxs_list.last[var] = @lenv.get_var(var) end end if @else_clause vars.each do |var| @lenv.set_var(var, body_vtxs[var]) end @changes.add_edge(genv, @else_clause.install(genv), ret) clause_vtxs_list << {} vars.each do |var| clause_vtxs_list.last[var] = @lenv.get_var(var) end end if @ensure_clause vars.each do |var| union_vtx = old_vtxs[var].new_vertex(genv, self) @changes.add_edge(genv, body_vtxs[var], union_vtx) clause_vtxs_list.each do |clause_vtx| @changes.add_edge(genv, clause_vtx[var], union_vtx) end @lenv.set_var(var, union_vtx) end @ensure_clause.install(genv) clause_vtxs_list << {} vars.each do |var| clause_vtxs_list.last[var] = @lenv.get_var(var) end end result_vtxs = {} vars.each do |var| result_vtx = old_vtxs[var].new_vertex(genv, self) result_vtxs[var] = result_vtx @changes.add_edge(genv, body_vtxs[var], result_vtx) unless body_vtxs[var] == old_vtxs[var] clause_vtxs_list.each do |clause_vtx| @changes.add_edge(genv, clause_vtx[var], result_vtx) end end vars.each do |var| @lenv.set_var(var, result_vtxs[var]) end ret end end
Source
# File bundled-src/typeprof-0.31.1/lib/typeprof/core/ast/control.rb, line 583 def undefine0(genv) @body.undefine(genv) @rescue_clauses.each {|clause| clause.undefine(genv) } @else_clause.undefine(genv) if @else_clause @ensure_clause.undefine(genv) if @ensure_clause end