class_docstr: Computes the Control Flow Graph of a function.
  
  The processing of a node yields a pair containing
  * the OUT nodes, to be linked with the IN nodes of the successor
  * the RAISE nodes, nodes that stop the control flow (exception/break/...)
class_docstr_tok: ["Computes","the","Control","Flow","Graph","of","a","function",".","The","processing","of","a","node","yields","a","pair","containing","*","the","OUT","nodes",",","to","be","linked","with","the","IN","nodes","of","the","successor","*","the","RAISE","nodes",",","nodes","that","stop","the","control","flow","(","exception\/break\/","...",")"]
docstr: OUT = (node,) + last body statements
  RAISES = body's that are not break or continue
docstr_tok: ["OUT","=","(","node",",",")","+","last","body","statements","RAISES","=","body","'s","that","are","not","break","or","continue"]
code: def visit_For(self, node):
      """
      OUT = (node,) + last body statements
      RAISES = body's that are not break or continue
      """
      currs = (node,)
      break_currs = tuple()
      raises = ()
      # handle body
      for n in node.body:
          self.result.add_node(n)
          for curr in currs:
              self.result.add_edge(curr, n)
          currs, nraises = self.visit(n)
          for nraise in nraises:
              if isinstance(nraise, ast.Break):
                  break_currs += (nraise,)
              elif isinstance(nraise, ast.Continue):
                  self.result.add_edge(nraise, node)
              else:
                  raises += (nraise,)
      # add the backward loop
      for curr in currs:
          self.result.add_edge(curr, node)
  
      # the else statement if needed
      if node.orelse:
          for n in node.orelse:
              self.result.add_node(n)
              for curr in currs:
                  self.result.add_edge(curr, n)
              currs, nraises = self.visit(n)
      else:
          currs = (node,)
  
      # while only
      if isinstance(node, ast.While):
          if is_true_predicate(node.test):
              return break_currs, raises
          else:
              return break_currs + currs, raises
  
      # for only
      return break_currs + currs, raises
  
file_path: catboost/contrib/python/pythran/pythran/analyses/cfg.py
imports: from pythran.passmanager import FunctionAnalysis
  from pythran.utils import isnum
  from pythran.graph import DiGraph
  import gast
label_desc: Use image node_id 5 for calling the CFG obj's underlying member method code with example usage: obj.visit_For(node) and returns: unknown,  raises, break_currs,  raises, unknown,  raises