Skip to content

Commit 7aef66f

Browse files
Dominik Inführdevtools-frontend-scoped@luci-project-accounts.iam.gserviceaccount.com
authored andcommitted
Add nodeIndexForId to HeapSnapshotProxy
The MCP server needs to look up the node index for an object id. Currently this reuses the getAggregates() call, which iterates through the objects on the main isolate. This CL adds a new method nodeIndexForId() such that this work can be performed on the worker isolate. This should avoid any serialization except for the final node index result value. There may even be cases where getAggregates() does not find the given object id because e.g. objects with self_size == 0 do not show up in the summary view. Bug: 497855658 Change-Id: I78396a269bf285b5dbb76b3e9405b56f73e1b61a Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/7899812 Commit-Queue: Dominik Inführ <dinfuehr@chromium.org> Reviewed-by: Nikolay Vitkov <nvitkov@chromium.org> Reviewed-by: Simon Zünd <szuend@chromium.org>
1 parent e6a2d10 commit 7aef66f

3 files changed

Lines changed: 43 additions & 0 deletions

File tree

front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.test.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,4 +1027,32 @@ describe('HeapSnapshot', () => {
10271027

10281028
assert.strictEqual(JSON.stringify(referenceToCompare), JSON.stringify(resultToCompare));
10291029
});
1030+
1031+
it('heapSnapshotNodeIndexForId', async () => {
1032+
const builder = new HeapSnapshotBuilder();
1033+
const root = builder.rootNode;
1034+
1035+
const zeroSizeNode = new HeapNode('ZeroSizeNode', 0, 'object', 42);
1036+
root.linkNode(zeroSizeNode, 'element');
1037+
1038+
const normalNode = new HeapNode('NormalNode', 100, 'object', 99);
1039+
root.linkNode(normalNode, 'element');
1040+
1041+
const snapshot = await builder.createJSHeapSnapshot();
1042+
1043+
const zeroSizeIndex = snapshot.nodeIndexForId(42);
1044+
assert.isDefined(zeroSizeIndex);
1045+
const resolvedZeroSizeNode = snapshot.createNode(zeroSizeIndex!);
1046+
assert.strictEqual(resolvedZeroSizeNode.name(), 'ZeroSizeNode');
1047+
assert.strictEqual(resolvedZeroSizeNode.id(), 42);
1048+
1049+
const normalIndex = snapshot.nodeIndexForId(99);
1050+
assert.isDefined(normalIndex);
1051+
const resolvedNormalNode = snapshot.createNode(normalIndex!);
1052+
assert.strictEqual(resolvedNormalNode.name(), 'NormalNode');
1053+
assert.strictEqual(resolvedNormalNode.id(), 99);
1054+
1055+
const nonExistentIndex = snapshot.nodeIndexForId(999);
1056+
assert.isUndefined(nonExistentIndex);
1057+
});
10301058
});

front_end/entrypoints/heap_snapshot_worker/HeapSnapshot.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1068,6 +1068,17 @@ export abstract class HeapSnapshot {
10681068
this.#progress.updateStatus('Finished processing.');
10691069
}
10701070

1071+
nodeIndexForId(nodeId: number): number|undefined {
1072+
const nodesLength = this.nodes.length;
1073+
const {nodes, nodeFieldCount, nodeIdOffset} = this;
1074+
for (let nodeIndex = 0; nodeIndex < nodesLength; nodeIndex += nodeFieldCount) {
1075+
if (nodes.getValue(nodeIndex + nodeIdOffset) === nodeId) {
1076+
return nodeIndex;
1077+
}
1078+
}
1079+
return undefined;
1080+
}
1081+
10711082
private startInitStep1InSecondThread(secondWorker: PlatformApi.HostRuntime.WorkerMessagePort):
10721083
Promise<ResultsFromSecondWorker> {
10731084
const resultsFromSecondWorker = new Promise<ResultsFromSecondWorker>((resolve, reject) => {

front_end/models/heap_snapshot/HeapSnapshotProxy.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,10 @@ export class HeapSnapshotProxy extends HeapSnapshotProxyObject {
289289
return this.callMethodPromise('nodeClassKey', snapshotObjectId);
290290
}
291291

292+
nodeIndexForId(nodeId: number): Promise<number|undefined> {
293+
return this.callMethodPromise('nodeIndexForId', nodeId);
294+
}
295+
292296
createEdgesProvider(nodeIndex: number): HeapSnapshotProviderProxy {
293297
return this.callFactoryMethod('createEdgesProvider', HeapSnapshotProviderProxy, nodeIndex);
294298
}

0 commit comments

Comments
 (0)