From 7a5ba0efcc43f35034950786f07fb425ca255376 Mon Sep 17 00:00:00 2001 From: Noah <33094578+coolreader18@users.noreply.github.com> Date: Thu, 19 Nov 2020 12:46:49 -0600 Subject: [PATCH] Update pytype to be a bit more idiomatic --- vm/src/builtins/pytype.rs | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/vm/src/builtins/pytype.rs b/vm/src/builtins/pytype.rs index cdbe2aec5..26262a0e6 100644 --- a/vm/src/builtins/pytype.rs +++ b/vm/src/builtins/pytype.rs @@ -727,24 +727,22 @@ pub fn tp_new_wrapper( call_tp_new(zelf, cls, args, vm) } -fn take_next_base(mut bases: Vec>) -> (Option, Vec>) { - bases = bases.into_iter().filter(|x| !x.is_empty()).collect(); - - for base in &bases { +fn take_next_base(bases: &mut Vec>) -> Option { + for base in bases.iter() { let head = base[0].clone(); - if !(&bases).iter().any(|x| x[1..].iter().any(|x| x.is(&head))) { + if !bases.iter().any(|x| x[1..].iter().any(|x| x.is(&head))) { // Remove from other heads. - for item in &mut bases { + for item in bases.iter_mut() { if item[0].is(&head) { item.remove(0); } } - return (Some(head), bases); + return Some(head); } } - (None, bases) + None } fn linearise_mro(mut bases: Vec>) -> Result, String> { @@ -768,22 +766,19 @@ fn linearise_mro(mut bases: Vec>) -> Result, Strin } let mut result = vec![]; - loop { - if (&bases).iter().all(Vec::is_empty) { - break; - } - let (head, new_bases) = take_next_base(bases); - let head = head.ok_or_else(|| { + while !bases.is_empty() { + let head = take_next_base(&mut bases).ok_or_else(|| { // Take the head class of each class here. Now that we have reached the problematic bases. // Because this failed, we assume the lists cannot be empty. format!( "Cannot create a consistent method resolution order (MRO) for bases {}", - new_bases.iter().map(|x| x.first().unwrap()).join(", ") + bases.iter().map(|x| x.first().unwrap()).format(", ") ) - }); + })?; - result.push(head.unwrap()); - bases = new_bases; + result.push(head); + + bases.retain(|x| !x.is_empty()); } Ok(result) }