Index: tools/turbolizer/disassembly-view.js |
diff --git a/tools/turbolizer/disassembly-view.js b/tools/turbolizer/disassembly-view.js |
index 94150ec417908275045f203a61986a07c1bd8bd7..e74468416e6bf35641f24a4a8b0ed66d498c50e6 100644 |
--- a/tools/turbolizer/disassembly-view.js |
+++ b/tools/turbolizer/disassembly-view.js |
@@ -8,6 +8,7 @@ class DisassemblyView extends TextView { |
constructor(id, broker, sortedPositionList) { |
super(id, broker, null, false); |
this.pos_start = -1; |
+ this.pos_lines = null; |
let view = this; |
let ADDRESS_STYLE = { |
css: 'tag', |
@@ -45,9 +46,38 @@ class DisassemblyView extends TextView { |
}; |
} |
}; |
+ const BLOCK_HEADER_STYLE = { |
+ css: 'com', |
+ block_id: -1, |
+ location: function(text) { |
+ let matches = /\d+/.exec(text); |
+ if (!matches) return undefined; |
+ BLOCK_HEADER_STYLE.block_id = Number(matches[0]); |
+ return { |
+ block_id: BLOCK_HEADER_STYLE.block_id |
+ }; |
+ }, |
+ }; |
+ const SOURCE_POSITION_HEADER_STYLE = { |
+ css: 'com', |
+ location: function(text) { |
+ let matches = /(\d+):(\d+)/.exec(text); |
+ if (!matches) return undefined; |
+ let li = Number(matches[1]); |
+ if (view.pos_lines === null) return undefined; |
+ let pos = view.pos_lines[li-1] + Number(matches[2]); |
+ return { |
+ pos_start: pos, |
+ pos_end: pos + 1 |
+ }; |
+ }, |
+ }; |
+ view.SOURCE_POSITION_HEADER_REGEX = /^(\s*-- .+:)(\d+:\d+)( --)/; |
let patterns = [ |
[ |
[/^0x[0-9a-f]{8,16}/, ADDRESS_STYLE, 1], |
+ [view.SOURCE_POSITION_HEADER_REGEX, SOURCE_POSITION_HEADER_STYLE, -1], |
+ [/^\s+-- B\d+ start.*/, BLOCK_HEADER_STYLE, -1], |
[/^.*/, UNCLASSIFIED_STYLE, -1] |
], |
[ |
@@ -90,11 +120,20 @@ class DisassemblyView extends TextView { |
let fragment = li.children[i]; |
let location = fragment.location; |
if (location != null) { |
+ if (location.block_id != undefined) { |
+ if (result === undefined) result = {}; |
+ result.block_id = location.block_id; |
+ } |
if (location.address != undefined) { |
if (result === undefined) result = {}; |
result.address = location.address; |
} |
- if (view.pos_start != -1) { |
+ if (location.pos_start != undefined && location.pos_end != undefined) { |
+ if (result === undefined) result = {}; |
+ result.pos_start = location.pos_start; |
+ result.pos_end = location.pos_end; |
+ } |
+ else if (view.pos_start != -1) { |
if (result === undefined) result = {}; |
result.pos_start = view.pos_start; |
result.pos_end = result.pos_start + 1; |
@@ -103,4 +142,38 @@ class DisassemblyView extends TextView { |
} |
return result; |
} |
+ |
+ initializeCode(sourceText, sourcePosition) { |
+ let view = this; |
+ view.pos_lines = new Array(); |
+ // Comment lines for line 0 include sourcePosition already, only need to |
+ // add sourcePosition for lines > 0. |
+ view.pos_lines[0] = sourcePosition; |
+ if (sourceText != "") { |
+ let base = sourcePosition; |
+ let current = 0; |
+ let source_lines = sourceText.split("\n"); |
+ for (i=1; i < source_lines.length; i++) { |
+ // Add 1 for newline character that is split off. |
+ current += source_lines[i-1].length + 1; |
+ view.pos_lines[i] = base + current; |
+ } |
+ } |
+ } |
+ |
+ processLine(line) { |
+ let view = this; |
+ let func = function(match, p1, p2, p3) { |
+ let nums = p2.split(":"); |
+ let li = Number(nums[0]); |
+ let pos = Number(nums[1]); |
+ if(li === 0) |
+ pos -= view.pos_lines[0]; |
+ li++; |
+ return p1 + li + ":" + pos + p3; |
+ }; |
+ line = line.replace(view.SOURCE_POSITION_HEADER_REGEX, func); |
+ let fragments = super.processLine(line); |
+ return fragments; |
+ } |
} |