(self, tailnode, seen)
return callers
recursively search predecessors for the actual caller
        for a tailnode that we will return to

        :return: list of callers for a possible tailnode
recursively search predecessors for the actual caller
        for a tailnode that we will return to
recursively search predecessors for the actual caller for a tailnode that we will return to
def _get_tail_caller(self, tailnode, seen):
        """
        recursively search predecessors for the actual caller
        for a tailnode that we will return to

        :return: list of callers for a possible tailnode
        """

        if tailnode.addr in seen:
            return []
        seen.add(tailnode.addr)

        callers = self.model.get_predecessors(tailnode, jumpkind='Ijk_Call')
        direct_jumpers = self.model.get_predecessors(tailnode, jumpkind='Ijk_Boring')
        jump_callers = []

        for jn in direct_jumpers:
            jf = self.model.get_any_node(jn.function_address)
            if jf is not None:
                jump_callers.extend(self._get_tail_caller(jf, seen))

        callers.extend(jump_callers)

        return callers
def _get_tail_caller ( self , tailnode , seen ) : if tailnode . addr in seen : return [ ] seen . add ( tailnode . addr ) callers = self . model . get_predecessors ( tailnode , jumpkind = 'Ijk_Call' ) direct_jumpers = self . model . get_predecessors ( tailnode , jumpkind = 'Ijk_Boring' ) jump_callers = [ ] for jn in direct_jumpers : jf = self . model . get_any_node ( jn . function_address ) if jf is not None : jump_callers . extend ( self . _get_tail_caller ( jf , seen ) ) callers . extend ( jump_callers ) return callers