code: def get_function_info(
      index: int, instruction_list: list, signature_database: SignatureDB
  ) -> Tuple[str, int, str]:
      
  
      # Append with missing 0s at the beginning
      function_hash = "0x" + instruction_list[index]["argument"][2:].rjust(8, "0")
      function_names = signature_database.get(function_hash)
      if len(function_names) > 1:
          # In this case there was an ambiguous result
          function_name = "[{}] (ambiguous)".format(", ".join(function_names))
      elif len(function_names) == 1:
          function_name = function_names[0]
      else:
          function_name = "_function_" + function_hash
  
      try:
          offset = instruction_list[index + 2]["argument"]
          entry_point = int(offset, 16)
      except (KeyError, IndexError):
          return function_hash, None, None
  
      return function_hash, entry_point, function_name
docs: Finds the function information for a call table entry Solidity uses the
      first 4 bytes of the calldata to indicate which function the message call
      should execute The generated code that directs execution to the correct
      function looks like this:
  
      - PUSH function_hash
      - EQ
      - PUSH entry_point
      - JUMPI
  
      This function takes an index that points to the first instruction, and from that finds out the function hash,
      function entry and the function name.
  
      :param index: Start of the entry pattern
      :param instruction_list: Instruction list for the contract that is being analyzed
      :param signature_database: Database used to map function hashes to their respective function names
      :return: function hash, function entry point, function name