rust/hg-cpython/src/revlog.rs
changeset 51255 24d3298189d7
parent 51254 f94c10334bcb
child 51258 8b89f7cc953a
equal deleted inserted replaced
51254:f94c10334bcb 51255:24d3298189d7
    40     py: Python,
    40     py: Python,
    41     index: PyObject,
    41     index: PyObject,
    42 ) -> PyResult<UnsafePyLeaked<PySharedIndex>> {
    42 ) -> PyResult<UnsafePyLeaked<PySharedIndex>> {
    43     let midx = index.extract::<Index>(py)?;
    43     let midx = index.extract::<Index>(py)?;
    44     let leaked = midx.index(py).leak_immutable();
    44     let leaked = midx.index(py).leak_immutable();
       
    45     // Safety: we don't leak the "faked" reference out of the `UnsafePyLeaked`
    45     Ok(unsafe { leaked.map(py, |idx| PySharedIndex { inner: idx }) })
    46     Ok(unsafe { leaked.map(py, |idx| PySharedIndex { inner: idx }) })
    46 }
    47 }
    47 
    48 
    48 impl Clone for PySharedIndex {
    49 impl Clone for PySharedIndex {
    49     fn clone(&self) -> Self {
    50     fn clone(&self) -> Self {
   973     /// the inner index would fail because of `PySharedRef` poisoning
   974     /// the inner index would fail because of `PySharedRef` poisoning
   974     /// (generation-based guard), same as iterating on a `dict` that has
   975     /// (generation-based guard), same as iterating on a `dict` that has
   975     /// been meanwhile mutated.
   976     /// been meanwhile mutated.
   976     def is_invalidated(&self) -> PyResult<bool> {
   977     def is_invalidated(&self) -> PyResult<bool> {
   977         let leaked = self.index(py).borrow();
   978         let leaked = self.index(py).borrow();
       
   979         // Safety: we don't leak the "faked" reference out of `UnsafePyLeaked`
   978         let result = unsafe { leaked.try_borrow(py) };
   980         let result = unsafe { leaked.try_borrow(py) };
   979         // two cases for result to be an error:
   981         // two cases for result to be an error:
   980         // - the index has previously been mutably borrowed
   982         // - the index has previously been mutably borrowed
   981         // - there is currently a mutable borrow
   983         // - there is currently a mutable borrow
   982         // in both cases this amounts for previous results related to
   984         // in both cases this amounts for previous results related to
   984         Ok(result.is_err())
   986         Ok(result.is_err())
   985     }
   987     }
   986 
   988 
   987     def insert(&self, rev: PyRevision) -> PyResult<PyObject> {
   989     def insert(&self, rev: PyRevision) -> PyResult<PyObject> {
   988         let leaked = self.index(py).borrow();
   990         let leaked = self.index(py).borrow();
       
   991         // Safety: we don't leak the "faked" reference out of `UnsafePyLeaked`
   989         let index = &*unsafe { leaked.try_borrow(py)? };
   992         let index = &*unsafe { leaked.try_borrow(py)? };
   990 
   993 
   991         let rev = UncheckedRevision(rev.0);
   994         let rev = UncheckedRevision(rev.0);
   992         let rev = index
   995         let rev = index
   993             .check_revision(rev)
   996             .check_revision(rev)
  1018                         node_prefix.as_object()))
  1021                         node_prefix.as_object()))
  1019             )?;
  1022             )?;
  1020 
  1023 
  1021         let nt = self.nt(py).borrow();
  1024         let nt = self.nt(py).borrow();
  1022         let leaked = self.index(py).borrow();
  1025         let leaked = self.index(py).borrow();
       
  1026         // Safety: we don't leak the "faked" reference out of `UnsafePyLeaked`
  1023         let index = &*unsafe { leaked.try_borrow(py)? };
  1027         let index = &*unsafe { leaked.try_borrow(py)? };
  1024 
  1028 
  1025         Ok(nt.find_bin(index, prefix)
  1029         Ok(nt.find_bin(index, prefix)
  1026                .map_err(|e| nodemap_error(py, e))?
  1030                .map_err(|e| nodemap_error(py, e))?
  1027                .map(|r| r.into())
  1031                .map(|r| r.into())
  1029     }
  1033     }
  1030 
  1034 
  1031     def shortest(&self, node: PyBytes) -> PyResult<usize> {
  1035     def shortest(&self, node: PyBytes) -> PyResult<usize> {
  1032         let nt = self.nt(py).borrow();
  1036         let nt = self.nt(py).borrow();
  1033         let leaked = self.index(py).borrow();
  1037         let leaked = self.index(py).borrow();
       
  1038         // Safety: we don't leak the "faked" reference out of `UnsafePyLeaked`
  1034         let idx = &*unsafe { leaked.try_borrow(py)? };
  1039         let idx = &*unsafe { leaked.try_borrow(py)? };
  1035         match nt.unique_prefix_len_node(idx, &node_from_py_bytes(py, &node)?)
  1040         match nt.unique_prefix_len_node(idx, &node_from_py_bytes(py, &node)?)
  1036         {
  1041         {
  1037             Ok(Some(l)) => Ok(l),
  1042             Ok(Some(l)) => Ok(l),
  1038             Ok(None) => Err(revlog_error(py)),
  1043             Ok(None) => Err(revlog_error(py)),