docs: def _iteratively_clean_pending_exits(self):
          """
          Iteratively update the completed functions set, analyze whether each function returns or not, and remove
          pending exits if the callee function does not return. We do this iteratively so that we come to a fixed point
          in the end. In most cases, the number of outer iteration equals to the maximum levels of wrapped functions
          whose "returningness" is determined by the very last function it calls.
  
          :return: None
          """
  
          while True:
              # did we finish analyzing any function?
              # fill in self._completed_functions
              self._make_completed_functions()
  
              if self._pending_jobs:
                  # There are no more remaining jobs, but only pending jobs left. Each pending job corresponds to
                  # a previous job that does not return properly.
                  # Now it's a good time to analyze each function (that we have so far) and determine if it is a)
                  # returning, b) not returning, or c) unknown. For those functions that are definitely not returning,
                  # remove the corresponding pending exits from `pending_jobs` array. Perform this procedure iteratively
                  # until no new not-returning functions appear. Then we pick a pending exit based on the following
                  # priorities:
                  # - Job pended by a returning function
                  # - Job pended by an unknown function
  
                  new_changes = self._iteratively_analyze_function_features()
                  functions_do_not_return = new_changes['functions_do_not_return']
  
                  self._update_function_callsites(functions_do_not_return)
  
                  if not self._clean_pending_exits():
                      # no more pending exits are removed. we are good to go!
                      break
              else:
                  break