<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def return_handler( self, call_node, function_nodes, saved_function_call_index, first_node ):
 """Handle the return from a function during a function call. Args: call_node(ast.Call) : The node that calls the definition. function_nodes(list[Node]):
 List of nodes of the function being called. saved_function_call_index(int):
 Unique number for each call. first_node(EntryOrExitNode or RestoreNode):
 Used to connect previous statements to this function. """

        if any(isinstance(node, YieldNode) for node in function_nodes):
            # Presence of a `YieldNode` means that the function is a generator
            rhs_prefix = 'yld_'
        elif any(isinstance(node, ConnectToExitNode) for node in function_nodes):
            # Only `Return`s and `Raise`s can be of type ConnectToExitNode
            rhs_prefix = 'ret_'
        else:
            return  # No return value

        # Create e.g. ~call_1 = ret_func_foo RestoreNode
        LHS = CALL_IDENTIFIER + 'call_' + str(saved_function_call_index)
        RHS = rhs_prefix + get_call_names_as_string(call_node.func)
        return_node = RestoreNode(
            LHS + ' = ' + RHS,
            LHS,
            [RHS],
            line_number=call_node.lineno,
            path=self.filenames[-1]
        )
        return_node.first_node = first_node
        self.nodes[-1].connect(return_node)
        self.nodes.append(return_node)