Commit 7f162dbc authored by Alexander.Gilday2's avatar Alexander.Gilday2 Committed by Commit bot

[turbolizer] Improve code comments in disassembly

This change analyzes and links the output of --code-comments in the disassembly view within turbolizer with the other views, such that selecting these comments will also select the respective blocks/lines/nodes within the other views. The block start comments (e.g. -- B4 start --) are linked with the blocks in the schedule phase view and vice versa. The source position comments (e.g. -- primes.js:3:10 --) select the respective spans, lines, and nodes in the JavaScript code view, the schedule phase view, and the other compilation phase views respectively, and vice versa. It also modifies the display of the line and column numbers in the source position comments to be offset from 1 instead of 0 and ignore the initial source position of the first line of code (from removal of the function name in the compiler).

Also fixed the bug where previous selections weren't being cleared properly across multiple views, adding appropriate clear calls when using the selection broker.

Review-Url: https://codereview.chromium.org/2133663002
Cr-Commit-Position: refs/heads/master@{#37627}
parent 4af2bb9e
......@@ -30,6 +30,7 @@ var CodeView = function(divID, PR, sourceText, sourcePosition, broker) {
for (var span of items) {
ranges.push([span.start, span.end, null]);
}
broker.clear(selectionHandler);
broker.select(selectionHandler, ranges, selected);
},
selectionDifference: function(span1, inclusive1, span2, inclusive2) {
......
......@@ -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;
}
}
......@@ -28,6 +28,7 @@ class TextView extends View {
i.classList.remove("selected");
}
}
broker.clear(selectionHandler);
broker.select(selectionHandler, view.getRanges(items), selected);
},
selectionDifference: function(span1, inclusive1, span2, inclusive2) {
......@@ -68,7 +69,8 @@ class TextView extends View {
for (let range of ranges) {
let start = range[0];
let end = range[1];
let location = { pos_start: start, pos_end: end };
let block_id = range[3];
let location = { pos_start: start, pos_end: end, block_id: block_id };
if (range[2] !== null && range[2] != -1) {
location.node_id = range[2];
if (range[0] == -1 && range[1] == -1) {
......@@ -185,9 +187,13 @@ class TextView extends View {
let start = -1;
let end = -1;
let node_id = -1;
let block_id = -1;
if (location.node_id !== undefined) {
node_id = location.node_id;
}
if (location.block_id !== undefined) {
block_id = location.block_id;
}
if (location.pos_start !== undefined) {
start = location.pos_start;
end = location.pos_end;
......@@ -200,8 +206,9 @@ class TextView extends View {
if (lastObject == null ||
(lastObject[2] != node_id ||
lastObject[0] != start ||
lastObject[1] != end)) {
lastObject = [start, end, node_id];
lastObject[1] != end ||
lastObject[3] != block_id)) {
lastObject = [start, end, node_id, block_id];
result.push(lastObject);
}
}
......
......@@ -157,6 +157,7 @@ document.onload = (function(d3){
jsonObj = JSON.parse(txtRes);
sourceView.initializeCode(jsonObj.source, jsonObj.sourcePosition);
disassemblyView.initializeCode(jsonObj.source, jsonObj.sourcePosition);
schedule.setNodePositionMap(jsonObj.nodePositions);
var selectMenu = document.getElementById('display-selector');
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment