Mercurial > hg
comparison rust/hg-cpython/src/dirstate/dirs_multiset.rs @ 42849:8db8fa1de2ef
rust-cpython: introduce restricted variant of RefCell
This should catch invalid borrow_mut() calls. Still the ref-sharing
interface is unsafe.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sun, 01 Sep 2019 17:37:30 +0900 |
parents | 2e1f74cc3350 |
children | 8f549c46bc64 |
comparison
equal
deleted
inserted
replaced
42846:01d3ce3281cf | 42849:8db8fa1de2ef |
---|---|
14 use cpython::{ | 14 use cpython::{ |
15 exc, ObjectProtocol, PyBytes, PyClone, PyDict, PyErr, PyObject, PyResult, | 15 exc, ObjectProtocol, PyBytes, PyClone, PyDict, PyErr, PyObject, PyResult, |
16 Python, | 16 Python, |
17 }; | 17 }; |
18 | 18 |
19 use crate::{dirstate::extract_dirstate, ref_sharing::PySharedState}; | 19 use crate::dirstate::extract_dirstate; |
20 use crate::ref_sharing::{PySharedRefCell, PySharedState}; | |
20 use hg::{DirsMultiset, DirstateMapError, DirstateParseError, EntryState}; | 21 use hg::{DirsMultiset, DirstateMapError, DirstateParseError, EntryState}; |
21 | 22 |
22 py_class!(pub class Dirs |py| { | 23 py_class!(pub class Dirs |py| { |
23 data inner: RefCell<DirsMultiset>; | 24 data inner: PySharedRefCell<DirsMultiset>; |
24 data py_shared_state: PySharedState; | 25 data py_shared_state: PySharedState; |
25 | 26 |
26 // `map` is either a `dict` or a flat iterator (usually a `set`, sometimes | 27 // `map` is either a `dict` or a flat iterator (usually a `set`, sometimes |
27 // a `list`) | 28 // a `list`) |
28 def __new__( | 29 def __new__( |
51 DirsMultiset::from_manifest(&map?) | 52 DirsMultiset::from_manifest(&map?) |
52 }; | 53 }; |
53 | 54 |
54 Self::create_instance( | 55 Self::create_instance( |
55 py, | 56 py, |
56 RefCell::new(inner), | 57 PySharedRefCell::new(inner), |
57 PySharedState::default() | 58 PySharedState::default() |
58 ) | 59 ) |
59 } | 60 } |
60 | 61 |
61 def addpath(&self, path: PyObject) -> PyResult<PyObject> { | 62 def addpath(&self, path: PyObject) -> PyResult<PyObject> { |
102 | 103 |
103 py_shared_ref!(Dirs, DirsMultiset, inner, DirsMultisetLeakedRef,); | 104 py_shared_ref!(Dirs, DirsMultiset, inner, DirsMultisetLeakedRef,); |
104 | 105 |
105 impl Dirs { | 106 impl Dirs { |
106 pub fn from_inner(py: Python, d: DirsMultiset) -> PyResult<Self> { | 107 pub fn from_inner(py: Python, d: DirsMultiset) -> PyResult<Self> { |
107 Self::create_instance(py, RefCell::new(d), PySharedState::default()) | 108 Self::create_instance( |
109 py, | |
110 PySharedRefCell::new(d), | |
111 PySharedState::default(), | |
112 ) | |
108 } | 113 } |
109 | 114 |
110 fn translate_key(py: Python, res: &Vec<u8>) -> PyResult<Option<PyBytes>> { | 115 fn translate_key(py: Python, res: &Vec<u8>) -> PyResult<Option<PyBytes>> { |
111 Ok(Some(PyBytes::new(py, res))) | 116 Ok(Some(PyBytes::new(py, res))) |
112 } | 117 } |