Merge branch 'master' of https://github.com/PyO3/pyo3
This commit is contained in:
commit
68c14a5707
10
README.md
10
README.md
|
@ -100,9 +100,15 @@ fn sum_as_string(a:i64, b:i64) -> String {
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
**To build**: `cargo rustc --release`
|
On windows and linux, you can build normally with `cargo build --release`. On Mac Os, you need to set additional linker arguments. One option is to compile with `cargo rustc --release -- -C link-arg=-undefined -C link-arg=dynamic_lookup`, the other is to create a `.cargo/config` with the following content:
|
||||||
|
|
||||||
**On a Mac**: `cargo rustc --release -- -C link-arg=-undefined -C link-arg=dynamic_lookup`
|
```toml
|
||||||
|
[target.x86_64-apple-darwin]
|
||||||
|
rustflags = [
|
||||||
|
"-C", "link-arg=-undefined",
|
||||||
|
"-C", "link-arg=dynamic_lookup",
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
Also on macOS, you will need to rename the output from \*.dylib to \*.so. On Windows, you will need to rename the output from \*.dll to \*.pyd.
|
Also on macOS, you will need to rename the output from \*.dylib to \*.so. On Windows, you will need to rename the output from \*.dll to \*.pyd.
|
||||||
|
|
||||||
|
|
|
@ -204,7 +204,7 @@ macro_rules! wrap_function (
|
||||||
};
|
};
|
||||||
);
|
);
|
||||||
|
|
||||||
mod python;
|
pub mod python;
|
||||||
mod err;
|
mod err;
|
||||||
mod conversion;
|
mod conversion;
|
||||||
mod instance;
|
mod instance;
|
||||||
|
|
|
@ -7,7 +7,7 @@ use conversion::{ToPyObject, IntoPyObject, ToBorrowedObject, PyTryFrom};
|
||||||
/// Represents a Python `bool`.
|
/// Represents a Python `bool`.
|
||||||
pub struct PyBool(PyObject);
|
pub struct PyBool(PyObject);
|
||||||
|
|
||||||
pyobject_native_type!(PyBool, PyBool_Type, PyBool_Check);
|
pyobject_native_type!(PyBool, ffi::PyBool_Type, ffi::PyBool_Check);
|
||||||
|
|
||||||
|
|
||||||
impl PyBool {
|
impl PyBool {
|
||||||
|
|
|
@ -11,7 +11,7 @@ use err::{PyResult, PyErr};
|
||||||
/// Represents a Python `bytearray`.
|
/// Represents a Python `bytearray`.
|
||||||
pub struct PyByteArray(PyObject);
|
pub struct PyByteArray(PyObject);
|
||||||
|
|
||||||
pyobject_native_type!(PyByteArray, PyByteArray_Type, PyByteArray_Check);
|
pyobject_native_type!(PyByteArray, ffi::PyByteArray_Type, ffi::PyByteArray_Check);
|
||||||
|
|
||||||
impl PyByteArray {
|
impl PyByteArray {
|
||||||
/// Creates a new Python bytearray object.
|
/// Creates a new Python bytearray object.
|
||||||
|
|
|
@ -14,7 +14,7 @@ use err::{self, PyResult, PyErr};
|
||||||
/// Represents a Python `dict`.
|
/// Represents a Python `dict`.
|
||||||
pub struct PyDict(PyObject);
|
pub struct PyDict(PyObject);
|
||||||
|
|
||||||
pyobject_native_type!(PyDict, PyDict_Type, PyDict_Check);
|
pyobject_native_type!(PyDict, ffi::PyDict_Type, ffi::PyDict_Check);
|
||||||
|
|
||||||
|
|
||||||
impl PyDict {
|
impl PyDict {
|
||||||
|
|
|
@ -20,7 +20,7 @@ use objectprotocol::ObjectProtocol;
|
||||||
/// with `f32`/`f64`.
|
/// with `f32`/`f64`.
|
||||||
pub struct PyFloat(PyObject);
|
pub struct PyFloat(PyObject);
|
||||||
|
|
||||||
pyobject_native_type!(PyFloat, PyFloat_Type, PyFloat_Check);
|
pyobject_native_type!(PyFloat, ffi::PyFloat_Type, ffi::PyFloat_Check);
|
||||||
|
|
||||||
|
|
||||||
impl PyFloat {
|
impl PyFloat {
|
||||||
|
|
|
@ -15,7 +15,7 @@ use conversion::{ToPyObject, IntoPyObject, ToBorrowedObject};
|
||||||
/// Represents a Python `list`.
|
/// Represents a Python `list`.
|
||||||
pub struct PyList(PyObject);
|
pub struct PyList(PyObject);
|
||||||
|
|
||||||
pyobject_native_type!(PyList, PyList_Type, PyList_Check);
|
pyobject_native_type!(PyList, ffi::PyList_Type, ffi::PyList_Check);
|
||||||
|
|
||||||
impl PyList {
|
impl PyList {
|
||||||
/// Construct a new list with the given elements.
|
/// Construct a new list with the given elements.
|
||||||
|
|
|
@ -35,7 +35,7 @@ pub use self::num2::{PyInt, PyLong};
|
||||||
/// parameter
|
/// parameter
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! pyobject_downcast(
|
macro_rules! pyobject_downcast(
|
||||||
($name: ident, $checkfunction: ident) => (
|
($name: ident, $checkfunction: path) => (
|
||||||
impl<'a> $crate::FromPyObject<'a> for &'a $name
|
impl<'a> $crate::FromPyObject<'a> for &'a $name
|
||||||
{
|
{
|
||||||
/// Extracts `Self` from the source `PyObject`.
|
/// Extracts `Self` from the source `PyObject`.
|
||||||
|
@ -43,7 +43,7 @@ macro_rules! pyobject_downcast(
|
||||||
fn extract(ob: &'a $crate::PyObjectRef) -> $crate::PyResult<Self>
|
fn extract(ob: &'a $crate::PyObjectRef) -> $crate::PyResult<Self>
|
||||||
{
|
{
|
||||||
unsafe {
|
unsafe {
|
||||||
if $crate::ffi::$checkfunction(ob.as_ptr()) != 0 {
|
if $checkfunction(ob.as_ptr()) != 0 {
|
||||||
Ok(&*(ob as *const $crate::objects::PyObjectRef as *const $name))
|
Ok(&*(ob as *const $crate::objects::PyObjectRef as *const $name))
|
||||||
} else {
|
} else {
|
||||||
Err($crate::PyDowncastError.into())
|
Err($crate::PyDowncastError.into())
|
||||||
|
@ -59,7 +59,7 @@ macro_rules! pyobject_native_type_named(
|
||||||
($name: ident) => {
|
($name: ident) => {
|
||||||
impl $crate::PyNativeType for $name {}
|
impl $crate::PyNativeType for $name {}
|
||||||
|
|
||||||
impl $crate::std::convert::AsRef<$crate::PyObjectRef> for $name {
|
impl ::std::convert::AsRef<$crate::PyObjectRef> for $name {
|
||||||
#[cfg_attr(feature = "cargo-clippy", allow(useless_transmute))]
|
#[cfg_attr(feature = "cargo-clippy", allow(useless_transmute))]
|
||||||
fn as_ref(&self) -> &$crate::PyObjectRef {
|
fn as_ref(&self) -> &$crate::PyObjectRef {
|
||||||
unsafe{&*(self as *const $name as *const $crate::objects::PyObjectRef)}
|
unsafe{&*(self as *const $name as *const $crate::objects::PyObjectRef)}
|
||||||
|
@ -92,12 +92,12 @@ macro_rules! pyobject_native_type_named(
|
||||||
|
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! pyobject_native_type(
|
macro_rules! pyobject_native_type(
|
||||||
($name: ident, $typeobject: ident, $checkfunction: ident) => {
|
($name: ident, $typeobject: expr, $checkfunction: path) => {
|
||||||
pyobject_native_type_named!($name);
|
pyobject_native_type_named!($name);
|
||||||
pyobject_native_type_convert!($name, $typeobject, $checkfunction);
|
pyobject_native_type_convert!($name, $typeobject, $checkfunction);
|
||||||
pyobject_downcast!($name, $checkfunction);
|
pyobject_downcast!($name, $checkfunction);
|
||||||
|
|
||||||
impl<'a> $crate::std::convert::From<&'a $name> for &'a $crate::PyObjectRef {
|
impl<'a> ::std::convert::From<&'a $name> for &'a $crate::PyObjectRef {
|
||||||
fn from(ob: &'a $name) -> Self {
|
fn from(ob: &'a $name) -> Self {
|
||||||
unsafe{&*(ob as *const $name as *const $crate::objects::PyObjectRef)}
|
unsafe{&*(ob as *const $name as *const $crate::objects::PyObjectRef)}
|
||||||
}
|
}
|
||||||
|
@ -107,24 +107,24 @@ macro_rules! pyobject_native_type(
|
||||||
|
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! pyobject_native_type_convert(
|
macro_rules! pyobject_native_type_convert(
|
||||||
($name: ident, $typeobject: ident, $checkfunction: ident) => {
|
($name: ident, $typeobject: expr, $checkfunction: path) => {
|
||||||
impl $crate::typeob::PyTypeInfo for $name {
|
impl $crate::typeob::PyTypeInfo for $name {
|
||||||
type Type = ();
|
type Type = ();
|
||||||
type BaseType = $crate::PyObjectRef;
|
type BaseType = $crate::PyObjectRef;
|
||||||
|
|
||||||
const NAME: &'static str = stringify!($name);
|
const NAME: &'static str = stringify!($name);
|
||||||
const SIZE: usize = $crate::std::mem::size_of::<$crate::ffi::PyObject>();
|
const SIZE: usize = ::std::mem::size_of::<$crate::ffi::PyObject>();
|
||||||
const OFFSET: isize = 0;
|
const OFFSET: isize = 0;
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
unsafe fn type_object() -> &'static mut $crate::ffi::PyTypeObject {
|
unsafe fn type_object() -> &'static mut $crate::ffi::PyTypeObject {
|
||||||
&mut $crate::ffi::$typeobject
|
&mut $typeobject
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(feature = "cargo-clippy", allow(not_unsafe_ptr_arg_deref))]
|
#[cfg_attr(feature = "cargo-clippy", allow(not_unsafe_ptr_arg_deref))]
|
||||||
fn is_instance(ptr: *mut $crate::ffi::PyObject) -> bool {
|
fn is_instance(ptr: *mut $crate::ffi::PyObject) -> bool {
|
||||||
#[allow(unused_unsafe)]
|
#[allow(unused_unsafe)]
|
||||||
unsafe { $crate::ffi::$checkfunction(ptr) > 0 }
|
unsafe { $checkfunction(ptr) > 0 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -156,22 +156,22 @@ macro_rules! pyobject_native_type_convert(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl $crate::std::fmt::Debug for $name {
|
impl ::std::fmt::Debug for $name {
|
||||||
fn fmt(&self, f: &mut $crate::std::fmt::Formatter)
|
fn fmt(&self, f: &mut ::std::fmt::Formatter)
|
||||||
-> Result<(), $crate::std::fmt::Error>
|
-> Result<(), ::std::fmt::Error>
|
||||||
{
|
{
|
||||||
use $crate::ObjectProtocol;
|
use $crate::ObjectProtocol;
|
||||||
let s = try!(self.repr().map_err(|_| $crate::std::fmt::Error));
|
let s = try!(self.repr().map_err(|_| ::std::fmt::Error));
|
||||||
f.write_str(&s.to_string_lossy())
|
f.write_str(&s.to_string_lossy())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl $crate::std::fmt::Display for $name {
|
impl ::std::fmt::Display for $name {
|
||||||
fn fmt(&self, f: &mut $crate::std::fmt::Formatter)
|
fn fmt(&self, f: &mut ::std::fmt::Formatter)
|
||||||
-> Result<(), $crate::std::fmt::Error>
|
-> Result<(), ::std::fmt::Error>
|
||||||
{
|
{
|
||||||
use $crate::ObjectProtocol;
|
use $crate::ObjectProtocol;
|
||||||
let s = try!(self.str().map_err(|_| $crate::std::fmt::Error));
|
let s = try!(self.str().map_err(|_| ::std::fmt::Error));
|
||||||
f.write_str(&s.to_string_lossy())
|
f.write_str(&s.to_string_lossy())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -193,7 +193,7 @@ macro_rules! pyobject_extract(
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "try_from")]
|
#[cfg(feature = "try_from")]
|
||||||
impl<'source> $crate::std::convert::TryFrom<&'source $crate::PyObjectRef> for $t
|
impl<'source> ::std::convert::TryFrom<&'source $crate::PyObjectRef> for $t
|
||||||
{
|
{
|
||||||
type Error = $crate::PyErr;
|
type Error = $crate::PyErr;
|
||||||
|
|
||||||
|
@ -207,12 +207,12 @@ macro_rules! pyobject_extract(
|
||||||
|
|
||||||
|
|
||||||
use python::ToPyPointer;
|
use python::ToPyPointer;
|
||||||
|
use ffi;
|
||||||
/// Represents general python instance.
|
/// Represents general python instance.
|
||||||
pub struct PyObjectRef(::PyObject);
|
pub struct PyObjectRef(::PyObject);
|
||||||
pyobject_native_type_named!(PyObjectRef);
|
pyobject_native_type_named!(PyObjectRef);
|
||||||
pyobject_native_type_convert!(PyObjectRef, PyBaseObject_Type, PyObject_Check);
|
pyobject_native_type_convert!(PyObjectRef, ffi::PyBaseObject_Type, ffi::PyObject_Check);
|
||||||
pyobject_downcast!(PyObjectRef, PyObject_Check);
|
pyobject_downcast!(PyObjectRef, ffi::PyObject_Check);
|
||||||
|
|
||||||
mod typeobject;
|
mod typeobject;
|
||||||
mod module;
|
mod module;
|
||||||
|
|
|
@ -19,7 +19,7 @@ use err::{PyResult, PyErr};
|
||||||
/// Represents a Python `module` object.
|
/// Represents a Python `module` object.
|
||||||
pub struct PyModule(PyObject);
|
pub struct PyModule(PyObject);
|
||||||
|
|
||||||
pyobject_native_type!(PyModule, PyModule_Type, PyModule_Check);
|
pyobject_native_type!(PyModule, ffi::PyModule_Type, ffi::PyModule_Check);
|
||||||
|
|
||||||
|
|
||||||
impl PyModule {
|
impl PyModule {
|
||||||
|
|
|
@ -26,7 +26,7 @@ use super::num_common::{err_if_invalid_value, IS_LITTLE_ENDIAN};
|
||||||
/// with the primitive Rust integer types.
|
/// with the primitive Rust integer types.
|
||||||
pub struct PyInt(PyObject);
|
pub struct PyInt(PyObject);
|
||||||
|
|
||||||
pyobject_native_type!(PyInt, PyInt_Type, PyInt_Check);
|
pyobject_native_type!(PyInt, ffi::PyInt_Type, ffi::PyInt_Check);
|
||||||
|
|
||||||
/// In Python 2.x, represents a Python `long` object.
|
/// In Python 2.x, represents a Python `long` object.
|
||||||
/// Both `PyInt` and `PyLong` refer to the same type on Python 3.x.
|
/// Both `PyInt` and `PyLong` refer to the same type on Python 3.x.
|
||||||
|
@ -37,7 +37,7 @@ pyobject_native_type!(PyInt, PyInt_Type, PyInt_Check);
|
||||||
/// with the primitive Rust integer types.
|
/// with the primitive Rust integer types.
|
||||||
pub struct PyLong(PyObject);
|
pub struct PyLong(PyObject);
|
||||||
|
|
||||||
pyobject_native_type!(PyLong, PyLong_Type, PyLong_Check);
|
pyobject_native_type!(PyLong, ffi::PyLong_Type, ffi::PyLong_Check);
|
||||||
|
|
||||||
impl PyInt {
|
impl PyInt {
|
||||||
/// Creates a new Python 2.7 `int` object.
|
/// Creates a new Python 2.7 `int` object.
|
||||||
|
|
|
@ -23,7 +23,7 @@ use super::num_common::{err_if_invalid_value, IS_LITTLE_ENDIAN};
|
||||||
/// with the primitive Rust integer types.
|
/// with the primitive Rust integer types.
|
||||||
pub struct PyLong(PyObject);
|
pub struct PyLong(PyObject);
|
||||||
|
|
||||||
pyobject_native_type!(PyLong, PyLong_Type, PyLong_Check);
|
pyobject_native_type!(PyLong, ffi::PyLong_Type, ffi::PyLong_Check);
|
||||||
|
|
||||||
macro_rules! int_fits_c_long(
|
macro_rules! int_fits_c_long(
|
||||||
($rust_type:ty) => (
|
($rust_type:ty) => (
|
||||||
|
|
|
@ -16,7 +16,7 @@ use objectprotocol::ObjectProtocol;
|
||||||
/// Represents a reference to a python object supporting the sequence protocol.
|
/// Represents a reference to a python object supporting the sequence protocol.
|
||||||
pub struct PySequence(PyObject);
|
pub struct PySequence(PyObject);
|
||||||
pyobject_native_type_named!(PySequence);
|
pyobject_native_type_named!(PySequence);
|
||||||
pyobject_downcast!(PySequence, PySequence_Check);
|
pyobject_downcast!(PySequence, ffi::PySequence_Check);
|
||||||
|
|
||||||
|
|
||||||
#[cfg_attr(feature = "cargo-clippy", allow(len_without_is_empty))]
|
#[cfg_attr(feature = "cargo-clippy", allow(len_without_is_empty))]
|
||||||
|
|
|
@ -17,7 +17,8 @@ pub struct PySet(PyObject);
|
||||||
pub struct PyFrozenSet(PyObject);
|
pub struct PyFrozenSet(PyObject);
|
||||||
|
|
||||||
|
|
||||||
pyobject_native_type!(PySet, PySet_Type, PySet_Check);pyobject_native_type!(PyFrozenSet, PyFrozenSet_Type, PyFrozenSet_Check);
|
pyobject_native_type!(PySet, ffi::PySet_Type, ffi::PySet_Check);
|
||||||
|
pyobject_native_type!(PyFrozenSet, ffi::PyFrozenSet_Type, ffi::PyFrozenSet_Check);
|
||||||
|
|
||||||
impl PySet {
|
impl PySet {
|
||||||
/// Creates a new set.
|
/// Creates a new set.
|
||||||
|
|
|
@ -14,7 +14,7 @@ use conversion::ToPyObject;
|
||||||
/// Only `c_long` indeces supprted at the moment by `PySlice` object.
|
/// Only `c_long` indeces supprted at the moment by `PySlice` object.
|
||||||
pub struct PySlice(PyObject);
|
pub struct PySlice(PyObject);
|
||||||
|
|
||||||
pyobject_native_type!(PySlice, PySlice_Type, PySlice_Check);
|
pyobject_native_type!(PySlice, ffi::PySlice_Type, ffi::PySlice_Check);
|
||||||
|
|
||||||
|
|
||||||
/// Represents a Python `slice` indices
|
/// Represents a Python `slice` indices
|
||||||
|
|
|
@ -16,7 +16,7 @@ use super::PyStringData;
|
||||||
/// Represents a Python `string`.
|
/// Represents a Python `string`.
|
||||||
pub struct PyString(PyObject);
|
pub struct PyString(PyObject);
|
||||||
|
|
||||||
pyobject_native_type!(PyString, PyUnicode_Type, PyUnicode_Check);
|
pyobject_native_type!(PyString, ffi::PyUnicode_Type, ffi::PyUnicode_Check);
|
||||||
|
|
||||||
/// Represents a Python `unicode string`.
|
/// Represents a Python `unicode string`.
|
||||||
/// Corresponds to `unicode` in Python 2, and `str` in Python 3.
|
/// Corresponds to `unicode` in Python 2, and `str` in Python 3.
|
||||||
|
@ -25,7 +25,7 @@ pub use PyString as PyUnicode;
|
||||||
/// Represents a Python `byte` string.
|
/// Represents a Python `byte` string.
|
||||||
pub struct PyBytes(PyObject);
|
pub struct PyBytes(PyObject);
|
||||||
|
|
||||||
pyobject_native_type!(PyBytes, PyBytes_Type, PyBytes_Check);
|
pyobject_native_type!(PyBytes, ffi::PyBytes_Type, ffi::PyBytes_Check);
|
||||||
|
|
||||||
|
|
||||||
impl PyString {
|
impl PyString {
|
||||||
|
|
|
@ -18,17 +18,17 @@ use super::{PyObjectRef, PyStringData};
|
||||||
/// Represents a Python `string`.
|
/// Represents a Python `string`.
|
||||||
pub struct PyString(PyObject);
|
pub struct PyString(PyObject);
|
||||||
|
|
||||||
pyobject_native_type!(PyString, PyBaseString_Type, PyBaseString_Check);
|
pyobject_native_type!(PyString, ffi::PyBaseString_Type, ffi::PyBaseString_Check);
|
||||||
|
|
||||||
/// Represents a Python `unicode string`.
|
/// Represents a Python `unicode string`.
|
||||||
pub struct PyUnicode(PyObject);
|
pub struct PyUnicode(PyObject);
|
||||||
|
|
||||||
pyobject_native_type!(PyUnicode, PyUnicode_Type, PyUnicode_Check);
|
pyobject_native_type!(PyUnicode, ffi::PyUnicode_Type, ffi::PyUnicode_Check);
|
||||||
|
|
||||||
/// Represents a Python `byte` string. Corresponds to `str` in Python 2
|
/// Represents a Python `byte` string. Corresponds to `str` in Python 2
|
||||||
pub struct PyBytes(PyObject);
|
pub struct PyBytes(PyObject);
|
||||||
|
|
||||||
pyobject_native_type!(PyBytes, PyBaseString_Type, PyString_Check);
|
pyobject_native_type!(PyBytes, ffi::PyBaseString_Type, ffi::PyString_Check);
|
||||||
|
|
||||||
|
|
||||||
impl PyString {
|
impl PyString {
|
||||||
|
|
|
@ -15,7 +15,7 @@ use super::exc;
|
||||||
/// Represents a Python `tuple` object.
|
/// Represents a Python `tuple` object.
|
||||||
pub struct PyTuple(PyObject);
|
pub struct PyTuple(PyObject);
|
||||||
|
|
||||||
pyobject_native_type!(PyTuple, PyTuple_Type, PyTuple_Check);
|
pyobject_native_type!(PyTuple, ffi::PyTuple_Type, ffi::PyTuple_Check);
|
||||||
|
|
||||||
|
|
||||||
impl PyTuple {
|
impl PyTuple {
|
||||||
|
|
|
@ -15,7 +15,7 @@ use typeob::{PyTypeInfo, PyTypeObject};
|
||||||
/// Represents a reference to a Python `type object`.
|
/// Represents a reference to a Python `type object`.
|
||||||
pub struct PyType(PyObject);
|
pub struct PyType(PyObject);
|
||||||
|
|
||||||
pyobject_native_type!(PyType, PyType_Type, PyType_Check);
|
pyobject_native_type!(PyType, ffi::PyType_Type, ffi::PyType_Check);
|
||||||
|
|
||||||
|
|
||||||
impl PyType {
|
impl PyType {
|
||||||
|
|
Loading…
Reference in a new issue