Merge pull request #540 from PyO3/disable_broken_subclassing
Disable segfaulty subclassing by default
This commit is contained in:
commit
98b7079183
|
@ -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)
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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 = []
|
||||||
|
|
|
@ -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" => {
|
||||||
|
|
|
@ -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"]
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in a new issue