Cross-check compact event dispatch-strip descriptors
This commit is contained in:
parent
03658aa59a
commit
a66fe1c4db
2 changed files with 53 additions and 7 deletions
|
|
@ -9452,6 +9452,27 @@ fn parse_event_runtime_collection_summary_with_tag_width(
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
mutation_candidate_opcodes.sort_unstable();
|
mutation_candidate_opcodes.sort_unstable();
|
||||||
mutation_candidate_opcodes.dedup();
|
mutation_candidate_opcodes.dedup();
|
||||||
|
let mut mutation_candidate_descriptor_labels = records
|
||||||
|
.iter()
|
||||||
|
.flat_map(|record| record.grouped_effect_rows.iter())
|
||||||
|
.filter(|row| {
|
||||||
|
opcode_reaches_world_apply_compact_runtime_effect_dispatch_strip(row.opcode)
|
||||||
|
})
|
||||||
|
.filter_map(|row| row.descriptor_label.clone())
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
mutation_candidate_descriptor_labels.sort_unstable();
|
||||||
|
mutation_candidate_descriptor_labels.dedup();
|
||||||
|
let mut mutation_candidate_unknown_descriptor_ids = records
|
||||||
|
.iter()
|
||||||
|
.flat_map(|record| record.grouped_effect_rows.iter())
|
||||||
|
.filter(|row| {
|
||||||
|
opcode_reaches_world_apply_compact_runtime_effect_dispatch_strip(row.opcode)
|
||||||
|
&& row.descriptor_label.is_none()
|
||||||
|
})
|
||||||
|
.map(|row| row.descriptor_id)
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
mutation_candidate_unknown_descriptor_ids.sort_unstable();
|
||||||
|
mutation_candidate_unknown_descriptor_ids.dedup();
|
||||||
let mut control_lane_notes = Vec::new();
|
let mut control_lane_notes = Vec::new();
|
||||||
if nondirect_compact_record_count != 0
|
if nondirect_compact_record_count != 0
|
||||||
&& nondirect_compact_record_count == nondirect_compact_records_missing_trigger_kind
|
&& nondirect_compact_record_count == nondirect_compact_records_missing_trigger_kind
|
||||||
|
|
@ -9468,13 +9489,25 @@ fn parse_event_runtime_collection_summary_with_tag_width(
|
||||||
}
|
}
|
||||||
if !mutation_candidate_record_indexes.is_empty() {
|
if !mutation_candidate_record_indexes.is_empty() {
|
||||||
control_lane_notes.push(format!(
|
control_lane_notes.push(format!(
|
||||||
"records with grouped opcodes already in the 0x00431b20 mutation strip = {:?}",
|
"records with grouped opcodes already in the 0x00431b20 dispatch strip = {:?}",
|
||||||
mutation_candidate_record_indexes
|
mutation_candidate_record_indexes
|
||||||
));
|
));
|
||||||
control_lane_notes.push(format!(
|
control_lane_notes.push(format!(
|
||||||
"0x00431b20 mutation-strip opcodes present in decoded grouped rows = {:?}",
|
"0x00431b20 dispatch-strip opcodes present in decoded grouped rows = {:?}",
|
||||||
mutation_candidate_opcodes
|
mutation_candidate_opcodes
|
||||||
));
|
));
|
||||||
|
if !mutation_candidate_descriptor_labels.is_empty() {
|
||||||
|
control_lane_notes.push(format!(
|
||||||
|
"decoded grouped descriptor labels present in the 0x00431b20 dispatch strip = {:?}",
|
||||||
|
mutation_candidate_descriptor_labels
|
||||||
|
));
|
||||||
|
}
|
||||||
|
if !mutation_candidate_unknown_descriptor_ids.is_empty() {
|
||||||
|
control_lane_notes.push(format!(
|
||||||
|
"grouped descriptor ids still missing checked-in labels in the 0x00431b20 dispatch strip = {:?}",
|
||||||
|
mutation_candidate_unknown_descriptor_ids
|
||||||
|
));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Some(SmpLoadedEventRuntimeCollectionSummary {
|
return Some(SmpLoadedEventRuntimeCollectionSummary {
|
||||||
|
|
@ -22181,11 +22214,16 @@ mod tests {
|
||||||
}));
|
}));
|
||||||
assert!(summary.control_lane_notes.iter().any(|line| {
|
assert!(summary.control_lane_notes.iter().any(|line| {
|
||||||
line.contains(
|
line.contains(
|
||||||
"records with grouped opcodes already in the 0x00431b20 mutation strip = [0]",
|
"records with grouped opcodes already in the 0x00431b20 dispatch strip = [0]",
|
||||||
)
|
)
|
||||||
}));
|
}));
|
||||||
assert!(summary.control_lane_notes.iter().any(|line| {
|
assert!(summary.control_lane_notes.iter().any(|line| {
|
||||||
line.contains("0x00431b20 mutation-strip opcodes present in decoded grouped rows = [4]")
|
line.contains("0x00431b20 dispatch-strip opcodes present in decoded grouped rows = [4]")
|
||||||
|
}));
|
||||||
|
assert!(summary.control_lane_notes.iter().any(|line| {
|
||||||
|
line.contains(
|
||||||
|
"decoded grouped descriptor labels present in the 0x00431b20 dispatch strip = [\"Company Variable 1\"]",
|
||||||
|
)
|
||||||
}));
|
}));
|
||||||
let record = summary
|
let record = summary
|
||||||
.records
|
.records
|
||||||
|
|
|
||||||
|
|
@ -254,9 +254,17 @@ Working rule:
|
||||||
non-row-body control lane rather than the compact row framing itself
|
non-row-body control lane rather than the compact row framing itself
|
||||||
- the same probe now narrows the candidate runtime-effect set too:
|
- the same probe now narrows the candidate runtime-effect set too:
|
||||||
it reports which decoded records already carry grouped opcodes in the grounded
|
it reports which decoded records already carry grouped opcodes in the grounded
|
||||||
`0x00431b20` mutation strip; real `War Effort.gmp` currently narrows that to record indexes
|
`0x00431b20` dispatch strip; real `War Effort.gmp` currently narrows that to record indexes
|
||||||
`[1, 9, 12, 13, 14, 15, 16, 17, 22]`, all through opcode `4`, so the next pass can focus on
|
`[1, 9, 12, 13, 14, 15, 16, 17, 22]`, all through opcode `4`, with descriptor labels
|
||||||
that smaller subset instead of the full 24-row compact collection
|
`Game Variable 1`, `Company Variable 1..4`, and `Player Variable 1`, so the next pass can
|
||||||
|
focus on that smaller subset instead of the full 24-row compact collection while avoiding the
|
||||||
|
earlier overclaim that opcode `4` alone already proves a placed-structure mutation row
|
||||||
|
- cross-map probing now gives a better static-analysis lead too:
|
||||||
|
`British Isles.gmp` shows no current `0x00431b20` dispatch-strip rows, `Germany.gmp` stays on
|
||||||
|
`Game Variable 1` plus `Company Variable 3..4`, while `Texas Tea.gmp` adds `Economic Status`
|
||||||
|
and one still-unlabeled grouped descriptor id `548`; that makes descriptor `548` plus the
|
||||||
|
`opcode 8` branch on record `7` the next concrete non-hook analysis target above the compact
|
||||||
|
runtime-event loader
|
||||||
- the concrete owner strip above that bundle is grounded now too:
|
- the concrete owner strip above that bundle is grounded now too:
|
||||||
`0x00433060` is the direct non-direct serializer loop that writes `0x4e99/0x4e9a/0x4e9b`,
|
`0x00433060` is the direct non-direct serializer loop that writes `0x4e99/0x4e9a/0x4e9b`,
|
||||||
calls `0x00430d70` per live collection row, and sits beside the sibling `0x00433130` size/load
|
calls `0x00430d70` per live collection row, and sits beside the sibling `0x00433130` size/load
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue