blob: a3cf7a54c9d8c06fe5d4f9e1e56b4a4d90fb8f83 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* LogGroupEntry is a wrapper around log entries, which makes it easier to
* find the corresponding start/end of events.
*
* This is used internally by the log and timeline views to pretty print
* collections of log entries.
*
* @fileoverview
*/
// TODO(eroman): document these methods!
function LogGroupEntry(origEntry, index) {
this.orig = origEntry;
this.index = index;
}
LogGroupEntry.prototype.isBegin = function() {
return this.orig.type == LogEntryType.TYPE_EVENT &&
this.orig.event.phase == LogEventPhase.PHASE_BEGIN;
};
LogGroupEntry.prototype.isEnd = function() {
return this.orig.type == LogEntryType.TYPE_EVENT &&
this.orig.event.phase == LogEventPhase.PHASE_END
};
LogGroupEntry.prototype.getDepth = function() {
var depth = 0;
var p = this.parentEntry;
while (p) {
depth += 1;
p = p.parentEntry;
}
return depth;
};
function findParentIndex(parentStack, eventType) {
for (var i = parentStack.length - 1; i >= 0; --i) {
if (parentStack[i].orig.event.type == eventType)
return i;
}
return -1;
}
/**
* Returns a list of LogGroupEntrys. This basically wraps the original log
* entry, but makes it easier to find the start/end of the event.
*/
LogGroupEntry.createArrayFrom = function(origEntries) {
var groupedEntries = [];
// Stack of enclosing PHASE_BEGIN elements.
var parentStack = [];
for (var i = 0; i < origEntries.length; ++i) {
var origEntry = origEntries[i];
var groupEntry = new LogGroupEntry(origEntry, i);
groupedEntries.push(groupEntry);
// If this is the end of an event, match it to the start.
if (groupEntry.isEnd()) {
// Walk up the parent stack to find the corresponding BEGIN for this END.
var parentIndex =
findParentIndex(parentStack, groupEntry.orig.event.type);
if (parentIndex == -1) {
// Unmatched end.
} else {
groupEntry.begin = parentStack[parentIndex];
// Consider this as the terminator for all open BEGINs up until
// parentIndex.
for (var j = 0; j < parentStack.length - parentIndex; ++j) {
var p = parentStack.pop();
p.end = groupEntry;
}
}
}
// Inherit the current parent.
if (parentStack.length > 0)
groupEntry.parentEntry = parentStack[parentStack.length - 1];
if (groupEntry.isBegin())
parentStack.push(groupEntry);
}
return groupedEntries;
}
|