Implement IntoIterator for PrimaryMap.
This makes iterating through a `PrimaryMap` more consistent with iterating through a `Vec`.
This commit is contained in:
@@ -44,7 +44,7 @@ pub fn do_dce(func: &mut Function, domtree: &mut DominatorTree) {
|
|||||||
let mut live = Vec::with_capacity(func.dfg.num_values());
|
let mut live = Vec::with_capacity(func.dfg.num_values());
|
||||||
live.resize(func.dfg.num_values(), false);
|
live.resize(func.dfg.num_values(), false);
|
||||||
|
|
||||||
for &ebb in domtree.cfg_postorder().iter() {
|
for &ebb in domtree.cfg_postorder() {
|
||||||
let mut pos = FuncCursor::new(func).at_bottom(ebb);
|
let mut pos = FuncCursor::new(func).at_bottom(ebb);
|
||||||
while let Some(inst) = pos.prev_inst() {
|
while let Some(inst) = pos.prev_inst() {
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ impl Pressure {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Get the layout of aliasing top-level register classes from the register banks.
|
// Get the layout of aliasing top-level register classes from the register banks.
|
||||||
for bank in reginfo.banks.iter() {
|
for bank in reginfo.banks {
|
||||||
let first = bank.first_toprc;
|
let first = bank.first_toprc;
|
||||||
let num = bank.num_toprcs;
|
let num = bank.num_toprcs;
|
||||||
|
|
||||||
|
|||||||
@@ -50,31 +50,31 @@ fn write_preamble(
|
|||||||
writeln!(w, " {} = {}", ss, slot)?;
|
writeln!(w, " {} = {}", ss, slot)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (gv, gv_data) in func.global_vars.iter() {
|
for (gv, gv_data) in &func.global_vars {
|
||||||
any = true;
|
any = true;
|
||||||
writeln!(w, " {} = {}", gv, gv_data)?;
|
writeln!(w, " {} = {}", gv, gv_data)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (heap, heap_data) in func.heaps.iter() {
|
for (heap, heap_data) in &func.heaps {
|
||||||
any = true;
|
any = true;
|
||||||
writeln!(w, " {} = {}", heap, heap_data)?;
|
writeln!(w, " {} = {}", heap, heap_data)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write out all signatures before functions since function declarations can refer to
|
// Write out all signatures before functions since function declarations can refer to
|
||||||
// signatures.
|
// signatures.
|
||||||
for (sig, sig_data) in func.dfg.signatures.iter() {
|
for (sig, sig_data) in &func.dfg.signatures {
|
||||||
any = true;
|
any = true;
|
||||||
writeln!(w, " {} = {}", sig, sig_data.display(regs))?;
|
writeln!(w, " {} = {}", sig, sig_data.display(regs))?;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (fnref, ext_func) in func.dfg.ext_funcs.iter() {
|
for (fnref, ext_func) in &func.dfg.ext_funcs {
|
||||||
any = true;
|
any = true;
|
||||||
if ext_func.signature != SigRef::reserved_value() {
|
if ext_func.signature != SigRef::reserved_value() {
|
||||||
writeln!(w, " {} = {}", fnref, ext_func)?;
|
writeln!(w, " {} = {}", fnref, ext_func)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (jt, jt_data) in func.jump_tables.iter() {
|
for (jt, jt_data) in &func.jump_tables {
|
||||||
any = true;
|
any = true;
|
||||||
writeln!(w, " {} = {}", jt, jt_data)?;
|
writeln!(w, " {} = {}", jt, jt_data)?;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -121,6 +121,30 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'a, K, V> IntoIterator for &'a PrimaryMap<K, V>
|
||||||
|
where
|
||||||
|
K: EntityRef,
|
||||||
|
{
|
||||||
|
type Item = (K, &'a V);
|
||||||
|
type IntoIter = Iter<'a, K, V>;
|
||||||
|
|
||||||
|
fn into_iter(self) -> Self::IntoIter {
|
||||||
|
Iter::new(self.elems.iter())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a, K, V> IntoIterator for &'a mut PrimaryMap<K, V>
|
||||||
|
where
|
||||||
|
K: EntityRef,
|
||||||
|
{
|
||||||
|
type Item = (K, &'a mut V);
|
||||||
|
type IntoIter = IterMut<'a, K, V>;
|
||||||
|
|
||||||
|
fn into_iter(self) -> Self::IntoIter {
|
||||||
|
IterMut::new(self.elems.iter_mut())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
@@ -171,7 +195,7 @@ mod tests {
|
|||||||
m.push(33);
|
m.push(33);
|
||||||
|
|
||||||
let mut i = 0;
|
let mut i = 0;
|
||||||
for (key, value) in m.iter() {
|
for (key, value) in &m {
|
||||||
assert_eq!(key.index(), i);
|
assert_eq!(key.index(), i);
|
||||||
match i {
|
match i {
|
||||||
0 => assert_eq!(*value, 12),
|
0 => assert_eq!(*value, 12),
|
||||||
|
|||||||
Reference in New Issue
Block a user