code: def while_loop(self, instr, loop_block):
      kw = dict(lineno=instr.lineno, col_offset=0)
  
      loop_block_map = {instr.i: instr.op for instr in loop_block}
  
      first_i = loop_block[0].i
  
      func = (
          lambda instr: instr.opname == "JUMP_ABSOLUTE"
          and instr.oparg == first_i
      )
      body_index = rfind_index(loop_block[:-1], func)
  
      if body_index is None:
          const_while = True
          body_index = len(loop_block) - 1
      else:
          if body_index + 1 < len(loop_block):
              pop_block = loop_block[body_index + 1]
              const_while = pop_block.opname != "POP_BLOCK"
              const_else = True
          else:
              const_while = True
              const_else = False
  
      if const_while:
          test = _ast.Num(1, **kw)
          body_ = self.decompile_block(loop_block[:body_index]).stmnt()
  
          else_block = loop_block[body_index + 1 :]
          if else_block:
              else_ = self.decompile_block(else_block).stmnt()
          else:
              else_ = []
      else:
          pop_block = loop_block[body_index + 1]
  
          func = (
              lambda instr: instr.opname
              in ["POP_JUMP_IF_FALSE", "POP_JUMP_IF_TRUE"]
              and instr.oparg == pop_block.i
          )
          idx = rfind_index(loop_block[:body_index], func)
          cond_block = loop_block[:idx]
  
          iter_stmnt = self.decompile_block(cond_block).stmnt()
          assert len(iter_stmnt) == 1
          test = iter_stmnt[0]
  
          body_ = self.decompile_block(
              loop_block[idx + 1 : body_index]
          ).stmnt()
  
          else_block = loop_block[body_index + 2 :]
          if else_block:
              else_ = self.decompile_block(else_block[:]).stmnt()
          else:
              else_ = []
  
      while_ = _ast.While(test=test, body=body_, orelse=else_, **kw)
  
      self.ast_stack.append(while_)
  
imports: from __future__ import print_function
  from __future__ import division
  from __future__ import absolute_import
  import opcode
  import _ast
  from ..bytecodetools.instruction import Instruction
  from ..asttools.visitors.print_visitor import print_ast
  from ..utils import py3op, py2op, py3
label_desc: Use image node_id 20 for calling the CtrlFlowInstructions obj's underlying member method code with example usage: obj.while_loop(instr, loop_block) without return types