Skip to content

Commit 9d80001

Browse files
committed
add test stub for data_renderer
1 parent f09dd6a commit 9d80001

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed

rust/tests/data_renderer.rs

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
use std::path::PathBuf;
2+
3+
use binaryninja::binary_view::BinaryView;
4+
use binaryninja::data_renderer::{
5+
register_specific_data_renderer, CustomDataRenderer, TypeContext,
6+
};
7+
use binaryninja::disassembly::{
8+
DisassemblyTextLine, InstructionTextToken, InstructionTextTokenKind,
9+
};
10+
use binaryninja::types::Type;
11+
12+
#[test]
13+
fn test_data_renderer_basic() {
14+
struct StructRenderer {}
15+
impl CustomDataRenderer for StructRenderer {
16+
fn is_valid_for_data(
17+
&self,
18+
_view: &BinaryView,
19+
_addr: u64,
20+
type_: &Type,
21+
_types: &[TypeContext],
22+
) -> bool {
23+
type_.get_structure().is_some()
24+
}
25+
26+
fn lines_for_data(
27+
&self,
28+
_view: &BinaryView,
29+
addr: u64,
30+
type_: &Type,
31+
_prefix: &InstructionTextToken,
32+
_prefix_count: usize,
33+
width: usize,
34+
_types_ctx: &[TypeContext],
35+
_language: &str,
36+
) -> Vec<DisassemblyTextLine> {
37+
let name = type_.registered_name().map(|name| name.name().to_string());
38+
let Some(type_) = type_.get_structure() else {
39+
unreachable!();
40+
};
41+
42+
let mut output = vec![
43+
DisassemblyTextLine::new(vec![InstructionTextToken::new(
44+
format!(
45+
"Struct{}{} width {} or {width} {addr}",
46+
name.as_ref().map(|_| " ").unwrap_or(""),
47+
name.as_ref().map(String::as_str).unwrap_or(""),
48+
type_.width()
49+
),
50+
InstructionTextTokenKind::Comment { target: addr },
51+
)]),
52+
DisassemblyTextLine::new(vec![InstructionTextToken::new(
53+
"{",
54+
InstructionTextTokenKind::Text,
55+
)]),
56+
];
57+
let members = type_.members();
58+
let offset_size =
59+
usize::try_from(members.last().map(|last| last.offset.ilog(16)).unwrap_or(0) + 3)
60+
.unwrap();
61+
for member in members {
62+
let line = [
63+
InstructionTextToken::new(
64+
format!("{:#0width$x}", member.offset, width = offset_size),
65+
InstructionTextTokenKind::StructOffset {
66+
offset: member.offset,
67+
type_names: vec![member.name.clone()],
68+
},
69+
),
70+
InstructionTextToken::new("|", InstructionTextTokenKind::Text),
71+
InstructionTextToken::new(
72+
member.name.clone(),
73+
InstructionTextTokenKind::FieldName {
74+
offset: member.offset,
75+
type_names: vec![member.name.clone()],
76+
},
77+
),
78+
InstructionTextToken::new(",", InstructionTextTokenKind::Text),
79+
];
80+
output.push(DisassemblyTextLine::new(line.to_vec()));
81+
}
82+
output.push(DisassemblyTextLine::new(vec![InstructionTextToken::new(
83+
"}",
84+
InstructionTextTokenKind::Text,
85+
)]));
86+
output
87+
}
88+
}
89+
90+
let _renderer = register_specific_data_renderer(StructRenderer {});
91+
// TODO render a Type
92+
}

0 commit comments

Comments
 (0)