class TypeProf::Core::AST::BranchNode
Attributes
Public Class Methods
Source
# File bundled-src/typeprof-0.31.1/lib/typeprof/core/ast/control.rb, line 53 def initialize(raw_node, lenv) super(raw_node, lenv) @cond = AST.create_node(raw_node.predicate, lenv) @then = raw_node.statements ? AST.create_node(raw_node.statements, lenv) : nil else_clause = raw_node.is_a?(Prism::IfNode) ? raw_node.subsequent : raw_node.else_clause if else_clause else_clause = else_clause.statements if else_clause.type == :else_node @else = else_clause ? AST.create_node(else_clause, lenv) : nil else @else = nil end 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 70 def install0(genv) ret = Vertex.new(self) @cond.install(genv) vars = [] @then.modified_vars(@lenv.locals.keys, vars) if @then @else.modified_vars(@lenv.locals.keys, vars) if @else then_narrowing, else_narrowing = @cond.narrowings vars.concat(then_narrowing.map.keys.reject {|var| var.start_with?("@") }) vars.concat(else_narrowing.map.keys.reject {|var| var.start_with?("@") }) modified_vtxs = {} vars.uniq.each do |var| vtx = @lenv.get_var(var) nvtx_then = vtx.new_vertex(genv, self) nvtx_else = vtx.new_vertex(genv, self) modified_vtxs[var] = [nvtx_then, nvtx_else] end narrowing = self.is_a?(IfNode) ? then_narrowing : else_narrowing modified_vtxs.each do |var, (nvtx_then, _)| @lenv.set_var(var, nvtx_then) end then_val = AST.with_narrowing(genv, self, @lenv, narrowing) do val = @then ? @then.install(genv) : Source.new(genv.nil_type) modified_vtxs.each do |var, ary| ary[0] = @lenv.get_var(var) end val end @changes.add_edge(genv, then_val, ret) narrowing = self.is_a?(IfNode) ? else_narrowing : then_narrowing modified_vtxs.each do |var, (_, nvtx_else)| @lenv.set_var(var, nvtx_else) end else_val = AST.with_narrowing(genv, self, @lenv, narrowing) do val = @else ? @else.install(genv) : Source.new(genv.nil_type) modified_vtxs.each do |var, ary| ary[1] = @lenv.get_var(var) end val end @changes.add_edge(genv, else_val, ret) modified_vtxs.each do |var, (nvtx_then, nvtx_else)| nvtx_then = BotFilter.new(genv, self, nvtx_then, then_val).next_vtx nvtx_else = BotFilter.new(genv, self, nvtx_else, else_val).next_vtx nvtx_join = nvtx_then.new_vertex(genv, self) @changes.add_edge(genv, nvtx_else, nvtx_join) @lenv.set_var(var, nvtx_join) end ret end
Source
# File bundled-src/typeprof-0.31.1/lib/typeprof/core/ast/control.rb, line 68 def subnodes = { cond:, then:, else: } def install0(genv) ret = Vertex.new(self) @cond.install(genv) vars = [] @then.modified_vars(@lenv.locals.keys, vars) if @then @else.modified_vars(@lenv.locals.keys, vars) if @else then_narrowing, else_narrowing = @cond.narrowings vars.concat(then_narrowing.map.keys.reject {|var| var.start_with?("@") }) vars.concat(else_narrowing.map.keys.reject {|var| var.start_with?("@") }) modified_vtxs = {} vars.uniq.each do |var| vtx = @lenv.get_var(var) nvtx_then = vtx.new_vertex(genv, self) nvtx_else = vtx.new_vertex(genv, self) modified_vtxs[var] = [nvtx_then, nvtx_else] end narrowing = self.is_a?(IfNode) ? then_narrowing : else_narrowing modified_vtxs.each do |var, (nvtx_then, _)| @lenv.set_var(var, nvtx_then) end then_val = AST.with_narrowing(genv, self, @lenv, narrowing) do val = @then ? @then.install(genv) : Source.new(genv.nil_type) modified_vtxs.each do |var, ary| ary[0] = @lenv.get_var(var) end val end @changes.add_edge(genv, then_val, ret) narrowing = self.is_a?(IfNode) ? else_narrowing : then_narrowing modified_vtxs.each do |var, (_, nvtx_else)| @lenv.set_var(var, nvtx_else) end else_val = AST.with_narrowing(genv, self, @lenv, narrowing) do val = @else ? @else.install(genv) : Source.new(genv.nil_type) modified_vtxs.each do |var, ary| ary[1] = @lenv.get_var(var) end val end @changes.add_edge(genv, else_val, ret) modified_vtxs.each do |var, (nvtx_then, nvtx_else)| nvtx_then = BotFilter.new(genv, self, nvtx_then, then_val).next_vtx nvtx_else = BotFilter.new(genv, self, nvtx_else, else_val).next_vtx nvtx_join = nvtx_then.new_vertex(genv, self) @changes.add_edge(genv, nvtx_else, nvtx_join) @lenv.set_var(var, nvtx_join) end ret end end