comparison rust/hg-cpython/src/ref_sharing.rs @ 44188:1f9e6fbdd3e6

rust-cpython: remove useless wrappers from PyLeaked, just move by map() This series prepares for migrating to the upstreamed version of PySharedRef. I found this last batch wasn't queued while rewriting the callers. While Option<T> was historically needed, it shouldn't be required anymore. I wasn't aware that each filed can be just moved.
author Yuya Nishihara <yuya@tcha.org>
date Tue, 22 Oct 2019 11:38:43 +0900
parents 8418b77132c1
children 4a4c3b9fd91b
comparison
equal deleted inserted replaced
44187:be52b7372ec2 44188:1f9e6fbdd3e6
281 /// 281 ///
282 /// This reference will be invalidated once the original value is mutably 282 /// This reference will be invalidated once the original value is mutably
283 /// borrowed. 283 /// borrowed.
284 pub struct PyLeaked<T> { 284 pub struct PyLeaked<T> {
285 inner: PyObject, 285 inner: PyObject,
286 data: Option<T>, 286 data: T,
287 py_shared_state: &'static PySharedState, 287 py_shared_state: &'static PySharedState,
288 /// Generation counter of data `T` captured when PyLeaked is created. 288 /// Generation counter of data `T` captured when PyLeaked is created.
289 generation: usize, 289 generation: usize,
290 } 290 }
291 291
303 data: T, 303 data: T,
304 py_shared_state: &'static PySharedState, 304 py_shared_state: &'static PySharedState,
305 ) -> Self { 305 ) -> Self {
306 Self { 306 Self {
307 inner: inner.clone_ref(py), 307 inner: inner.clone_ref(py),
308 data: Some(data), 308 data: data,
309 py_shared_state, 309 py_shared_state,
310 generation: py_shared_state.current_generation(py), 310 generation: py_shared_state.current_generation(py),
311 } 311 }
312 } 312 }
313 313
319 py: Python<'a>, 319 py: Python<'a>,
320 ) -> PyResult<PyLeakedRef<'a, T>> { 320 ) -> PyResult<PyLeakedRef<'a, T>> {
321 self.validate_generation(py)?; 321 self.validate_generation(py)?;
322 Ok(PyLeakedRef { 322 Ok(PyLeakedRef {
323 _borrow: BorrowPyShared::new(py, self.py_shared_state), 323 _borrow: BorrowPyShared::new(py, self.py_shared_state),
324 data: self.data.as_ref().unwrap(), 324 data: &self.data,
325 }) 325 })
326 } 326 }
327 327
328 /// Mutably borrows the wrapped value. 328 /// Mutably borrows the wrapped value.
329 /// 329 ///
336 py: Python<'a>, 336 py: Python<'a>,
337 ) -> PyResult<PyLeakedRefMut<'a, T>> { 337 ) -> PyResult<PyLeakedRefMut<'a, T>> {
338 self.validate_generation(py)?; 338 self.validate_generation(py)?;
339 Ok(PyLeakedRefMut { 339 Ok(PyLeakedRefMut {
340 _borrow: BorrowPyShared::new(py, self.py_shared_state), 340 _borrow: BorrowPyShared::new(py, self.py_shared_state),
341 data: self.data.as_mut().unwrap(), 341 data: &mut self.data,
342 }) 342 })
343 } 343 }
344 344
345 /// Converts the inner value by the given function. 345 /// Converts the inner value by the given function.
346 /// 346 ///
359 /// The lifetime of the object passed in to the function `f` is cheated. 359 /// The lifetime of the object passed in to the function `f` is cheated.
360 /// It's typically a static reference, but is valid only while the 360 /// It's typically a static reference, but is valid only while the
361 /// corresponding `PyLeaked` is alive. Do not copy it out of the 361 /// corresponding `PyLeaked` is alive. Do not copy it out of the
362 /// function call. 362 /// function call.
363 pub unsafe fn map<U>( 363 pub unsafe fn map<U>(
364 mut self, 364 self,
365 py: Python, 365 py: Python,
366 f: impl FnOnce(T) -> U, 366 f: impl FnOnce(T) -> U,
367 ) -> PyLeaked<U> { 367 ) -> PyLeaked<U> {
368 // Needs to test the generation value to make sure self.data reference 368 // Needs to test the generation value to make sure self.data reference
369 // is still intact. 369 // is still intact.
372 372
373 // f() could make the self.data outlive. That's why map() is unsafe. 373 // f() could make the self.data outlive. That's why map() is unsafe.
374 // In order to make this function safe, maybe we'll need a way to 374 // In order to make this function safe, maybe we'll need a way to
375 // temporarily restrict the lifetime of self.data and translate the 375 // temporarily restrict the lifetime of self.data and translate the
376 // returned object back to Something<'static>. 376 // returned object back to Something<'static>.
377 let new_data = f(self.data.take().unwrap()); 377 let new_data = f(self.data);
378 PyLeaked { 378 PyLeaked {
379 inner: self.inner.clone_ref(py), 379 inner: self.inner,
380 data: Some(new_data), 380 data: new_data,
381 py_shared_state: self.py_shared_state, 381 py_shared_state: self.py_shared_state,
382 generation: self.generation, 382 generation: self.generation,
383 } 383 }
384 } 384 }
385 385