summaryrefslogtreecommitdiff
path: root/architecture.cpp
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2019-07-23 21:52:04 -0400
committerRusty Wagner <rusty@vector35.com>2019-07-23 22:22:19 -0400
commit4538fd8e7dfa4259fc3e460c54a6ccb13ca71349 (patch)
treee3b5ee0a83db003b5176f6e4695d542d7ee479b8 /architecture.cpp
parentb9d1130f3c5eb018b50e3b3aeb5993e75001df29 (diff)
Add API to process tokens for integer display types, comments, etc.
Diffstat (limited to 'architecture.cpp')
-rw-r--r--architecture.cpp53
1 files changed, 49 insertions, 4 deletions
diff --git a/architecture.cpp b/architecture.cpp
index 5ce21e99..ae665e08 100644
--- a/architecture.cpp
+++ b/architecture.cpp
@@ -2252,17 +2252,62 @@ void DisassemblyTextRenderer::GetInstructionAnnotations(vector<InstructionTextTo
bool DisassemblyTextRenderer::GetInstructionText(uint64_t addr, size_t& len,
- vector<InstructionTextToken>& tokens, uint64_t& displayAddr)
+ vector<DisassemblyTextLine>& lines)
{
- BNInstructionTextToken* outTokens = nullptr;
+ BNDisassemblyTextLine* result = nullptr;
size_t count = 0;
- if (!BNGetDisassemblyTextRendererInstructionText(m_object, addr, &len, &outTokens, &count, &displayAddr))
+ if (!BNGetDisassemblyTextRendererInstructionText(m_object, addr, &len, &result, &count))
return false;
- tokens = InstructionTextToken::ConvertAndFreeInstructionTextTokenList(outTokens, count);
+
+ for (size_t i = 0; i < count; i++)
+ {
+ DisassemblyTextLine line;
+ line.addr = result[i].addr;
+ line.instrIndex = result[i].instrIndex;
+ line.highlight = result[i].highlight;
+ line.tokens = InstructionTextToken::ConvertAndFreeInstructionTextTokenList(result[i].tokens, result[i].count);
+ lines.push_back(line);
+ }
+
+ BNFreeDisassemblyTextLines(result, count);
return true;
}
+vector<DisassemblyTextLine> DisassemblyTextRenderer::PostProcessInstructionTextLines(uint64_t addr,
+ size_t len, const vector<DisassemblyTextLine>& lines)
+{
+ BNDisassemblyTextLine* inLines = new BNDisassemblyTextLine[lines.size()];
+ for (size_t i = 0; i < lines.size(); i++)
+ {
+ inLines[i].addr = lines[i].addr;
+ inLines[i].instrIndex = lines[i].instrIndex;
+ inLines[i].highlight = lines[i].highlight;
+ inLines[i].tokens = InstructionTextToken::CreateInstructionTextTokenList(lines[i].tokens);
+ inLines[i].count = lines[i].tokens.size();
+ }
+
+ BNDisassemblyTextLine* result = nullptr;
+ size_t count = 0;
+ result = BNPostProcessDisassemblyTextRendererLines(m_object, addr, len, inLines, lines.size(), &count);
+ BNFreeDisassemblyTextLines(inLines, lines.size());
+
+ vector<DisassemblyTextLine> outLines;
+ for (size_t i = 0; i < count; i++)
+ {
+ DisassemblyTextLine line;
+ line.addr = result[i].addr;
+ line.instrIndex = result[i].instrIndex;
+ line.highlight = result[i].highlight;
+ line.tokens = InstructionTextToken::ConvertAndFreeInstructionTextTokenList(result[i].tokens, result[i].count);
+ outLines.push_back(line);
+ }
+
+ BNFreeDisassemblyTextLines(result, count);
+ return outLines;
+}
+
+
bool DisassemblyTextRenderer::GetDisassemblyText(uint64_t addr, size_t& len, vector<DisassemblyTextLine>& lines)
{
BNDisassemblyTextLine* result = nullptr;