Skip to content

Commit bc97cdb

Browse files
romtsnclaude
andcommitted
refactor: Simplify resolve_base_entries in mapper and cache
- Rename cache_member_output_line to compute_member_output_line - Collapse any_has_range if-else into single loop with conditional line - Collapse no_range len==1 / all_same_name into single all_same_name check - Remove separate zero_zero/no_range vectors; pre-compute aggregates in a single pass and use one emission loop over base_entries Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 7a6636e commit bc97cdb

File tree

2 files changed

+84
-107
lines changed

2 files changed

+84
-107
lines changed

src/cache/mod.rs

Lines changed: 43 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1062,7 +1062,7 @@ fn map_member_without_lines<'a>(
10621062
}
10631063

10641064
/// Computes the default output line for a cache member's original_startline.
1065-
fn cache_member_output_line(member: &raw::Member) -> Option<usize> {
1065+
fn compute_member_output_line(member: &raw::Member) -> Option<usize> {
10661066
member
10671067
.original_startline()
10681068
.filter(|&v| v > 0)
@@ -1076,7 +1076,7 @@ fn iterate_without_lines<'a>(
10761076
outer_source_file: Option<&str>,
10771077
) -> Option<StackFrame<'a>> {
10781078
let member = members.next()?;
1079-
let output_line = cache_member_output_line(member);
1079+
let output_line = compute_member_output_line(member);
10801080
map_member_without_lines(cache, frame, member, outer_source_file, output_line)
10811081
}
10821082

@@ -1143,78 +1143,65 @@ fn resolve_base_entries<'a>(
11431143
base_entries: &[&raw::Member],
11441144
outer_source_file: Option<&str>,
11451145
) -> Vec<StackFrame<'a>> {
1146-
let zero_zero: Vec<&&raw::Member> = base_entries
1147-
.iter()
1148-
.filter(|m| m.startline().is_some())
1149-
.collect();
1150-
let no_range: Vec<&&raw::Member> = base_entries
1151-
.iter()
1152-
.filter(|m| m.startline().is_none())
1153-
.collect();
1154-
1155-
let mut frames = Vec::new();
1156-
1157-
// Process 0:0 entries.
1158-
if !zero_zero.is_empty() {
1159-
let any_has_range = zero_zero.iter().any(|m| {
1160-
m.original_endline != u32::MAX
1161-
&& m.original_endline != m.original_startline().unwrap_or(0) as u32
1162-
});
1163-
if any_has_range {
1164-
for member in &zero_zero {
1165-
if let Some(f) =
1166-
map_member_without_lines(cache, frame, member, outer_source_file, Some(0))
1167-
{
1168-
frames.push(f);
1169-
}
1146+
// Pre-compute aggregates in a single pass.
1147+
let mut any_zero_zero_has_range = false;
1148+
let mut no_range_count = 0usize;
1149+
let mut first_no_range_offset: Option<u32> = None;
1150+
let mut all_no_range_same_name = true;
1151+
for member in base_entries {
1152+
if member.startline().is_some() {
1153+
if member.original_endline != u32::MAX
1154+
&& member.original_endline != member.original_startline().unwrap_or(0) as u32
1155+
{
1156+
any_zero_zero_has_range = true;
11701157
}
11711158
} else {
1172-
for member in &zero_zero {
1173-
let line = cache_member_output_line(member);
1174-
if let Some(f) =
1175-
map_member_without_lines(cache, frame, member, outer_source_file, line)
1176-
{
1177-
frames.push(f);
1159+
no_range_count += 1;
1160+
match first_no_range_offset {
1161+
None => first_no_range_offset = Some(member.original_name_offset),
1162+
Some(first) if member.original_name_offset != first => {
1163+
all_no_range_same_name = false
11781164
}
1165+
_ => {}
11791166
}
11801167
}
11811168
}
11821169

1183-
// Process no-range entries.
1184-
if !no_range.is_empty() {
1185-
if no_range.len() == 1 {
1186-
let member = no_range[0];
1187-
let line = if member.original_startline().unwrap_or(0) > 0 {
1188-
Some(member.original_startline().unwrap_or(0) as usize)
1189-
} else if member.original_startline().is_none() {
1170+
let mut frames = Vec::new();
1171+
let mut no_range_emitted = false;
1172+
for member in base_entries {
1173+
if member.startline().is_some() {
1174+
let line = if any_zero_zero_has_range {
11901175
Some(0)
11911176
} else {
1192-
None
1177+
compute_member_output_line(member)
11931178
};
1194-
if let Some(f) =
1195-
map_member_without_lines(cache, frame, member, outer_source_file, line)
1179+
if let Some(f) = map_member_without_lines(cache, frame, member, outer_source_file, line)
11961180
{
11971181
frames.push(f);
11981182
}
1199-
} else {
1200-
let all_same_name = no_range
1201-
.iter()
1202-
.all(|m| m.original_name_offset == no_range[0].original_name_offset);
1203-
if all_same_name {
1183+
} else if all_no_range_same_name {
1184+
if !no_range_emitted {
1185+
no_range_emitted = true;
1186+
let line = if no_range_count > 1 {
1187+
Some(0)
1188+
} else {
1189+
compute_member_output_line(member).or(if member.original_startline().is_none() {
1190+
Some(0)
1191+
} else {
1192+
None
1193+
})
1194+
};
12041195
if let Some(f) =
1205-
map_member_without_lines(cache, frame, no_range[0], outer_source_file, Some(0))
1196+
map_member_without_lines(cache, frame, member, outer_source_file, line)
12061197
{
12071198
frames.push(f);
12081199
}
1209-
} else {
1210-
for member in &no_range {
1211-
if let Some(f) =
1212-
map_member_without_lines(cache, frame, member, outer_source_file, Some(0))
1213-
{
1214-
frames.push(f);
1215-
}
1216-
}
12171200
}
1201+
} else if let Some(f) =
1202+
map_member_without_lines(cache, frame, member, outer_source_file, Some(0))
1203+
{
1204+
frames.push(f);
12181205
}
12191206
}
12201207

src/mapper.rs

Lines changed: 41 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -343,74 +343,64 @@ fn resolve_base_entries<'s>(
343343
base_entries: &[&'s MemberMapping<'s>],
344344
collected: &mut CollectedFrames<'s>,
345345
) {
346-
let zero_zero: Vec<&&MemberMapping<'s>> = base_entries
347-
.iter()
348-
.filter(|m| m.startline.is_some())
349-
.collect();
350-
let no_range: Vec<&&MemberMapping<'s>> = base_entries
351-
.iter()
352-
.filter(|m| m.startline.is_none())
353-
.collect();
354-
355-
// Process 0:0 entries.
356-
if !zero_zero.is_empty() {
357-
let any_has_range = zero_zero.iter().any(|m| {
358-
m.original_endline.is_some() && m.original_endline != m.original_startline
359-
});
360-
if any_has_range {
361-
for member in &zero_zero {
362-
collected
363-
.frames
364-
.push(map_member_without_lines(frame, member, Some(0)));
365-
collected.rewrite_rules.extend(member.rewrite_rules.iter());
346+
// Pre-compute aggregates in a single pass.
347+
let mut any_zero_zero_has_range = false;
348+
let mut no_range_count = 0usize;
349+
let mut first_no_range_name: Option<&str> = None;
350+
let mut all_no_range_same_name = true;
351+
for member in base_entries {
352+
if member.startline.is_some() {
353+
if member.original_endline.is_some()
354+
&& member.original_endline != member.original_startline
355+
{
356+
any_zero_zero_has_range = true;
366357
}
367358
} else {
368-
for member in &zero_zero {
369-
let line = if member.original_startline.unwrap_or(0) > 0 {
370-
member.original_startline
371-
} else {
372-
None
373-
};
374-
collected
375-
.frames
376-
.push(map_member_without_lines(frame, member, line));
377-
collected.rewrite_rules.extend(member.rewrite_rules.iter());
359+
no_range_count += 1;
360+
match first_no_range_name {
361+
None => first_no_range_name = Some(member.original),
362+
Some(first) if member.original != first => all_no_range_same_name = false,
363+
_ => {}
378364
}
379365
}
380366
}
381367

382-
// Process no-range entries.
383-
if !no_range.is_empty() {
384-
if no_range.len() == 1 {
385-
let member = no_range[0];
386-
let line = if member.original_startline.unwrap_or(0) > 0 {
387-
member.original_startline
388-
} else if member.original_startline.is_none() {
368+
let mut no_range_emitted = false;
369+
for member in base_entries {
370+
if member.startline.is_some() {
371+
let line = if any_zero_zero_has_range {
389372
Some(0)
373+
} else if member.original_startline.unwrap_or(0) > 0 {
374+
member.original_startline
390375
} else {
391376
None
392377
};
393378
collected
394379
.frames
395380
.push(map_member_without_lines(frame, member, line));
396381
collected.rewrite_rules.extend(member.rewrite_rules.iter());
397-
} else {
398-
let all_same_name = no_range.iter().all(|m| m.original == no_range[0].original);
399-
if all_same_name {
382+
} else if all_no_range_same_name {
383+
if !no_range_emitted {
384+
no_range_emitted = true;
385+
let line = if no_range_count > 1 {
386+
Some(0)
387+
} else if member.original_startline.unwrap_or(0) > 0 {
388+
member.original_startline
389+
} else if member.original_startline.is_none() {
390+
Some(0)
391+
} else {
392+
None
393+
};
400394
collected
401395
.frames
402-
.push(map_member_without_lines(frame, no_range[0], Some(0)));
403-
collected
404-
.rewrite_rules
405-
.extend(no_range[0].rewrite_rules.iter());
406-
} else {
407-
for member in &no_range {
408-
collected
409-
.frames
410-
.push(map_member_without_lines(frame, member, Some(0)));
411-
collected.rewrite_rules.extend(member.rewrite_rules.iter());
412-
}
396+
.push(map_member_without_lines(frame, member, line));
397+
collected.rewrite_rules.extend(member.rewrite_rules.iter());
413398
}
399+
} else {
400+
collected
401+
.frames
402+
.push(map_member_without_lines(frame, member, Some(0)));
403+
collected.rewrite_rules.extend(member.rewrite_rules.iter());
414404
}
415405
}
416406
}

0 commit comments

Comments
 (0)