diff --git a/lib/flamegraph/flamegraph.html.erb b/lib/flamegraph/flamegraph.html.erb
index 5555412..78839df 100644
--- a/lib/flamegraph/flamegraph.html.erb
+++ b/lib/flamegraph/flamegraph.html.erb
@@ -89,6 +89,100 @@ var data = null;
var maxX = 0;
var maxY = 0;
+class Node {
+ constructor({id, data}) {
+ this._data = data;
+ this.id = id;
+ }
+
+ get x() {
+ return this._data.x;
+ }
+
+ get y() {
+ return this._data.y;
+ }
+
+ get width() {
+ return this._data.width;
+ }
+
+ get frame() {
+ return this._data.frame;
+ }
+
+ get gem() {
+ var frame = this.frame;
+ var split = frame.split('/gems/');
+ if(split.length == 1) {
+ split = frame.split('/app/');
+ if(split.length == 1) {
+ split = frame.split('/lib/');
+ }
+
+ split = split[Math.max(split.length-2,0)].split('/');
+ return split[split.length-1].split(':')[0];
+ } else {
+ return split[split.length -1].split('/')[0];
+ }
+ }
+
+ get method() {
+ var frame = this.frame;
+ var split = frame.split('`');
+ if(split.length == 2) {
+ var fullMethod = split[1].split("'")[0];
+ split = fullMethod.split("#");
+ if(split.length == 2) {
+ return split[1];
+ }
+ return split[0];
+ }
+ return '?';
+ }
+
+ get file() {
+ var frame = this.frame;
+ var split = frame.split(".rb:");
+ if(split.length == 2) {
+ split = split[0].split('/');
+ return split[split.length - 1];
+ }
+ return "";
+ }
+
+ backtrace(nodes) {
+ for(var i = 0; i < nodes.length; i++){
+ if(this === nodes[i]){ break; }
+ }
+
+ var trace = [this];
+ var depth = this.y;
+
+ while(i > 0){
+ if(depth == -1) break;
+
+ if(nodes[i].y === depth - 1) {
+ trace.push(nodes[i]);
+ depth--;
+ }
+
+ i--;
+ }
+
+ return trace;
+ }
+};
+
+var nodes = [];
+
+for(var i = 0; i < data.length; i++) {
+ var node = new Node({id: i, data: data[i]})
+ nodes.push(node);
+}
+
+data = null;
+
debounce = function(func, wait, trickle) {
var timeout;
@@ -122,51 +216,9 @@ debounce = function(func, wait, trickle) {
};
};
-
-var guessGem = function(frame)
-{
- var split = frame.split('/gems/');
- if(split.length == 1) {
- split = frame.split('/app/');
- if(split.length == 1) {
- split = frame.split('/lib/');
- }
-
- split = split[Math.max(split.length-2,0)].split('/');
- return split[split.length-1].split(':')[0];
- }
- else
- {
- return split[split.length -1].split('/')[0];
- }
-}
-
-var guessMethod = function(frame) {
- var split = frame.split('`');
- if(split.length == 2) {
- var fullMethod = split[1].split("'")[0];
- split = fullMethod.split("#");
- if(split.length == 2) {
- return split[1];
- }
- return split[0];
- }
- return '?';
-}
-
-var guessFile = function(frame) {
- var split = frame.split(".rb:");
- if(split.length == 2) {
- split = split[0].split('/');
- return split[split.length - 1];
- }
- return "";
-}
-
-$.each(data, function(){
+$.each(nodes, function(){
maxX = Math.max(maxX, this.x + this.width);
maxY = Math.max(maxY, this.y);
- this.shortName = guessMethod(this.frame);
});
var width = $(window).width();
@@ -285,25 +337,6 @@ var getGemNodes = function(gem_name) {
};
var backtrace = function(frame){
- for(var i=0; i 0){
- if(depth == -1) break;
-
- if(data[i].y === depth-1) {
- frames.push(data[i]);
- depth--;
- }
-
- i--;
- }
-
- return frames;
}
$('#frameinfo-wrapper').click(function(d){
@@ -321,7 +354,7 @@ var click = function(d){
return;
}
- var trace = backtrace(d);
+ var trace = d.backtrace(nodes);
var link = function(path, dest){
return path.replace(/[^\/]+:\d+/, function(x){ return "" + x + ""})
@@ -401,9 +434,9 @@ var gemStats = {}
var topFrames = {}
var lastFrame = {frame: 'd52e04d-df28-41ed-a215-b6ec840a8ea5', x: -1}
-$.each(data, function(){
+$.each(nodes, function(){
var by_method = location.search.match(/[?&]by_method=1\b/);
- var group = by_method ? guessMethod(this.frame) : guessGem(this.frame);
+ var group = by_method ? this.method : this.gem;
var stat = gemStats[group];
@@ -466,8 +499,8 @@ _.each(gemsSorted, function(stat){
// see: http://bl.ocks.org/mundhradevang/1387786
function fontSize(d,i) {
var size = yScale(1) / 3;
- // var words = d.shortName.split(' ');
- var word = d.shortName; // words[0];
+ // var words = d.method.split(' ');
+ var word = d.method; // words[0];
var width = xScale(d.width+100);
var height = yScale(1);
var length = 0;
@@ -482,7 +515,7 @@ function fontSize(d,i) {
}
svg.selectAll("g")
- .data(data)
+ .data(nodes)
.enter()
.append("g")
.each(function(){