Skip to content

Commit a373269

Browse files
committed
More
1 parent b85ad73 commit a373269

File tree

1 file changed

+24
-24
lines changed

1 file changed

+24
-24
lines changed

src/singledispatch/mro.rs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use pyo3::exceptions::PyRuntimeError;
55
use pyo3::prelude::*;
66
use pyo3::types::PyTuple;
77
use pyo3::{intern, Bound, PyObject, PyResult, Python};
8+
use std::borrow::Borrow;
89
use std::cmp::Reverse;
910
use std::collections::hash_map::Keys;
1011
use std::collections::HashSet;
@@ -115,6 +116,26 @@ fn c3_boundary(py: Python, bases: &[PyTypeReference]) -> PyResult<usize> {
115116
Ok(boundary)
116117
}
117118

119+
fn sub_c3_mro<I, G>(
120+
py: Python,
121+
bases: I,
122+
abcs: &Vec<&PyTypeReference>,
123+
) -> PyResult<Vec<Vec<PyTypeReference>>>
124+
where
125+
G: Borrow<PyTypeReference>,
126+
I: Iterator<Item = G>,
127+
{
128+
let mut v: Vec<Vec<PyTypeReference>> = Vec::new();
129+
for b in bases {
130+
v.push(c3_mro(
131+
py,
132+
b.borrow().wrapped().bind(py),
133+
abcs.iter().map(|abc| abc.clone_ref(py)).collect(),
134+
)?);
135+
}
136+
Ok(v)
137+
}
138+
118139
fn c3_mro(
119140
py: Python,
120141
cls: &Bound<'_, PyAny>,
@@ -161,34 +182,13 @@ fn c3_mro(
161182
let mut cls_ref = vec![PyTypeReference::new(cls.clone().unbind())];
162183
mros.push(&mut cls_ref);
163184

164-
let mut explicit_bases_mro = Vec::from_iter(explicit_bases.iter().map(|b| {
165-
c3_mro(
166-
py,
167-
b.wrapped().bind(py),
168-
new_abcs.iter().map(|abc| abc.clone_ref(py)).collect(),
169-
)
170-
.unwrap()
171-
}));
185+
let mut explicit_bases_mro = sub_c3_mro(py, explicit_bases.iter(), &new_abcs)?;
172186
mros.extend(&mut explicit_bases_mro);
173187

174-
let mut abstract_bases_mro = Vec::from_iter(abstract_bases.iter().map(|b| {
175-
c3_mro(
176-
py,
177-
b.wrapped().bind(py),
178-
new_abcs.iter().map(|abc| abc.clone_ref(py)).collect(),
179-
)
180-
.unwrap()
181-
}));
188+
let mut abstract_bases_mro = sub_c3_mro(py, abstract_bases.iter().map(|v| *v), &new_abcs)?;
182189
mros.extend(&mut abstract_bases_mro);
183190

184-
let mut other_bases_mro = Vec::from_iter(other_bases.iter().map(|b| {
185-
c3_mro(
186-
py,
187-
b.wrapped().bind(py),
188-
new_abcs.iter().map(|abc| abc.clone_ref(py)).collect(),
189-
)
190-
.unwrap()
191-
}));
191+
let mut other_bases_mro = sub_c3_mro(py, other_bases.iter(), &new_abcs)?;
192192
mros.extend(&mut other_bases_mro);
193193

194194
let mut explicit_bases_cloned = Vec::from_iter(explicit_bases.iter().map(|b| b.clone_ref(py)));

0 commit comments

Comments
 (0)