| 273 | impl<'a> Iterator for TransformRangeStartIter<'a> { |
| 274 | type Item = (GeneratedAddress, RangeIndex); |
| 275 | fn next(&mut self) -> Option<Self::Item> { |
| 276 | if let Some((first, tail)) = self.indices.split_first() { |
| 277 | let range_index = *first; |
| 278 | let range = &self.ranges[range_index]; |
| 279 | self.indices = tail; |
| 280 | let address = match range |
| 281 | .positions |
| 282 | .binary_search_by(|a| a.wasm_pos.cmp(&self.addr)) |
| 283 | { |
| 284 | Ok(i) => range.positions[i].gen_start, |
| 285 | Err(i) => { |
| 286 | if i == 0 { |
| 287 | range.gen_start |
| 288 | } else { |
| 289 | range.positions[i - 1].gen_end |
| 290 | } |
| 291 | } |
| 292 | }; |
| 293 | Some((address, range_index)) |
| 294 | } else { |
| 295 | None |
| 296 | } |
| 297 | } |
| 298 | } |
| 299 | |
| 300 | // Utility iterator to find all ranges ends for specific Wasm address. |