'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'

def _iteratively_clean_pending_exits(self):

    while True:
        self._make_completed_functions()
        if self._pending_jobs:
            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()):
                break
        else:
            break
