Do not store return values in locals so that holders benefit from lifetime extension for temporaries.
This commit is contained in:
parent
0773651407
commit
a60945faa2
|
@ -0,0 +1 @@
|
|||
Extend lifetime of holder variables to avoid "temporary value dropped while borrowed" errors when `#[pyfunction]`s take references into `#[pyclass]`es
|
|
@ -425,9 +425,8 @@ impl<'a> FnSpec<'a> {
|
|||
|
||||
let rust_call = |args: Vec<TokenStream>| {
|
||||
quote! {
|
||||
let mut ret = function(#self_arg #(#args),*);
|
||||
let owned = _pyo3::impl_::pymethods::OkWrap::wrap(ret, #py);
|
||||
owned.map(|obj| _pyo3::conversion::IntoPyPointer::into_ptr(obj))
|
||||
_pyo3::impl_::pymethods::OkWrap::wrap(function(#self_arg #(#args),*), #py)
|
||||
.map(|obj| _pyo3::conversion::IntoPyPointer::into_ptr(obj))
|
||||
.map_err(::core::convert::Into::into)
|
||||
}
|
||||
};
|
||||
|
|
|
@ -456,9 +456,8 @@ fn impl_py_class_attribute(cls: &syn::Type, spec: &FnSpec<'_>) -> syn::Result<Me
|
|||
fn #wrapper_ident(py: _pyo3::Python<'_>) -> _pyo3::PyResult<_pyo3::PyObject> {
|
||||
let function = #cls::#name; // Shadow the method name to avoid #3017
|
||||
#deprecations
|
||||
let mut ret = #fncall;
|
||||
let owned = _pyo3::impl_::pymethods::OkWrap::wrap(ret, py);
|
||||
owned.map_err(::core::convert::Into::into)
|
||||
_pyo3::impl_::pymethods::OkWrap::wrap(#fncall, py)
|
||||
.map_err(::core::convert::Into::into)
|
||||
}
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue