diff options
| author | Rusty Wagner <rusty@vector35.com> | 2019-07-23 21:52:04 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2019-07-23 22:22:19 -0400 |
| commit | 4538fd8e7dfa4259fc3e460c54a6ccb13ca71349 (patch) | |
| tree | e3b5ee0a83db003b5176f6e4695d542d7ee479b8 /architecture.cpp | |
| parent | b9d1130f3c5eb018b50e3b3aeb5993e75001df29 (diff) | |
Add API to process tokens for integer display types, comments, etc.
Diffstat (limited to 'architecture.cpp')
| -rw-r--r-- | architecture.cpp | 53 |
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; |
