Merge pull request #540 from PyO3/disable_broken_subclassing

Disable segfaulty subclassing by default
This commit is contained in:
konstin 2019-08-05 14:39:46 +02:00 committed by GitHub
commit 98b7079183
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 24 additions and 2 deletions

View file

@ -14,6 +14,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
* Use existing fields and methods before calling custom __getattr__. [#505](https://github.com/PyO3/pyo3/pull/512) * Use existing fields and methods before calling custom __getattr__. [#505](https://github.com/PyO3/pyo3/pull/512)
* `PyBytes` can now be indexed just like `Vec<u8>` * `PyBytes` can now be indexed just like `Vec<u8>`
## Removed
* `#[pyclass(subclass)]` is hidden a `unsound-subclass` feature because it's causing segmentation faults.
### Fixed ### Fixed
* More readable error message for generics in pyclass [#503](https://github.com/PyO3/pyo3/pull/503) * More readable error message for generics in pyclass [#503](https://github.com/PyO3/pyo3/pull/503)

View file

@ -55,6 +55,9 @@ extension-module = []
# are welcome. # are welcome.
# abi3 = [] # abi3 = []
# Activate subclassing support
unsound-subclass = ["pyo3cls/unsound-subclass"]
[workspace] [workspace]
members = [ members = [
"pyo3cls", "pyo3cls",

View file

@ -9,7 +9,7 @@ edition = "2018"
[dependencies.pyo3] [dependencies.pyo3]
path = "../../" path = "../../"
features = ["extension-module"] features = ["extension-module", "unsound-subclass"]
[lib] [lib]
name = "rustapi_module" name = "rustapi_module"

View file

@ -102,10 +102,10 @@ so that they can benefit from a freelist. `XXX` is a number of items for the fre
If a custom class contains references to other Python objects that can be collected, the `PyGCProtocol` trait has to be implemented. If a custom class contains references to other Python objects that can be collected, the `PyGCProtocol` trait has to be implemented.
* `weakref` - Adds support for Python weak references. * `weakref` - Adds support for Python weak references.
* `extends=BaseType` - Use a custom base class. The base `BaseType` must implement `PyTypeInfo`. * `extends=BaseType` - Use a custom base class. The base `BaseType` must implement `PyTypeInfo`.
* `subclass` - Allows Python classes to inherit from this class.
* `dict` - Adds `__dict__` support, so that the instances of this type have a dictionary containing arbitrary instance variables. * `dict` - Adds `__dict__` support, so that the instances of this type have a dictionary containing arbitrary instance variables.
* `module="XXX"` - Set the name of the module the class will be shown as defined in. If not given, the class * `module="XXX"` - Set the name of the module the class will be shown as defined in. If not given, the class
will be a virtual member of the `builtins` module. will be a virtual member of the `builtins` module.
* `subclass` - Allows Python classes to inherit from this class. This feature is hidden behind a `unsound-subclass` feature because it is currently causing segmentation faults
## Constructor ## Constructor

View file

@ -14,3 +14,6 @@ edition = "2018"
quote = "0.6.12" quote = "0.6.12"
proc-macro2 = "0.4.30" proc-macro2 = "0.4.30"
syn = { version = "0.15.34", features = ["full", "extra-traits"] } syn = { version = "0.15.34", features = ["full", "extra-traits"] }
[features]
unsound-subclass = []

View file

@ -132,6 +132,12 @@ impl PyClassArgs {
parse_quote! {pyo3::type_object::PY_TYPE_FLAG_WEAKREF} parse_quote! {pyo3::type_object::PY_TYPE_FLAG_WEAKREF}
} }
"subclass" => { "subclass" => {
if cfg!(not(feature = "unsound-subclass")) {
return Err(syn::Error::new_spanned(
exp.path.clone(),
"You need to activate the `unsound-subclass` feature if you want to use subclassing",
));
}
parse_quote! {pyo3::type_object::PY_TYPE_FLAG_BASETYPE} parse_quote! {pyo3::type_object::PY_TYPE_FLAG_BASETYPE}
} }
"dict" => { "dict" => {

View file

@ -18,3 +18,6 @@ quote= "0.6.12"
proc-macro2 = "0.4.30" proc-macro2 = "0.4.30"
syn = { version = "0.15.34", features = ["full", "extra-traits"] } syn = { version = "0.15.34", features = ["full", "extra-traits"] }
pyo3-derive-backend = { path = "../pyo3-derive-backend", version = "=0.7.0" } pyo3-derive-backend = { path = "../pyo3-derive-backend", version = "=0.7.0" }
[features]
unsound-subclass = ["pyo3-derive-backend/unsound-subclass"]

View file

@ -1,5 +1,6 @@
use pyo3::prelude::*; use pyo3::prelude::*;
use pyo3::py_run; use pyo3::py_run;
#[cfg(feature = "unsound-subclass")]
use pyo3::types::IntoPyDict; use pyo3::types::IntoPyDict;
use std::isize; use std::isize;
@ -11,9 +12,11 @@ struct BaseClass {
val1: usize, val1: usize,
} }
#[cfg(feature = "unsound-subclass")]
#[pyclass(subclass)] #[pyclass(subclass)]
struct SubclassAble {} struct SubclassAble {}
#[cfg(feature = "unsound-subclass")]
#[test] #[test]
fn subclass() { fn subclass() {
let gil = Python::acquire_gil(); let gil = Python::acquire_gil();