Remove ToPythonPointer from public API

This commit is contained in:
Daniel Grunwald 2015-06-27 19:08:28 +02:00
parent e6b5312c81
commit 280cdab7a2
10 changed files with 46 additions and 68 deletions

View file

@ -47,8 +47,8 @@ pub trait ToPyObject<'p> {
#[inline] #[inline]
fn with_borrowed_ptr<F, R>(&self, py: Python<'p>, f: F) -> R fn with_borrowed_ptr<F, R>(&self, py: Python<'p>, f: F) -> R
where F: FnOnce(*mut ffi::PyObject) -> R { where F: FnOnce(*mut ffi::PyObject) -> R {
let obj = self.to_py_object(py); let obj = self.to_py_object(py).into_object();
f(ToPythonPointer::as_ptr(&obj)) f(obj.as_ptr())
} }
// FFI functions that accept a borrowed reference will use: // FFI functions that accept a borrowed reference will use:

View file

@ -48,7 +48,7 @@ macro_rules! py_fn {
match $f(py, &args) { match $f(py, &args) {
Ok(val) => { Ok(val) => {
let obj = $crate::ToPyObject::into_py_object(val, py); let obj = $crate::ToPyObject::into_py_object(val, py);
return $crate::ToPythonPointer::steal_ptr(obj); return $crate::PythonObject::into_object(obj).steal_ptr();
} }
Err(e) => { Err(e) => {
e.restore(); e.restore();

View file

@ -86,7 +86,7 @@ extern crate python3_sys as ffi;
pub use ffi::Py_ssize_t; pub use ffi::Py_ssize_t;
pub use err::{PyErr, PyResult}; pub use err::{PyErr, PyResult};
pub use objects::*; pub use objects::*;
pub use python::{Python, PythonObject, PythonObjectWithCheckedDowncast, PythonObjectWithTypeObject, ToPythonPointer}; pub use python::{Python, PythonObject, PythonObjectWithCheckedDowncast, PythonObjectWithTypeObject};
pub use pythonrun::{GILGuard, GILProtected, prepare_freethreaded_python}; pub use pythonrun::{GILGuard, GILProtected, prepare_freethreaded_python};
pub use conversion::{FromPyObject, ToPyObject}; pub use conversion::{FromPyObject, ToPyObject};
pub use objectprotocol::{ObjectProtocol}; pub use objectprotocol::{ObjectProtocol};
@ -277,7 +277,7 @@ pub unsafe fn py_module_initializer_impl(
} }
}; };
match init(py, &module) { match init(py, &module) {
Ok(()) => module.steal_ptr(), Ok(()) => module.into_object().steal_ptr(),
Err(e) => { Err(e) => {
e.restore(); e.restore();
return ptr::null_mut(); return ptr::null_mut();

View file

@ -44,18 +44,6 @@ macro_rules! pyobject_newtype(
#[derive(Clone)] #[derive(Clone)]
pub struct $name<'p>(::objects::object::PyObject<'p>); pub struct $name<'p>(::objects::object::PyObject<'p>);
impl <'p> ::python::ToPythonPointer for $name<'p> {
#[inline]
fn as_ptr(&self) -> *mut ::ffi::PyObject {
::python::ToPythonPointer::as_ptr(&self.0)
}
#[inline]
fn steal_ptr(self) -> *mut ::ffi::PyObject {
::python::ToPythonPointer::steal_ptr(self.0)
}
}
impl <'p> ::python::PythonObject<'p> for $name<'p> { impl <'p> ::python::PythonObject<'p> for $name<'p> {
#[inline] #[inline]
fn as_object(&self) -> &::objects::object::PyObject<'p> { fn as_object(&self) -> &::objects::object::PyObject<'p> {

View file

@ -98,21 +98,6 @@ impl <'p> PythonObjectWithTypeObject<'p> for PyObject<'p> {
} }
} }
impl <'p> ToPythonPointer for PyObject<'p> {
#[inline]
fn as_ptr(&self) -> *mut ffi::PyObject {
self.ptr
}
#[inline]
fn steal_ptr(self) -> *mut ffi::PyObject {
let ptr = self.ptr;
mem::forget(self);
ptr
}
}
impl <'p> PyObject<'p> { impl <'p> PyObject<'p> {
/// Creates a PyObject instance for the given FFI pointer. /// Creates a PyObject instance for the given FFI pointer.
/// This moves ownership over the pointer into the PyObject. /// This moves ownership over the pointer into the PyObject.
@ -154,7 +139,24 @@ impl <'p> PyObject<'p> {
Some(PyObject::from_borrowed_ptr(py, ptr)) Some(PyObject::from_borrowed_ptr(py, ptr))
} }
} }
/// Gets the underlying FFI pointer.
/// Returns a borrowed pointer.
#[inline]
pub fn as_ptr(&self) -> *mut ffi::PyObject {
self.ptr
}
/// Gets the underlying FFI pointer.
/// Consumes `self` without calling `Py_DECREF()`, thus returning an owned pointer.
#[inline]
#[must_use]
pub fn steal_ptr(self) -> *mut ffi::PyObject {
let ptr = self.ptr;
mem::forget(self);
ptr
}
/// Transmutes an owned FFI pointer to `&PyObject`. /// Transmutes an owned FFI pointer to `&PyObject`.
/// Undefined behavior if the pointer is NULL or invalid. /// Undefined behavior if the pointer is NULL or invalid.
#[inline] #[inline]
@ -238,6 +240,19 @@ impl <'p> PartialEq for PyObject<'p> {
/// `obj1 == obj2` in rust is equivalent to `obj1 is obj2` in python. /// `obj1 == obj2` in rust is equivalent to `obj1 is obj2` in python.
impl <'p> Eq for PyObject<'p> { } impl <'p> Eq for PyObject<'p> { }
impl <'p> ToPythonPointer for PyObject<'p> {
// forward to inherit methods
#[inline]
fn as_ptr(&self) -> *mut ffi::PyObject {
PyObject::as_ptr(self)
}
#[inline]
fn steal_ptr(self) -> *mut ffi::PyObject {
PyObject::steal_ptr(self)
}
}
#[test] #[test]
fn test_sizeof() { fn test_sizeof() {

View file

@ -30,7 +30,7 @@ impl <'p> PyType<'p> {
/// Retrieves the underlying FFI pointer associated with this python object. /// Retrieves the underlying FFI pointer associated with this python object.
#[inline] #[inline]
pub fn as_type_ptr(&self) -> *mut ffi::PyTypeObject { pub fn as_type_ptr(&self) -> *mut ffi::PyTypeObject {
self.as_ptr() as *mut ffi::PyTypeObject self.0.as_ptr() as *mut ffi::PyTypeObject
} }
/// Retrieves the PyType instance for the given FFI pointer. /// Retrieves the PyType instance for the given FFI pointer.
@ -59,7 +59,7 @@ impl <'p> PyType<'p> {
where A: ToPyObject<'p, ObjectType=PyTuple<'p>> { where A: ToPyObject<'p, ObjectType=PyTuple<'p>> {
let py = self.python(); let py = self.python();
args.with_borrowed_ptr(py, |args| unsafe { args.with_borrowed_ptr(py, |args| unsafe {
result_from_owned_ptr(py, ffi::PyObject_Call(self.as_ptr(), args, kwargs.as_ptr())) result_from_owned_ptr(py, ffi::PyObject_Call(self.0.as_ptr(), args, kwargs.as_ptr()))
}) })
} }
} }

View file

@ -50,10 +50,10 @@ pub trait ToPythonPointer {
} }
/// Trait implemented by all python object types. /// Trait implemented by all python object types.
pub trait PythonObject<'p> : 'p + Clone + ToPythonPointer { pub trait PythonObject<'p> : 'p + Clone {
/// Casts the python object to PyObject. /// Casts the python object to PyObject.
fn as_object(&self) -> &PyObject<'p>; fn as_object(&self) -> &PyObject<'p>;
/// Casts the python object to PyObject. /// Casts the python object to PyObject.
fn into_object(self) -> PyObject<'p>; fn into_object(self) -> PyObject<'p>;
@ -94,16 +94,15 @@ pub trait PythonObjectWithTypeObject<'p> : PythonObjectWithCheckedDowncast<'p> {
impl <'a, 'p, T> ToPythonPointer for &'a T where T: PythonObject<'p> { impl <'a, 'p, T> ToPythonPointer for &'a T where T: PythonObject<'p> {
#[inline] #[inline]
fn as_ptr(&self) -> *mut ffi::PyObject { fn as_ptr(&self) -> *mut ffi::PyObject {
(**self).as_ptr() self.as_object().as_ptr()
} }
#[inline] #[inline]
fn steal_ptr(self) -> *mut ffi::PyObject { fn steal_ptr(self) -> *mut ffi::PyObject {
(*self).clone().steal_ptr() self.as_object().clone().steal_ptr()
} }
} }
/// Convert None into a null pointer. /// Convert None into a null pointer.
impl <T> ToPythonPointer for Option<T> where T: ToPythonPointer { impl <T> ToPythonPointer for Option<T> where T: ToPythonPointer {
#[inline] #[inline]

View file

@ -78,7 +78,7 @@ macro_rules! py_method {
match $f(&slf, &args) { match $f(&slf, &args) {
Ok(val) => { Ok(val) => {
let obj = $crate::ToPyObject::into_py_object(val, py); let obj = $crate::ToPyObject::into_py_object(val, py);
return $crate::ToPythonPointer::steal_ptr(obj); return $crate::PythonObject::into_object(obj).steal_ptr();
} }
Err(e) => { Err(e) => {
e.restore(); e.restore();
@ -167,7 +167,7 @@ macro_rules! py_class_method {
match $f(&slf, &args) { match $f(&slf, &args) {
Ok(val) => { Ok(val) => {
let obj = $crate::ToPyObject::into_py_object(val, py); let obj = $crate::ToPyObject::into_py_object(val, py);
return $crate::ToPythonPointer::steal_ptr(obj); return $crate::PythonObject::into_object(obj).steal_ptr();
} }
Err(e) => { Err(e) => {
e.restore(); e.restore();

View file

@ -121,7 +121,7 @@ impl <'p, T, B> PythonBaseObject<'p> for PyRustObject<'p, T, B> where T: 'static
unsafe fn alloc(ty: &PyType<'p>, (val, base_val): Self::InitType) -> PyResult<'p, Self> { unsafe fn alloc(ty: &PyType<'p>, (val, base_val): Self::InitType) -> PyResult<'p, Self> {
let obj = try!(B::alloc(ty, base_val)); let obj = try!(B::alloc(ty, base_val));
let offset = PyRustObject::<T, B>::offset() as isize; let offset = PyRustObject::<T, B>::offset() as isize;
ptr::write((obj.as_ptr() as *mut u8).offset(offset) as *mut T, val); ptr::write((obj.as_object().as_ptr() as *mut u8).offset(offset) as *mut T, val);
Ok(Self::unchecked_downcast_from(obj.into_object())) Ok(Self::unchecked_downcast_from(obj.into_object()))
} }
@ -142,18 +142,6 @@ impl <'p, T, B> Clone for PyRustObject<'p, T, B> where T: 'static + Send, B: Pyt
} }
} }
impl <'p, T, B> ToPythonPointer for PyRustObject<'p, T, B> where T: 'static + Send, B: PythonBaseObject<'p> {
#[inline]
fn as_ptr(&self) -> *mut ffi::PyObject {
self.obj.as_ptr()
}
#[inline]
fn steal_ptr(self) -> *mut ffi::PyObject {
self.obj.steal_ptr()
}
}
impl <'p, 's, T, B> ToPyObject<'p> for PyRustObject<'s, T, B> where T: 'static + Send, B: PythonBaseObject<'s> { impl <'p, 's, T, B> ToPyObject<'p> for PyRustObject<'s, T, B> where T: 'static + Send, B: PythonBaseObject<'s> {
type ObjectType = PyObject<'p>; type ObjectType = PyObject<'p>;
@ -231,18 +219,6 @@ impl <'p, T, B> ops::Deref for PyRustType<'p, T, B> where T: 'p + Send, B: Pytho
} }
} }
impl <'p, T> ToPythonPointer for PyRustType<'p, T> where T: 'p + Send {
#[inline]
fn as_ptr(&self) -> *mut ffi::PyObject {
self.type_obj.as_ptr()
}
#[inline]
fn steal_ptr(self) -> *mut ffi::PyObject {
self.type_obj.steal_ptr()
}
}
impl <'p, T> Clone for PyRustType<'p, T> where T: 'p + Send { impl <'p, T> Clone for PyRustType<'p, T> where T: 'p + Send {
#[inline] #[inline]
fn clone(&self) -> Self { fn clone(&self) -> Self {

View file

@ -92,7 +92,7 @@ impl <'p, T> PyRustTypeBuilder<'p, T> where T: 'static + Send {
unsafe { unsafe {
ffi::Py_XDECREF((*self.ht).ht_type.tp_base as *mut ffi::PyObject); ffi::Py_XDECREF((*self.ht).ht_type.tp_base as *mut ffi::PyObject);
(*self.ht).ht_type.tp_base = base_type.as_type_ptr(); (*self.ht).ht_type.tp_base = base_type.as_type_ptr();
ffi::Py_INCREF(base_type.as_ptr()); ffi::Py_INCREF(base_type.as_object().as_ptr());
} }
PyRustTypeBuilder { PyRustTypeBuilder {
type_obj: self.type_obj, type_obj: self.type_obj,