diff options
Diffstat (limited to 'deps/v8/tools/ic-explorer.html')
-rw-r--r-- | deps/v8/tools/ic-explorer.html | 624 |
1 files changed, 326 insertions, 298 deletions
diff --git a/deps/v8/tools/ic-explorer.html b/deps/v8/tools/ic-explorer.html index 43b486a50c..42bbc20396 100644 --- a/deps/v8/tools/ic-explorer.html +++ b/deps/v8/tools/ic-explorer.html @@ -1,338 +1,366 @@ <html> - <head> -<style> - .entry-details { - } - .entry-details TD { - } - .details { - width: 2em; - border: 1px black dotted; - } - .count { - text-align: right; - width: 5em; - font-family: monospace; - } - .percentage { - text-align: right; - width: 5em; - font-family: monospace; - } - .key { - padding-left: 1em; - } - .drilldown-group-title { - font-weight: bold; - padding: 0.5em 0 0.2em 0; - } -</style> - <script> -"use strict" -var entries = []; +<!-- +Copyright 2016 the V8 project authors. All rights reserved. Use of this source +code is governed by a BSD-style license that can be found in the LICENSE file. +--> -class Entry { - constructor(id, line) { - this.id = id; - this.line = line; - var parts = line.split(" "); - if (parts.length < 6) return - this.isValid = false; - if (parts[0][0] !== "[") return; - if (parts[1] === "patching") return; - this.type = parts[0].substr(1); - this.category = "Other"; - if (this.type.indexOf("Store") !== -1) { - this.category = "Store"; - } else if (this.type.indexOf("Load") !== -1) { - this.category = "Load"; +<head> + <style> + .entry-details {} + + .entry-details TD {} + + .details { + width: 2em; + border: 1px black dotted; + } + + .count { + text-align: right; + width: 5em; + font-family: monospace; + } + + .percentage { + text-align: right; + width: 5em; + font-family: monospace; + } + + .key { + padding-left: 1em; } - if (this.type.length == 0) return; - if (this.type.indexOf('BinaryOpIC(') === 0) { - this.type = "BinaryOpIC"; - var split = parts[0].split('('); - this.state = "(" + split[1] + " => " + parts[2]; - var offset = this.parsePositionAndFile(parts, 6); - if (offset == -1) return - if (this.file === undefined) return - this.file = this.file.slice(0,-1); - } else { - var offset = this.parsePositionAndFile(parts, 2); - if (offset == -1) return - this.state = parts[++offset]; - if (this.type !== "CompareIC") { - // if there is no address we have a smi key - var address = parts[++offset]; - if (address !== undefined && address.indexOf("0x") === 0) { - this.key = parts.slice(++offset).join(" "); + + .drilldown-group-title { + font-weight: bold; + padding: 0.5em 0 0.2em 0; + } + </style> + <script> + "use strict" + var entries = []; + + class Entry { + constructor(id, line) { + this.id = id; + this.line = line; + var parts = line.split(" "); + if (parts.length < 6) return + this.isValid = false; + if (parts[0][0] !== "[") return; + if (parts[1] === "patching") return; + this.type = parts[0].substr(1); + this.category = "Other"; + this.map = undefined; + if (this.type.indexOf("Store") !== -1) { + this.category = "Store"; + } else if (this.type.indexOf("Load") !== -1) { + this.category = "Load"; + } + if (this.type.length == 0) return; + if (this.type.indexOf('BinaryOpIC(') === 0) { + this.type = "BinaryOpIC"; + var split = parts[0].split('('); + this.state = "(" + split[1] + " => " + parts[2]; + var offset = this.parsePositionAndFile(parts, 6); + if (offset == -1) return + if (this.file === undefined) return + this.file = this.file.slice(0, -1); } else { - this.key = address; + var offset = this.parsePositionAndFile(parts, 2); + if (offset == -1) return + this.state = parts[++offset]; + this.map = parts[offset + 1]; + if (this.map !== undefined && this.map.startsWith("map=")) { + this.map = this.map.substring(4); + offset++; + } else { + this.map = undefined; + } + if (this.type !== "CompareIC") { + // if there is no address we have a smi key + var address = parts[++offset]; + if (address !== undefined && address.indexOf("0x") === 0) { + this.key = parts.slice(++offset).join(" "); + } else { + this.key = address; + } + } } + this.filePosition = this.file + " " + this.position; + if (this.key) { + var isStringKey = false + if (this.key.indexOf("<String[") === 0) { + isStringKey = true; + this.key = "\"" + this.key.slice(this.key.indexOf(']') + 3); + } else if (this.key.indexOf("<") === 0) { + this.key = this.key.slice(1); + } + if (this.key.endsWith(">]")) { + this.key = this.key.slice(0, -2); + } else if (this.key.endsWith("]")) { + this.key = this.key.slice(0, -1); + } + if (isStringKey) { + this.key = this.key + "\""; + } + } + this.isValid = true; } - } - this.filePosition = this.file + " " + this.position; - if (this.key) { - var isStringKey = false - if (this.key.indexOf("<String[") === 0) { - isStringKey = true; - this.key = "\"" + this.key.slice(this.key.indexOf(']')+3); - } else if (this.key.indexOf("<") === 0) { - this.key = this.key.slice(1); - } - if (this.key.endsWith(">]")) { - this.key = this.key.slice(0, -2); - } else if (this.key.endsWith("]")) { - this.key = this.key.slice(0, -1); - } - if (isStringKey) { - this.key = this.key + "\""; + + parsePositionAndFile(parts, start) { + // find the position of 'at' in the parts array. + var offset = start; + for (var i = start + 1; i < parts.length; i++) { + offset++; + if (parts[i] == 'at') break; + } + if (parts[offset] !== 'at') return -1; + this.position = parts.slice(start, offset).join(' '); + offset += 1; + this.isNative = parts[offset] == "native" + offset += this.isNative ? 1 : 0; + this.file = parts[offset]; + return offset; } } - this.isValid = true; - } - - parsePositionAndFile(parts, start) { - // find the position of 'at' in the parts array. - var offset = start; - for (var i = start+1; i<parts.length; i++) { - offset++; - if (parts[i] == 'at') break; - } - if (parts[offset] !== 'at') return -1; - this.position = parts.slice(start, offset).join(' '); - offset += 1; - this.isNative = parts[offset] == "native" - offset += this.isNative ? 1 : 0; - this.file = parts[offset]; - return offset; - } -} -function loadFile() { - var files = document.getElementById("uploadInput").files; + function loadFile() { + var files = document.getElementById("uploadInput").files; - var file = files[0]; - var reader = new FileReader(); + var file = files[0]; + var reader = new FileReader(); + + reader.onload = function(evt) { + entries = []; + var end = this.result.length; + var current = 0; + var next = 0; + var line; + var i = 0; + var entry; + while (current < end) { + next = this.result.indexOf("\n", current); + if (next === -1) break; + i++; + line = this.result.substring(current, next); + current = next + 1; + entry = new Entry(i, line); + if (entry.isValid) entries.push(entry); + } - reader.onload = function(evt) { - entries = []; - var end = this.result.length; - var current = 0; - var next = 0; - var line; - var i = 0; - var entry; - while (current < end) { - next = this.result.indexOf("\n", current); - if (next === -1) break; - i++; - - line = this.result.substring(current, next); - current = next+1; - entry = new Entry(i, line); - if (entry.isValid) entries.push(entry); + document.getElementById("count").innerHTML = i; + updateTable(); + } + reader.readAsText(file); + initGroupKeySelect(); } - - document.getElementById("count").innerHTML = i; - updateTable(); - } - reader.readAsText(file); - initGroupKeySelect(); -} -var properties = ['type', 'category', 'file', 'filePosition', 'state' , 'key', 'isNative'] + var properties = ['type', 'category', 'file', 'filePosition', 'state', + 'key', 'isNative', 'map' + ] -class Group { - constructor(property, key, entry) { - this.property = property; - this.key = key; - this.count = 1; - this.entries = [entry]; - this.percentage = undefined; - this.groups = undefined; - } - - add(entry) { - this.count ++; - this.entries.push(entry) - } - - createSubGroups() { - this.groups = {}; - for (var i=0; i<properties.length; i++) { - var subProperty = properties[i]; - if (this.property == subProperty) continue; - this.groups[subProperty] = groupBy(this.entries, subProperty); - } - } -} + class Group { + constructor(property, key, entry) { + this.property = property; + this.key = key; + this.count = 1; + this.entries = [entry]; + this.percentage = undefined; + this.groups = undefined; + } -function groupBy(entries, property) { - var accumulator = {}; - accumulator.__proto__ = null; - var length = entries.length; - for (var i = 0; i < length; i++) { - var entry = entries[i]; - var key = entry[property]; - if (accumulator[key] == undefined) { - accumulator[key] = new Group(property, key, entry) - } else { - var group = accumulator[key]; - if (group.entries == undefined) console.log([group, entry]); - group.add(entry) + add(entry) { + this.count++; + this.entries.push(entry) + } + + createSubGroups() { + this.groups = {}; + for (var i = 0; i < properties.length; i++) { + var subProperty = properties[i]; + if (this.property == subProperty) continue; + this.groups[subProperty] = groupBy(this.entries, subProperty); + } + } } - } - var result = [] - for (var key in accumulator) { - var group = accumulator[key]; - group.percentage = Math.round(group.count / length * 100 * 100) / 100; - result.push(group); - } - result.sort((a,b) => { return b.count - a.count }); - return result; -} + function groupBy(entries, property) { + var accumulator = {}; + accumulator.__proto__ = null; + var length = entries.length; + for (var i = 0; i < length; i++) { + var entry = entries[i]; + var key = entry[property]; + if (accumulator[key] == undefined) { + accumulator[key] = new Group(property, key, entry) + } else { + var group = accumulator[key]; + if (group.entries == undefined) console.log([group, entry]); + group.add(entry) + } + } + var result = [] + for (var key in accumulator) { + var group = accumulator[key]; + group.percentage = Math.round(group.count / length * 100 * 100) / 100; + result.push(group); + } + result.sort((a, b) => { + return b.count - a.count + }); + return result; + } -function updateTable() { - var select = document.getElementById("group-key"); - var key = select.options[select.selectedIndex].text; - console.log(key); - var tableBody = document.getElementById("table-body"); - removeAllChildren(tableBody); - var groups = groupBy(entries, key, true); - display(groups, tableBody); -} + function escapeHtml(unsafe) { + if (!unsafe) return ""; + return unsafe.toString() + .replace(/&/g, "&") + .replace(/</g, "<") + .replace(/>/g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); + } -function selecedOption(node) { - return node.options[node.selectedIndex] -} + function updateTable() { + var select = document.getElementById("group-key"); + var key = select.options[select.selectedIndex].text; + console.log(key); + var tableBody = document.getElementById("table-body"); + removeAllChildren(tableBody); + var groups = groupBy(entries, key, true); + display(groups, tableBody); + } -function removeAllChildren(node) { - while (node.firstChild) { - node.removeChild(node.firstChild); - } -} + function selecedOption(node) { + return node.options[node.selectedIndex] + } -function display(entries, parent) { - var fragment = document.createDocumentFragment(); + function removeAllChildren(node) { + while (node.firstChild) { + node.removeChild(node.firstChild); + } + } - function td(tr, content, className) { - var td = document.createElement("td"); - td.innerHTML = content; - td.className = className - tr.appendChild(td); - return td - } - var max = Math.min(1000, entries.length) - for (var i = 0; i<max; i++) { - var entry = entries[i]; - var tr = document.createElement("tr"); - tr.entry = entry; - td(tr, '<span onclick="toggleDetails(this)">details</a>', 'details'); - td(tr, entry.percentage +"%", 'percentage'); - td(tr, entry.count, 'count'); - td(tr, entry.key, 'key'); - fragment.appendChild(tr); - } - var omitted = entries.length - max; - if (omitted > 0) { - var tr = document.createElement("tr"); - var td = td(tr, 'Omitted ' + omitted + " entries."); - td.colSpan = 4; - fragment.appendChild(tr); - } - parent.appendChild(fragment); -} + function display(entries, parent) { + var fragment = document.createDocumentFragment(); -function displayDrilldown(entry, previousSibling) { - var tr = document.createElement('tr'); - tr.className = "entry-details"; - tr.style.display = "none"; - // indent by one td. - tr.appendChild(document.createElement("td")); - var td = document.createElement("td"); - td.colSpan = 3; - for (var key in entry.groups) { - td.appendChild(displayDrilldownGroup(entry, key)); - } - tr.appendChild(td); - // Append the new TR after previousSibling. - previousSibling.parentNode.insertBefore(tr, previousSibling.nextSibling) -} + function td(tr, content, className) { + var td = document.createElement("td"); + td.innerHTML = content; + td.className = className + tr.appendChild(td); + return td + } + var max = Math.min(1000, entries.length) + for (var i = 0; i < max; i++) { + var entry = entries[i]; + var tr = document.createElement("tr"); + tr.entry = entry; + td(tr, '<span onclick="toggleDetails(this)">details</a>', 'details'); + td(tr, entry.percentage + "%", 'percentage'); + td(tr, entry.count, 'count'); + td(tr, escapeHtml(entry.key), 'key'); + fragment.appendChild(tr); + } + var omitted = entries.length - max; + if (omitted > 0) { + var tr = document.createElement("tr"); + var td = td(tr, 'Omitted ' + omitted + " entries."); + td.colSpan = 4; + fragment.appendChild(tr); + } + parent.appendChild(fragment); + } -function displayDrilldownGroup(entry, key) { - var max = 20; - var group = entry.groups[key]; - var div = document.createElement("div") - div.className = 'drilldown-group-title' - div.innerHTML = key + ' [top ' + max + ']'; - var table = document.createElement("table"); - display(group.slice(0, max), table, false) - div.appendChild(table); - return div; -} + function displayDrilldown(entry, previousSibling) { + var tr = document.createElement('tr'); + tr.className = "entry-details"; + tr.style.display = "none"; + // indent by one td. + tr.appendChild(document.createElement("td")); + var td = document.createElement("td"); + td.colSpan = 3; + for (var key in entry.groups) { + td.appendChild(displayDrilldownGroup(entry, key)); + } + tr.appendChild(td); + // Append the new TR after previousSibling. + previousSibling.parentNode.insertBefore(tr, previousSibling.nextSibling) + } -function toggleDetails(node) { - var tr = node.parentNode.parentNode; - var entry = tr.entry; + function displayDrilldownGroup(entry, key) { + var max = 20; + var group = entry.groups[key]; + var div = document.createElement("div") + div.className = 'drilldown-group-title' + div.innerHTML = key + ' [top ' + max + ' out of ' + group.length + ']'; + var table = document.createElement("table"); + display(group.slice(0, max), table, false) + div.appendChild(table); + return div; + } - // Create subgroup in-place if the don't exist yet. - if (entry.groups === undefined) { - entry.createSubGroups(); - displayDrilldown(entry, tr); - } - var details = tr.nextSibling; - var display = details.style.display; - if (display != "none") { - display = "none"; - }else { - display = "table-row" - }; - details.style.display = display; -} + function toggleDetails(node) { + var tr = node.parentNode.parentNode; + var entry = tr.entry; -function initGroupKeySelect() { - var select = document.getElementById("group-key"); - for (var i in properties) { - var option = document.createElement("option"); - option.text = properties[i]; - select.add(option); - } -} + // Create subgroup in-place if the don't exist yet. + if (entry.groups === undefined) { + entry.createSubGroups(); + displayDrilldown(entry, tr); + } + var details = tr.nextSibling; + var display = details.style.display; + if (display != "none") { + display = "none"; + } else { + display = "table-row" + }; + details.style.display = display; + } + function initGroupKeySelect() { + var select = document.getElementById("group-key"); + for (var i in properties) { + var option = document.createElement("option"); + option.text = properties[i]; + select.add(option); + } + } </script> - </head> - <body> - <h1> +</head> + +<body> + <h1> <span style="color: #00FF00">I</span> <span style="color: #FF00FF">C</span> <span style="color: #00FFFF">E</span> - </h1> - Your IC-Explorer. - <h2>Usage</h2> - Run your script with <code>--trace_ic</code> and upload on this page:<br/> - <code>/path/to/d8 --trace_ic your_script.js > trace.txt</code> - <h2>Data</h2> - <form name="fileForm"> - <p> - <input id="uploadInput" type="file" name="files" onchange="loadFile();" > - trace entries: <span id="count">0</span> - </p> - </form> - <h2>Result</h2> + </h1> Your IC-Explorer. + <h2>Usage</h2> Run your script with <code>--trace_ic</code> and upload on this page:<br/> + <code>/path/to/d8 --trace_ic your_script.js > trace.txt</code> + <h2>Data</h2> + <form name="fileForm"> <p> + <input id="uploadInput" type="file" name="files" onchange="loadFile();"> trace + entries: <span id="count">0</span> + </p> + </form> + <h2>Result</h2> + <p> Group-Key: <select id="group-key" onchange="updateTable()"></select> - </p> - <p> - <table id="table" width="100%"> - <tbody id="table-body"> - </tbody> - </table> - </p> - </body> + </p> + <p> + <table id="table" width="100%"> + <tbody id="table-body"> + </tbody> + </table> + </p> +</body> + </html> |