reorganize the loop

This commit is contained in:
Jacob Finkelman 2025-02-06 22:07:05 +00:00
parent a9da3c8345
commit 8014091612

View File

@ -958,13 +958,14 @@ fn find_candidate(
} else { } else {
None None
}; };
let mut new_frame = None;
if let Some(age) = age {
while let Some(frame) = backtrack_stack.pop() {
// If all members of `conflicting_activations` are still
// active in this back up we know that we're guaranteed to not actually
// make any progress. As a result if we hit this condition we can
// completely skip this backtrack frame and move on to the next.
while let Some(mut frame) = backtrack_stack.pop() {
// If all members of `conflicting_activations` are still
// active in this back up we know that we're guaranteed to not actually
// make any progress. As a result if we hit this condition we can
// completely skip this backtrack frame and move on to the next.
if let Some(age) = age {
// Above we use `cx` to determine if this is going to be conflicting. // Above we use `cx` to determine if this is going to be conflicting.
// But lets just double check if the `pop`ed frame agrees. // But lets just double check if the `pop`ed frame agrees.
let frame_too_new = frame.context.age >= age; let frame_too_new = frame.context.age >= age;
@ -975,26 +976,30 @@ fn find_candidate(
== frame_too_new.then_some(age) == frame_too_new.then_some(age)
); );
if frame_to_new { if !frame_too_new {
trace!( new_frame = Some(frame);
"{} = \"{}\" skip as not solving {}: {:?}", break;
frame.dep.package_name(),
frame.dep.version_req(),
parent.package_id(),
conflicting_activations
);
continue;
} }
trace!(
"{} = \"{}\" skip as not solving {}: {:?}",
frame.dep.package_name(),
frame.dep.version_req(),
parent.package_id(),
conflicting_activations
);
} }
} else {
// If we're here then we are in abnormal situations and need to just go one frame at a time.
new_frame = backtrack_stack.pop();
}
new_frame.map(|mut frame| {
let (candidate, has_another) = frame let (candidate, has_another) = frame
.remaining_candidates .remaining_candidates
.next(&mut frame.conflicting_activations, &frame.context) .next(&mut frame.conflicting_activations, &frame.context)
.expect("why did we save a frame that has no next?"); .expect("why did we save a frame that has no next?");
(candidate, has_another, frame)
return Some((candidate, has_another, frame)); })
}
None
} }
fn check_cycles(resolve: &Resolve) -> CargoResult<()> { fn check_cycles(resolve: &Resolve) -> CargoResult<()> {