Index: tools/profile.js |
diff --git a/tools/profile.js b/tools/profile.js |
index c9c9437e930d02b6a5cf4b8be64e1ca268e4a47a..10a07f8246a5b0da30b006d36be734f3ee40ffa0 100644 |
--- a/tools/profile.js |
+++ b/tools/profile.js |
@@ -162,8 +162,16 @@ Profile.prototype.addFuncCode = function( |
// Function object has been overwritten with a new one. |
func.name = name; |
} |
- var entry = new Profile.DynamicFuncCodeEntry(size, type, func, state); |
- this.codeMap_.addCode(start, entry); |
+ var entry = this.codeMap_.findDynamicEntryByStartAddress(start); |
+ if (entry) { |
+ if (entry.size === size && entry.func === func) { |
+ // Entry state has changed. |
+ entry.state = state; |
+ } |
+ } else { |
+ entry = new Profile.DynamicFuncCodeEntry(size, type, func, state); |
+ this.codeMap_.addCode(start, entry); |
+ } |
return entry; |
}; |
@@ -374,6 +382,31 @@ Profile.prototype.getFlatProfile = function(opt_label) { |
/** |
+ * Cleans up function entries that are not referenced by code entries. |
+ */ |
+Profile.prototype.cleanUpFuncEntries = function() { |
+ var referencedFuncEntries = []; |
+ var entries = this.codeMap_.getAllDynamicEntriesWithAddresses(); |
+ for (var i = 0, l = entries.length; i < l; ++i) { |
+ if (entries[i][1].constructor === Profile.FunctionEntry) { |
+ entries[i][1].used = false; |
+ } |
+ } |
+ for (var i = 0, l = entries.length; i < l; ++i) { |
+ if ("func" in entries[i][1]) { |
+ entries[i][1].func.used = true; |
+ } |
+ } |
+ for (var i = 0, l = entries.length; i < l; ++i) { |
+ if (entries[i][1].constructor === Profile.FunctionEntry && |
+ !entries[i][1].used) { |
+ this.codeMap_.deleteCode(entries[i][0]); |
+ } |
+ } |
+}; |
+ |
+ |
+/** |
* Creates a dynamic code entry. |
* |
* @param {number} size Code size. |
@@ -408,6 +441,11 @@ Profile.DynamicCodeEntry.prototype.isJSFunction = function() { |
}; |
+Profile.DynamicCodeEntry.prototype.toString = function() { |
+ return this.getName() + ': ' + this.size.toString(16); |
+}; |
+ |
+ |
/** |
* Creates a dynamic code entry. |
* |
@@ -448,6 +486,11 @@ Profile.DynamicFuncCodeEntry.prototype.isJSFunction = function() { |
}; |
+Profile.DynamicFuncCodeEntry.prototype.toString = function() { |
+ return this.getName() + ': ' + this.size.toString(16); |
+}; |
+ |
+ |
/** |
* Creates a shared function object entry. |
* |
@@ -473,6 +516,7 @@ Profile.FunctionEntry.prototype.getName = function() { |
return name; |
}; |
+Profile.FunctionEntry.prototype.toString = CodeMap.CodeEntry.prototype.toString; |
/** |
* Constructs a call graph. |