class TypeProf::Core::AST::BranchNode::LoopNode
Attributes
body[R]
cond[R]
Public Class Methods
new(raw_node, lenv)
click to toggle source
Calls superclass method
TypeProf::Core::AST::Node::new
# File typeprof-0.30.1/lib/typeprof/core/ast/control.rb, line 116 def initialize(raw_node, lenv) super(raw_node, lenv) @cond = AST.create_node(raw_node.predicate, lenv) @body = raw_node.statements ? AST.create_node(raw_node.statements, lenv) : DummyNilNode.new(code_range, lenv) end
Public Instance Methods
install0(genv)
click to toggle source
# File typeprof-0.30.1/lib/typeprof/core/ast/control.rb, line 126 def install0(genv) vars = [] vars << @cond.var if @cond.is_a?(LocalVariableReadNode) @cond.modified_vars(@lenv.locals.keys, vars) @body.modified_vars(@lenv.locals.keys, vars) vars.uniq! old_vtxs = {} vars.each do |var| vtx = @lenv.get_var(var) nvtx = vtx.new_vertex(genv, self) old_vtxs[var] = nvtx @lenv.set_var(var, nvtx) end @cond.install(genv) if @cond.is_a?(LocalVariableReadNode) nvtx_then = NilFilter.new(genv, self, old_vtxs[@cond.var], self.is_a?(UntilNode)).next_vtx @lenv.set_var(@cond.var, nvtx_then) end if @lenv.exist_var?(:"*expected_block_ret") expected_block_ret = @lenv.locals[:"*expected_block_ret"] @lenv.set_var(:"*expected_block_ret", nil) end @body.install(genv) if expected_block_ret @lenv.set_var(:"*expected_block_ret", expected_block_ret) end vars.each do |var| @changes.add_edge(genv, @lenv.get_var(var), old_vtxs[var]) @lenv.set_var(var, old_vtxs[var]) end if @cond.is_a?(LocalVariableReadNode) nvtx_then = NilFilter.new(genv, self, old_vtxs[@cond.var], !self.is_a?(UntilNode)).next_vtx @lenv.set_var(@cond.var, nvtx_then) end Source.new(genv.nil_type) end
subnodes(= { cond:, body: })
click to toggle source
# File typeprof-0.30.1/lib/typeprof/core/ast/control.rb, line 124 def subnodes = { cond:, body: } def install0(genv) vars = [] vars << @cond.var if @cond.is_a?(LocalVariableReadNode) @cond.modified_vars(@lenv.locals.keys, vars) @body.modified_vars(@lenv.locals.keys, vars) vars.uniq! old_vtxs = {} vars.each do |var| vtx = @lenv.get_var(var) nvtx = vtx.new_vertex(genv, self) old_vtxs[var] = nvtx @lenv.set_var(var, nvtx) end @cond.install(genv) if @cond.is_a?(LocalVariableReadNode) nvtx_then = NilFilter.new(genv, self, old_vtxs[@cond.var], self.is_a?(UntilNode)).next_vtx @lenv.set_var(@cond.var, nvtx_then) end if @lenv.exist_var?(:"*expected_block_ret") expected_block_ret = @lenv.locals[:"*expected_block_ret"] @lenv.set_var(:"*expected_block_ret", nil) end @body.install(genv) if expected_block_ret @lenv.set_var(:"*expected_block_ret", expected_block_ret) end vars.each do |var| @changes.add_edge(genv, @lenv.get_var(var), old_vtxs[var]) @lenv.set_var(var, old_vtxs[var]) end if @cond.is_a?(LocalVariableReadNode) nvtx_then = NilFilter.new(genv, self, old_vtxs[@cond.var], !self.is_a?(UntilNode)).next_vtx @lenv.set_var(@cond.var, nvtx_then) end Source.new(genv.nil_type) end end