Fix a corner case for PyClassInitializer
This commit is contained in:
parent
efa16a6dc7
commit
e2dc843de5
|
@ -344,7 +344,7 @@ impl<T: PyTypeInfo> PyClassInitializer<T> {
|
||||||
let PyClassInitializer { init, super_init } = self;
|
let PyClassInitializer { init, super_init } = self;
|
||||||
if let Some(value) = init {
|
if let Some(value) = init {
|
||||||
unsafe { shell.py_init(value) };
|
unsafe { shell.py_init(value) };
|
||||||
} else if !T::ConcreteLayout::NEED_INIT {
|
} else if T::ConcreteLayout::NEED_INIT {
|
||||||
raise_err!(T::NAME);
|
raise_err!(T::NAME);
|
||||||
}
|
}
|
||||||
if let Some(super_init) = super_init {
|
if let Some(super_init) = super_init {
|
||||||
|
|
|
@ -68,16 +68,30 @@ fn inheritance_with_new_methods() {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[pyclass(extends=BaseClass)]
|
#[pyclass(extends=BaseClass)]
|
||||||
struct InvalidSubClass {
|
struct InvalidSubClass1 {
|
||||||
#[pyo3(get)]
|
#[pyo3(get)]
|
||||||
val2: usize,
|
val2: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[pymethods]
|
#[pymethods]
|
||||||
impl InvalidSubClass {
|
impl InvalidSubClass1 {
|
||||||
#[new]
|
#[new]
|
||||||
fn new() -> PyClassInitializer<Self> {
|
fn new() -> PyClassInitializer<Self> {
|
||||||
PyClassInitializer::from_value(InvalidSubClass { val2: 5 })
|
PyClassInitializer::from_value(InvalidSubClass1 { val2: 5 })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[pyclass(extends=BaseClass)]
|
||||||
|
struct InvalidSubClass2 {
|
||||||
|
#[pyo3(get)]
|
||||||
|
val2: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[pymethods]
|
||||||
|
impl InvalidSubClass2 {
|
||||||
|
#[new]
|
||||||
|
fn new() -> PyClassInitializer<Self> {
|
||||||
|
PyClassInitializer::new()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,7 +100,9 @@ fn uninit_baseclass_raise_exception() {
|
||||||
let gil = Python::acquire_gil();
|
let gil = Python::acquire_gil();
|
||||||
let py = gil.python();
|
let py = gil.python();
|
||||||
let _baseclass = py.get_type::<BaseClass>();
|
let _baseclass = py.get_type::<BaseClass>();
|
||||||
let subclass = py.get_type::<InvalidSubClass>();
|
let subclass = py.get_type::<InvalidSubClass1>();
|
||||||
|
py_expect_exception!(py, subclass, "subclass()", RuntimeError);
|
||||||
|
let subclass = py.get_type::<InvalidSubClass2>();
|
||||||
py_expect_exception!(py, subclass, "subclass()", RuntimeError);
|
py_expect_exception!(py, subclass, "subclass()", RuntimeError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,7 +110,7 @@ fn uninit_baseclass_raise_exception() {
|
||||||
fn uninit_baseclass_returns_err() {
|
fn uninit_baseclass_returns_err() {
|
||||||
let gil = Python::acquire_gil();
|
let gil = Python::acquire_gil();
|
||||||
let py = gil.python();
|
let py = gil.python();
|
||||||
let subclass = pyo3::pyclass::PyClassShell::new_ref(py, InvalidSubClass { val2: 5 });
|
let subclass = pyo3::pyclass::PyClassShell::new_ref(py, InvalidSubClass1 { val2: 5 });
|
||||||
if let Err(err) = subclass {
|
if let Err(err) = subclass {
|
||||||
py_run!(
|
py_run!(
|
||||||
py,
|
py,
|
||||||
|
|
Loading…
Reference in a new issue