code: def _compute_slices(self, start_idx, end_idx, assets):
          
          # The core implementation of the logic here is implemented in Cython
          # for efficiency.
          return _compute_row_slices(
              self._first_rows,
              self._last_rows,
              self._calendar_offsets,
              start_idx,
              end_idx,
              assets,
          )
docs: Compute the raw row indices to load for each asset on a query for the
          given dates after applying a shift.
  
          Parameters
          ----------
          start_idx : int
              Index of first date for which we want data.
          end_idx : int
              Index of last date for which we want data.
          assets : pandas.Int64Index
              Assets for which we want to compute row indices
  
          Returns
          -------
          A 3-tuple of (first_rows, last_rows, offsets):
          first_rows : np.array[intp]
              Array with length == len(assets) containing the index of the first
              row to load for each asset in `assets`.
          last_rows : np.array[intp]
              Array with length == len(assets) containing the index of the last
              row to load for each asset in `assets`.
          offset : np.array[intp]
              Array with length == (len(asset) containing the index in a buffer
              of length `dates` corresponding to the first row of each asset.
  
              The value of offset[i] will be 0 if asset[i] existed at the start
              of a query.  Otherwise, offset[i] will be equal to the number of
              entries in `dates` for which the asset did not yet exist.