Skip to content

Commit 9a320d3

Browse files
CouleeAppsemesare
authored andcommitted
Unify higher level api abstraction across py/cpp
1 parent 8870d01 commit 9a320d3

File tree

2 files changed

+129
-96
lines changed

2 files changed

+129
-96
lines changed

python/renderlayer.py

Lines changed: 61 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -325,50 +325,73 @@ def apply_to_linear_view_object(
325325
block_lines = []
326326
final_lines = []
327327
last_block = None
328+
329+
def finish_block():
330+
nonlocal block_lines
331+
nonlocal final_lines
332+
if len(block_lines) > 0:
333+
if last_block is not None:
334+
# Convert linear lines to disassembly lines for the apply()
335+
# and then convert back for linear view
336+
new_block_lines = []
337+
disasm_lines = []
338+
misc_lines = []
339+
340+
def process_disasm():
341+
nonlocal disasm_lines
342+
343+
if len(disasm_lines) > 0:
344+
self.apply_to_block(last_block, disasm_lines)
345+
func = block_lines[0].function
346+
block = block_lines[0].block
347+
for block_line in disasm_lines:
348+
new_block_lines.append(
349+
LinearDisassemblyLine(
350+
LinearDisassemblyLineType.CodeDisassemblyLineType,
351+
func,
352+
block,
353+
block_line
354+
)
355+
)
356+
disasm_lines = []
357+
358+
def process_misc():
359+
nonlocal misc_lines
360+
nonlocal new_block_lines
361+
362+
if len(misc_lines) > 0:
363+
self.apply_to_misc_linear_lines(obj, prev, next, misc_lines)
364+
new_block_lines += misc_lines
365+
misc_lines = []
366+
367+
for block_line in block_lines:
368+
# Lines in the block get sent to process_disasm, anything else goes
369+
# to process_misc so we preserve line information
370+
if block_line.type == LinearDisassemblyLineType.CodeDisassemblyLineType:
371+
process_misc()
372+
disasm_lines.append(block_line.contents)
373+
else:
374+
process_disasm()
375+
misc_lines.append(block_line)
376+
377+
# At the end, zero or one of these has lines in it
378+
process_misc()
379+
process_disasm()
380+
block_lines = new_block_lines
381+
else:
382+
self.apply_to_misc_linear_lines(obj, prev, next, block_lines)
383+
final_lines += block_lines
384+
block_lines = []
385+
328386
for line in lines:
329387
# Assume we've finished a block when the line's block changes
330388
if line.block != last_block:
331-
if len(block_lines) > 0:
332-
if last_block is not None:
333-
# Convert linear lines to disassembly lines for the apply()
334-
# and then convert back for linear view
335-
disasm_lines = [block_line.contents for block_line in block_lines]
336-
disasm_map = {id(block_line.contents): block_line for block_line in block_lines}
337-
self.apply_to_block(last_block, disasm_lines)
338-
block_lines = [
339-
LinearDisassemblyLine(
340-
disasm_map[id(contents)].type if id(contents) in disasm_map else LinearDisassemblyLineType.CodeDisassemblyLineType,
341-
block_lines[0].function,
342-
block_lines[0].block,
343-
contents
344-
) for contents in disasm_lines
345-
]
346-
else:
347-
self.apply_to_misc_linear_lines(obj, prev, next, block_lines)
348-
last_block = line.block
349-
final_lines += block_lines
350-
block_lines = []
389+
finish_block()
351390
block_lines.append(line)
391+
last_block = line.block
352392

353393
# And we've finished a block when we're done with every line
354-
if len(block_lines) > 0:
355-
if last_block is not None:
356-
# Convert linear lines to disassembly lines for the apply()
357-
# and then convert back for linear view
358-
disasm_lines = [line.contents for line in block_lines]
359-
disasm_map = {id(line.contents): line for line in block_lines}
360-
self.apply_to_block(last_block, disasm_lines)
361-
block_lines = [
362-
LinearDisassemblyLine(
363-
disasm_map[id(contents)].type if id(contents) in disasm_map else LinearDisassemblyLineType.CodeDisassemblyLineType,
364-
block_lines[0].function,
365-
block_lines[0].block,
366-
contents
367-
) for contents in disasm_lines
368-
]
369-
else:
370-
self.apply_to_misc_linear_lines(obj, prev, next, block_lines)
371-
final_lines += block_lines
394+
finish_block()
372395
return final_lines
373396

374397

renderlayer.cpp

Lines changed: 68 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -174,82 +174,92 @@ void RenderLayer::ApplyToLinearViewObject(
174174
std::vector<LinearDisassemblyLine> finalLines;
175175
Ref<BasicBlock> lastBlock;
176176

177-
for (auto& line: lines)
177+
auto finishBlock = [&]()
178178
{
179-
// Assume we've finished a block when the line's block changes
180-
if (line.block != lastBlock)
179+
if (!blockLines.empty())
181180
{
182-
if (!blockLines.empty())
181+
if (lastBlock)
183182
{
184-
if (lastBlock)
183+
// Convert linear lines to disassembly lines for the apply()
184+
// and then convert back for linear view
185+
std::vector<LinearDisassemblyLine> newBlockLines;
186+
std::vector<DisassemblyTextLine> disasmLines;
187+
std::vector<LinearDisassemblyLine> miscLines;
188+
189+
auto processDisasm = [&]()
185190
{
186-
// Convert linear lines to disassembly lines for the apply()
187-
// and then convert back for linear view
188-
std::vector<DisassemblyTextLine> disasmLines;
189-
for (auto& blockLine: blockLines)
191+
if (!disasmLines.empty())
190192
{
191-
disasmLines.push_back(blockLine.contents);
193+
ApplyToBlock(lastBlock, disasmLines);
194+
Ref<Function> func = blockLines[0].function;
195+
Ref<BasicBlock> block = blockLines[0].block;
196+
for (auto& blockLine: disasmLines)
197+
{
198+
LinearDisassemblyLine newLine;
199+
newLine.type = CodeDisassemblyLineType;
200+
newLine.function = func;
201+
newLine.block = block;
202+
newLine.contents = blockLine;
203+
newBlockLines.push_back(newLine);
204+
}
205+
disasmLines.clear();
192206
}
193-
ApplyToBlock(lastBlock, disasmLines);
207+
};
194208

195-
Ref<BasicBlock> block = blockLines[0].block;
196-
Ref<Function> func = blockLines[0].function;
197-
blockLines.clear();
198-
for (auto& blockLine: disasmLines)
209+
auto processMisc = [&]()
210+
{
211+
if (!miscLines.empty())
199212
{
200-
LinearDisassemblyLine newLine;
201-
// todo: losing this information (might not matter)
202-
newLine.type = CodeDisassemblyLineType;
203-
newLine.block = block;
204-
newLine.function = func;
205-
newLine.contents = blockLine;
206-
blockLines.push_back(newLine);
213+
ApplyToMiscLinearLines(obj, prev, next, miscLines);
214+
std::move(
215+
miscLines.begin(),
216+
miscLines.end(),
217+
std::back_inserter(newBlockLines)
218+
);
219+
miscLines.clear();
207220
}
208-
}
209-
else
221+
};
222+
223+
for (auto& blockLine: blockLines)
210224
{
211-
ApplyToMiscLinearLines(obj, prev, next, blockLines);
225+
// Lines in the block get sent to processDisasm, anything else goes
226+
// to processMisc so we preserve line information
227+
if (blockLine.type == CodeDisassemblyLineType)
228+
{
229+
processMisc();
230+
disasmLines.push_back(blockLine.contents);
231+
}
232+
else
233+
{
234+
processDisasm();
235+
miscLines.push_back(blockLine);
236+
}
212237
}
238+
// At the end, zero or one of these has lines in it
239+
processMisc();
240+
processDisasm();
241+
blockLines = newBlockLines;
213242
}
214-
lastBlock = line.block;
215-
std::move(blockLines.begin(), blockLines.end(), std::back_inserter(finalLines));
216-
}
217-
blockLines.push_back(line);
218-
}
219-
// And we've finished a block when we're done with every line
220-
if (!blockLines.empty())
221-
{
222-
if (lastBlock)
223-
{
224-
// Convert linear lines to disassembly lines for the apply()
225-
// and then convert back for linear view
226-
std::vector<DisassemblyTextLine> disasmLines;
227-
for (auto& blockLine: blockLines)
228-
{
229-
disasmLines.push_back(blockLine.contents);
230-
}
231-
ApplyToBlock(lastBlock, disasmLines);
232-
233-
Ref<BasicBlock> block = blockLines[0].block;
234-
Ref<Function> func = blockLines[0].function;
235-
blockLines.clear();
236-
for (auto& blockLine: disasmLines)
243+
else
237244
{
238-
LinearDisassemblyLine newLine;
239-
// todo: losing this information (might not matter)
240-
newLine.type = CodeDisassemblyLineType;
241-
newLine.block = block;
242-
newLine.function = func;
243-
newLine.contents = blockLine;
244-
blockLines.push_back(newLine);
245+
ApplyToMiscLinearLines(obj, prev, next, blockLines);
245246
}
246247
}
247-
else
248+
std::move(blockLines.begin(), blockLines.end(), std::back_inserter(finalLines));
249+
};
250+
251+
for (auto& line: lines)
252+
{
253+
// Assume we've finished a block when the line's block changes
254+
if (line.block != lastBlock)
248255
{
249-
ApplyToMiscLinearLines(obj, prev, next, blockLines);
256+
finishBlock();
250257
}
258+
blockLines.push_back(line);
259+
lastBlock = line.block;
251260
}
252-
std::move(blockLines.begin(), blockLines.end(), std::back_inserter(finalLines));
261+
// And we've finished a block when we're done with every line
262+
finishBlock();
253263

254264
lines = finalLines;
255265
}

0 commit comments

Comments
 (0)