do not use code deletions
authormikhail.naganov@gmail.com <mikhail.naganov@gmail.com@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Mon, 12 Sep 2011 10:42:15 +0000 (10:42 +0000)
committermikhail.naganov@gmail.com <mikhail.naganov@gmail.com@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Mon, 12 Sep 2011 10:42:15 +0000 (10:42 +0000)
git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@9229 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

tools/codemap.js
tools/profile.js
tools/tickprocessor.js

index dec494a..d7c52e8 100644 (file)
@@ -79,6 +79,7 @@ CodeMap.PAGE_SIZE =
  * @param {CodeMap.CodeEntry} codeEntry Code entry object.
  */
 CodeMap.prototype.addCode = function(start, codeEntry) {
+  this.removeAllCoveredNodes_(this.dynamics_, start, start + codeEntry.size);
   this.dynamics_.insert(start, codeEntry);
 };
 
@@ -91,7 +92,9 @@ CodeMap.prototype.addCode = function(start, codeEntry) {
  * @param {number} to The destination address.
  */
 CodeMap.prototype.moveCode = function(from, to) {
+  if (from === to) return;
   var removedNode = this.dynamics_.remove(from);
+  this.removeAllCoveredNodes_(this.dynamics_, to, to + removedNode.value.size);
   this.dynamics_.insert(to, removedNode.value);
 };
 
@@ -154,6 +157,26 @@ CodeMap.prototype.isAddressBelongsTo_ = function(addr, node) {
 /**
  * @private
  */
+CodeMap.prototype.findAllCoveredNodes_ = function(tree, start, end) {
+  var result = [];
+  var addr = end - 1;
+  while (addr >= start) {
+    var node = tree.findGreatestLessThan(addr);
+    if (!node) break;
+    var start2 = node.key, end2 = node.key + node.value.size;
+    if (start2 < end && start < end2) {
+      // Node overlaps with the interval given
+      result.push(node);
+    }
+    addr = node.key - 1;
+  }
+  return result;
+};
+
+
+/**
+ * @private
+ */
 CodeMap.prototype.findInTree_ = function(tree, addr) {
   var node = tree.findGreatestLessThan(addr);
   return node && this.isAddressBelongsTo_(addr, node) ? node.value : null;
@@ -234,6 +257,14 @@ CodeMap.prototype.getAllLibrariesEntries = function() {
 };
 
 
+CodeMap.prototype.removeAllCoveredNodes_ = function(tree, start, end) {
+  var covered = this.findAllCoveredNodes_(tree, start, end);
+  for (var i = 0, l = covered.length; i < l; ++i) {
+    tree.remove(covered[i].key);
+  }
+};
+
+
 /**
  * Creates a code entry object.
  *
index 10a07f8..fe922fa 100644 (file)
@@ -58,8 +58,7 @@ Profile.prototype.skipThisFunction = function(name) {
  */
 Profile.Operation = {
   MOVE: 0,
-  DELETE: 1,
-  TICK: 2
+  TICK: 1
 };
 
 
@@ -163,15 +162,13 @@ Profile.prototype.addFuncCode = function(
     func.name = name;
   }
   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);
+  if (entry && entry.size === size && entry.func === func) {
+    // Entry state has changed.
+    entry.state = state;
+    return entry;
   }
+  entry = new Profile.DynamicFuncCodeEntry(size, type, func, state);
+  this.codeMap_.addCode(start, entry);
   return entry;
 };
 
@@ -192,20 +189,6 @@ Profile.prototype.moveCode = function(from, to) {
 
 
 /**
- * Reports about deletion of a dynamic code entry.
- *
- * @param {number} start Starting address.
- */
-Profile.prototype.deleteCode = function(start) {
-  try {
-    this.codeMap_.deleteCode(start);
-  } catch (e) {
-    this.handleUnknownCode(Profile.Operation.DELETE, start);
-  }
-};
-
-
-/**
  * Reports about moving of a dynamic code entry.
  *
  * @param {number} from Current code entry address.
index 5f57835..1d058a0 100644 (file)
@@ -77,8 +77,7 @@ function SnapshotLogProcessor() {
           processor: this.processCodeCreation },
       'code-move': { parsers: [parseInt, parseInt],
           processor: this.processCodeMove },
-      'code-delete': { parsers: [parseInt],
-          processor: this.processCodeDelete },
+      'code-delete': null,
       'function-creation': null,
       'function-move': null,
       'function-delete': null,
@@ -93,10 +92,6 @@ function SnapshotLogProcessor() {
         print('Snapshot: Code move event for unknown code: 0x' +
               addr.toString(16));
         break;
-      case op.DELETE:
-        print('Snapshot: Code delete event for unknown code: 0x' +
-              addr.toString(16));
-        break;
     }
   };
 
@@ -123,11 +118,6 @@ SnapshotLogProcessor.prototype.processCodeMove = function(from, to) {
 };
 
 
-SnapshotLogProcessor.prototype.processCodeDelete = function(start) {
-  this.profile_.deleteCode(start);
-};
-
-
 SnapshotLogProcessor.prototype.processSnapshotPosition = function(addr, pos) {
   this.serializedEntries_[pos] = this.profile_.findEntry(addr);
 };
@@ -155,8 +145,7 @@ function TickProcessor(
           processor: this.processCodeCreation },
       'code-move': { parsers: [parseInt, parseInt],
           processor: this.processCodeMove },
-      'code-delete': { parsers: [parseInt],
-          processor: this.processCodeDelete },
+      'code-delete': null,
       'sfi-move': { parsers: [parseInt, parseInt],
           processor: this.processFunctionMove },
       'snapshot-pos': { parsers: [parseInt, parseInt],
@@ -195,9 +184,6 @@ function TickProcessor(
       case op.MOVE:
         print('Code move event for unknown code: 0x' + addr.toString(16));
         break;
-      case op.DELETE:
-        print('Code delete event for unknown code: 0x' + addr.toString(16));
-        break;
       case op.TICK:
         // Only unknown PCs (the first frame) are reported as unaccounted,
         // otherwise tick balance will be corrupted (this behavior is compatible
@@ -318,11 +304,6 @@ TickProcessor.prototype.processCodeMove = function(from, to) {
 };
 
 
-TickProcessor.prototype.processCodeDelete = function(start) {
-  this.profile_.deleteCode(start);
-};
-
-
 TickProcessor.prototype.processFunctionMove = function(from, to) {
   this.profile_.moveFunc(from, to);
 };