'Before processing a CFGJob.
Right now each block is traced at most once. If it is traced more than once, we will mark it as "should_skip"
before tracing it.
An AngrForwardAnalysisSkipJob exception is raised in order to skip analyzing the job.
:param CFGJob job: The CFG job object.
:param dict _locals: A bunch of local variables that will be kept around when handling this job and its
corresponding successors.
:return: None'

def _pre_job_handling(self, job):

    job.call_stack_suffix = job.get_call_stack_suffix()
    job.current_function = self.kb.functions.function(job.func_addr, create=True, syscall=job.jumpkind.startswith('Ijk_Sys'))
    src_block_id = job.src_block_id
    src_exit_stmt_idx = job.src_exit_stmt_idx
    src_ins_addr = job.src_ins_addr
    addr = job.addr
    if (l.level == logging.DEBUG):
        self._analyzed_addrs.add(addr)
    if (addr == job.func_addr):
        self._function_input_states[job.func_addr] = job.state
    self._deregister_analysis_job(job.func_addr, job)
    block_id = job.block_id
    should_skip = False
    if (self._traced_addrs[job.call_stack_suffix][addr] >= self._max_iterations):
        should_skip = True
    elif (self._is_call_jumpkind(job.jumpkind) and (self._call_depth is not None) and (len(job.call_stack) > self._call_depth) and ((self._call_tracing_filter is None) or self._call_tracing_filter(job.state, job.jumpkind))):
        should_skip = True
    job.state._inspect('cfg_handle_job', BP_BEFORE)
    (sim_successors, exception_info, _) = self._get_simsuccessors(addr, job, current_function_addr=job.func_addr)
    if (self._max_steps is None):
        depth = None
    elif (src_block_id is None):
        depth = 0
    else:
        src_cfgnode = self._nodes[src_block_id]
        depth = (src_cfgnode.depth + 1)
    if (block_id not in self._nodes):
        cfg_node = self._create_cfgnode(sim_successors, job.call_stack, job.func_addr, block_id=block_id, depth=depth)
        self._nodes[block_id] = cfg_node
        self._nodes_by_addr[cfg_node.addr].append(cfg_node)
    else:
        cfg_node = self._nodes[block_id]
    self._traced_addrs[job.call_stack_suffix][addr] += 1
    if self._keep_state:
        cfg_node.input_state = sim_successors.initial_state
    if ((sim_successors is None) or should_skip):
        self._graph_add_edge(src_block_id, block_id, jumpkind=job.jumpkind, stmt_idx=src_exit_stmt_idx, ins_addr=src_ins_addr)
        self._update_function_transition_graph(src_block_id, block_id, jumpkind=job.jumpkind, ins_addr=src_ins_addr, stmt_idx=src_exit_stmt_idx)
        if ((job.jumpkind == 'Ijk_Ret') and (block_id in self._pending_jobs)):
            pending_job = self._pending_jobs.pop(block_id)
            self._deregister_analysis_job(pending_job.caller_func_addr, pending_job)
            self._graph_add_edge(pending_job.src_block_id, block_id, jumpkind='Ijk_FakeRet', stmt_idx=pending_job.src_exit_stmt_idx, ins_addr=pending_job.src_exit_ins_addr)
            self._update_function_transition_graph(pending_job.src_block_id, block_id, jumpkind='Ijk_FakeRet', ins_addr=pending_job.src_exit_ins_addr, stmt_idx=pending_job.src_exit_stmt_idx)
        raise AngrSkipJobNotice()
    self._update_thumb_addrs(sim_successors, job.state)
    if self._enable_function_hints:
        if (sim_successors.sort == 'IRSB'):
            function_hints = self._search_for_function_hints(sim_successors.all_successors[0])
            for f in function_hints:
                self._pending_function_hints.add(f)
    self._graph_add_edge(src_block_id, block_id, jumpkind=job.jumpkind, stmt_idx=src_exit_stmt_idx, ins_addr=src_ins_addr)
    self._update_function_transition_graph(src_block_id, block_id, jumpkind=job.jumpkind, ins_addr=src_ins_addr, stmt_idx=src_exit_stmt_idx)
    if (block_id in self._pending_edges):
        for (src_key, dst_key, data) in self._pending_edges[block_id]:
            self._graph_add_edge(src_key, dst_key, **data)
        del self._pending_edges[block_id]
    if ((job.jumpkind == 'Ijk_Ret') and (block_id in self._pending_jobs)):
        pending_job = self._pending_jobs.pop(block_id)
        self._deregister_analysis_job(pending_job.caller_func_addr, pending_job)
        self._graph_add_edge(pending_job.src_block_id, block_id, jumpkind='Ijk_FakeRet', stmt_idx=pending_job.src_exit_stmt_idx, ins_addr=src_ins_addr)
        self._update_function_transition_graph(pending_job.src_block_id, block_id, jumpkind='Ijk_FakeRet', ins_addr=src_ins_addr, stmt_idx=pending_job.src_exit_stmt_idx, confirmed=True)
    block_info = self.project.arch.gather_info_from_state(sim_successors.initial_state)
    self._block_artifacts[addr] = block_info
    job.cfg_node = cfg_node
    job.sim_successors = sim_successors
    job.exception_info = exception_info
    job.successor_status = {}
