':param angr.Block node:
:param VariableRecoveryState state:
:return:'

def _run_on_node(self, node, state):

    input_state = state
    block = self.project.factory.block(node.addr, node.size, opt_level=0)
    if (node.addr in self._node_to_input_state):
        prev_state = self._node_to_input_state[node.addr]
        if (input_state == prev_state):
            l.debug('Skip    node    %#x    as    we    have    reached    a    fixed-point', node.addr)
            return (False, input_state)
        else:
            l.debug('Merging    input    state    of    node    %#x    with    the    previous    state.', node.addr)
            input_state = prev_state.merge(input_state, successor=node.addr)
    state = input_state.copy()
    self._node_to_input_state[node.addr] = input_state
    if (self._node_iterations[node.addr] >= self._max_iterations):
        l.debug('Skip    node    %#x    as    we    have    iterated    %d    times    on    it.', node.addr, self._node_iterations[node.addr])
        return (False, state)
    self._process_block(state, block)
    self._node_to_state[node.addr] = state
    self._node_iterations[node.addr] += 1
    return (True, state)
