warpo 3.0.0 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/dist/debug_server/debugSession.d.ts +17 -1
  2. package/dist/debug_server/debugSession.js +169 -7
  3. package/dist/debug_server/debugSession.js.map +1 -1
  4. package/dist/debug_server/debugger.d.ts +25 -0
  5. package/dist/debug_server/debugger.js +4 -0
  6. package/dist/debug_server/debugger.js.map +1 -0
  7. package/dist/debug_server/debuggerWasmModule.d.ts +28 -0
  8. package/dist/debug_server/debuggerWasmModule.js +75 -0
  9. package/dist/debug_server/debuggerWasmModule.js.map +1 -0
  10. package/dist/debug_server/nodeDebugger.d.ts +27 -0
  11. package/dist/debug_server/nodeDebugger.js +240 -0
  12. package/dist/debug_server/nodeDebugger.js.map +1 -0
  13. package/dist/debug_server/tests/debugSession.test.js +45 -1
  14. package/dist/debug_server/tests/debugSession.test.js.map +1 -1
  15. package/dist/debug_server/tests/testModule/debugger_basic.d.ts +1 -0
  16. package/dist/debug_server/tests/testModule/debugger_basic.js +6 -0
  17. package/dist/debug_server/tests/testModule/debugger_basic.js.map +1 -0
  18. package/dist/debug_server/wasmEntry.js +36 -0
  19. package/dist/debug_server/wasmEntry.js.map +1 -0
  20. package/dist/heap_analyzer/cli.d.ts +1 -0
  21. package/dist/heap_analyzer/cli.js +172 -0
  22. package/dist/heap_analyzer/cli.js.map +1 -0
  23. package/dist/heap_analyzer/src/comparison.d.ts +2 -0
  24. package/dist/heap_analyzer/src/comparison.js +77 -0
  25. package/dist/heap_analyzer/src/comparison.js.map +1 -0
  26. package/dist/heap_analyzer/src/constants.d.ts +1 -1
  27. package/dist/heap_analyzer/src/constants.js +1 -1
  28. package/dist/heap_analyzer/src/debugInfoResolver.d.ts +30 -0
  29. package/dist/heap_analyzer/src/debugInfoResolver.js +334 -0
  30. package/dist/heap_analyzer/src/debugInfoResolver.js.map +1 -0
  31. package/dist/heap_analyzer/src/dumpReader.js +11 -2
  32. package/dist/heap_analyzer/src/dumpReader.js.map +1 -1
  33. package/dist/heap_analyzer/src/dwarfParser.d.ts +30 -9
  34. package/dist/heap_analyzer/src/dwarfParser.js +54 -20
  35. package/dist/heap_analyzer/src/dwarfParser.js.map +1 -1
  36. package/dist/heap_analyzer/src/index.d.ts +7 -0
  37. package/dist/heap_analyzer/src/index.js +16 -0
  38. package/dist/heap_analyzer/src/index.js.map +1 -0
  39. package/dist/heap_analyzer/src/referenceScanner.d.ts +4 -4
  40. package/dist/heap_analyzer/src/referenceScanner.js +52 -21
  41. package/dist/heap_analyzer/src/referenceScanner.js.map +1 -1
  42. package/dist/heap_analyzer/src/roots.d.ts +3 -6
  43. package/dist/heap_analyzer/src/roots.js +12 -5
  44. package/dist/heap_analyzer/src/roots.js.map +1 -1
  45. package/dist/heap_analyzer/src/snapshot.d.ts +2 -2
  46. package/dist/heap_analyzer/src/snapshot.js +36 -88
  47. package/dist/heap_analyzer/src/snapshot.js.map +1 -1
  48. package/dist/heap_analyzer/src/types.d.ts +54 -11
  49. package/dist/heap_analyzer/src/types.js +22 -1
  50. package/dist/heap_analyzer/src/types.js.map +1 -1
  51. package/dist/heap_analyzer/tests/comparison.test.d.ts +1 -0
  52. package/dist/heap_analyzer/tests/comparison.test.js +121 -0
  53. package/dist/heap_analyzer/tests/comparison.test.js.map +1 -0
  54. package/dist/heap_analyzer/tests/debugInfoResolver.test.d.ts +1 -0
  55. package/dist/heap_analyzer/tests/debugInfoResolver.test.js +205 -0
  56. package/dist/heap_analyzer/tests/debugInfoResolver.test.js.map +1 -0
  57. package/dist/heap_analyzer/tests/dumpReader.test.js +12 -2
  58. package/dist/heap_analyzer/tests/dumpReader.test.js.map +1 -1
  59. package/dist/heap_analyzer/tests/dwarfParser.test.js +40 -28
  60. package/dist/heap_analyzer/tests/dwarfParser.test.js.map +1 -1
  61. package/dist/heap_analyzer/tests/roots.test.js +21 -4
  62. package/dist/heap_analyzer/tests/roots.test.js.map +1 -1
  63. package/dist/heap_analyzer/tests/snapshot.test.js +58 -54
  64. package/dist/heap_analyzer/tests/snapshot.test.js.map +1 -1
  65. package/dist/heap_analyzer/tests/testHelper.js +1 -1
  66. package/dist/heap_analyzer/tests/testHelper.js.map +1 -1
  67. package/dist/heap_analyzer/tests/wasmExecutor.js +2 -1
  68. package/dist/heap_analyzer/tests/wasmExecutor.js.map +1 -1
  69. package/dist/scripts/lib.d.ts +5 -1
  70. package/dist/scripts/lib.js +171 -24
  71. package/dist/scripts/lib.js.map +1 -1
  72. package/dist/test_runner/core/compiler.js +0 -1
  73. package/dist/test_runner/core/compiler.js.map +1 -1
  74. package/dist/warpo.d.ts +12 -1
  75. package/dist/warpo.js +32 -7
  76. package/dist/warpo.js.map +1 -1
  77. package/dist/warpo_internal.d.ts +1 -1
  78. package/dist/warpo_internal.js +23 -14
  79. package/dist/warpo_internal.js.map +1 -1
  80. package/package.json +11 -2
  81. package/dist/heap_analyzer/src/classResolver.d.ts +0 -34
  82. package/dist/heap_analyzer/src/classResolver.js +0 -206
  83. package/dist/heap_analyzer/src/classResolver.js.map +0 -1
  84. package/dist/heap_analyzer/tests/classResolver.test.js +0 -110
  85. package/dist/heap_analyzer/tests/classResolver.test.js.map +0 -1
  86. /package/dist/{heap_analyzer/tests/classResolver.test.d.ts → debug_server/wasmEntry.d.ts} +0 -0
@@ -8,7 +8,7 @@
8
8
  * extract custom sections, then performs low-level DWARF parsing on the
9
9
  * raw bytes.
10
10
  */
11
- import { BinaryReader } from "wasmparser";
11
+ import { BinaryReader, } from "wasmparser";
12
12
  // ── DWARF constants ──────────────────────────────────────────────────────────
13
13
  /** DWARF tag values (DW_TAG_*). */
14
14
  export const DW_TAG = {
@@ -92,32 +92,52 @@ class BufferReader {
92
92
  return value;
93
93
  }
94
94
  }
95
+ function readSectionName(reader, info, decoder) {
96
+ if (info.id === 0 /* SectionCode.Custom */ && info.name) {
97
+ return decoder.decode(info.name);
98
+ }
99
+ if (info.id !== 6 /* SectionCode.Global */) {
100
+ reader.skipSection();
101
+ }
102
+ return undefined;
103
+ }
104
+ function updateLastGlobalInitialValue(globals, op) {
105
+ switch (op.code) {
106
+ case 65 /* OperatorCode.i32_const */:
107
+ case 66 /* OperatorCode.i64_const */:
108
+ case 67 /* OperatorCode.f32_const */:
109
+ case 68 /* OperatorCode.f64_const */: {
110
+ const lastGlobal = globals.at(-1);
111
+ if (lastGlobal) {
112
+ lastGlobal.initialValue = Number(op.literal);
113
+ }
114
+ break;
115
+ }
116
+ }
117
+ }
95
118
  /**
96
- * Extract custom sections from a wasm binary using wasmparser's BinaryReader.
97
- * The reader validates wasm structure while iterating through sections.
119
+ * Extract custom sections and global entries from a wasm binary using
120
+ * wasmparser's BinaryReader. The reader validates wasm structure while
121
+ * iterating through sections.
98
122
  */
99
- export function extractCustomSections(wasmBinary) {
123
+ export function extractWasmSections(wasmBinary) {
100
124
  const reader = new BinaryReader();
101
125
  reader.setData(wasmBinary.buffer, wasmBinary.byteOffset, wasmBinary.byteLength);
102
- const sections = [];
126
+ const customSections = [];
127
+ const globals = [];
103
128
  let currentSectionName;
129
+ let globalIndex = 0;
130
+ const decoder = new TextDecoder();
104
131
  while (reader.read()) {
105
132
  switch (reader.state) {
106
133
  case 3 /* BinaryReaderState.BEGIN_SECTION */: {
107
- const info = reader.result;
108
- if (info.id === 0 /* SectionCode.Custom */ && info.name) {
109
- currentSectionName = new TextDecoder().decode(info.name);
110
- }
111
- else {
112
- currentSectionName = undefined;
113
- reader.skipSection();
114
- }
134
+ currentSectionName = readSectionName(reader, reader.result, decoder);
115
135
  break;
116
136
  }
117
137
  case 7 /* BinaryReaderState.SECTION_RAW_DATA */: {
118
138
  if (currentSectionName !== undefined) {
119
139
  const rawData = reader.result;
120
- sections.push({
140
+ customSections.push({
121
141
  name: currentSectionName,
122
142
  payload: new Uint8Array(rawData),
123
143
  });
@@ -125,12 +145,26 @@ export function extractCustomSections(wasmBinary) {
125
145
  }
126
146
  break;
127
147
  }
148
+ case 39 /* BinaryReaderState.BEGIN_GLOBAL_SECTION_ENTRY */: {
149
+ const globalVar = reader.result;
150
+ globals.push({
151
+ index: globalIndex++,
152
+ mutable: globalVar.type.mutability !== 0,
153
+ type: globalVar.type.contentType,
154
+ initialValue: 0,
155
+ });
156
+ break;
157
+ }
158
+ case 26 /* BinaryReaderState.INIT_EXPRESSION_OPERATOR */: {
159
+ updateLastGlobalInitialValue(globals, reader.result);
160
+ break;
161
+ }
128
162
  case -1 /* BinaryReaderState.ERROR */: {
129
163
  throw new Error("Failed to parse wasm binary");
130
164
  }
131
165
  }
132
166
  }
133
- return sections;
167
+ return { customSections, globals };
134
168
  }
135
169
  // ── Abbreviation table parsing ───────────────────────────────────────────────
136
170
  /**
@@ -279,16 +313,16 @@ function parseDIETree(reader, unitEnd, abbrevTable, addressSize, stringTable, cu
279
313
  }
280
314
  // ── High-level API ───────────────────────────────────────────────────────────
281
315
  /**
282
- * Parse DWARF debug information from a WebAssembly binary.
316
+ * Parse debug metadata from a WebAssembly binary.
283
317
  *
284
318
  * @param wasmBinary The raw wasm file content as a Uint8Array or ArrayBuffer.
285
- * @returns Parsed DWARF info including compilation units, abbreviations, and string table.
319
+ * @returns Parsed DWARF units together with wasm global metadata.
286
320
  * @throws If required DWARF sections are missing or malformed.
287
321
  *
288
322
  */
289
- export function parseDwarf(wasmBinary) {
323
+ export function parseWasmDebugInfo(wasmBinary) {
290
324
  const binary = wasmBinary instanceof Uint8Array ? wasmBinary : new Uint8Array(wasmBinary);
291
- const customSections = extractCustomSections(binary);
325
+ const { customSections, globals } = extractWasmSections(binary);
292
326
  const debugAbbrev = customSections.find((s) => s.name === "debug_abbrev");
293
327
  const debugInfo = customSections.find((s) => s.name === "debug_info");
294
328
  const debugStr = customSections.find((s) => s.name === "debug_str");
@@ -301,7 +335,7 @@ export function parseDwarf(wasmBinary) {
301
335
  const stringTable = parseStringTable(debugStr?.payload ?? new Uint8Array(0));
302
336
  const abbreviations = parseAbbrevTable(debugAbbrev.payload);
303
337
  const compilationUnits = parseDebugInfo(debugInfo.payload, abbreviations, stringTable);
304
- return { stringTable, abbreviations, compilationUnits };
338
+ return { stringTable, abbreviations, compilationUnits, globals };
305
339
  }
306
340
  // ── Convenience helpers ──────────────────────────────────────────────────────
307
341
  /** Human-readable tag name for known DWARF tags. */
@@ -1 +1 @@
1
- {"version":3,"file":"dwarfParser.js","sourceRoot":"","sources":["../../../tools/heap_analyzer/src/dwarfParser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dwarfParser.js","sourceRoot":"","sources":["../../../tools/heap_analyzer/src/dwarfParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { HeapComparison, HeapSnapshot } from "./types.js";
2
+ export declare function analyzeDump(dumpBuffer: ArrayBuffer, wasmBinary: Uint8Array | ArrayBuffer): HeapSnapshot;
3
+ export declare function compareDumps(beforeDumpBuffer: ArrayBuffer, afterDumpBuffer: ArrayBuffer, wasmBinary: Uint8Array | ArrayBuffer): HeapComparison;
4
+ export { analyzeHeap } from "./snapshot.js";
5
+ export { compareSnapshots } from "./comparison.js";
6
+ export { parseDumpFile } from "./dumpReader.js";
7
+ export type { BuiltinContainerKind, ClassField, ClassLayout, ComparisonInstance, ComparisonInstanceChangeKind, ConstructorComparisonEntry, ConstructorEntry, ConstructorInstance, DumpedMemory, EntryLayout, GlobalRoot, HeapComparison, HeapObject, HeapSnapshot, ObjectHeader, RootInfo, RootType, RuntimeGlobalValues, } from "./types.js";
@@ -0,0 +1,16 @@
1
+ // Copyright (C) 2026 wasm-ecosystem
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { compareSnapshots } from "./comparison.js";
4
+ import { parseDumpFile } from "./dumpReader.js";
5
+ import { analyzeHeap } from "./snapshot.js";
6
+ export function analyzeDump(dumpBuffer, wasmBinary) {
7
+ const dumpedMemory = parseDumpFile(dumpBuffer);
8
+ return analyzeHeap(dumpedMemory.memory, dumpedMemory.rtGlobals, wasmBinary);
9
+ }
10
+ export function compareDumps(beforeDumpBuffer, afterDumpBuffer, wasmBinary) {
11
+ return compareSnapshots(analyzeDump(beforeDumpBuffer, wasmBinary), analyzeDump(afterDumpBuffer, wasmBinary));
12
+ }
13
+ export { analyzeHeap } from "./snapshot.js";
14
+ export { compareSnapshots } from "./comparison.js";
15
+ export { parseDumpFile } from "./dumpReader.js";
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../tools/heap_analyzer/src/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,MAAM,UAAU,WAAW,CAAC,UAAuB,EAAE,UAAoC;IACvF,MAAM,YAAY,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IAC/C,OAAO,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,gBAA6B,EAC7B,eAA4B,EAC5B,UAAoC;IAEpC,OAAO,gBAAgB,CAAC,WAAW,CAAC,gBAAgB,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC;AAC/G,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,11 +1,11 @@
1
- import type { ObjectHeader } from "./types.js";
2
- import type { ClassResolver } from "./classResolver.js";
1
+ import { type ObjectHeader } from "./types.js";
2
+ import type { DebugInfoResolver } from "./debugInfoResolver.js";
3
3
  /**
4
4
  * Scan object payloads to build a precise reference graph using debug info.
5
5
  *
6
6
  * @param memory Header-stripped DataView (wasm addr 0 = offset 0)
7
7
  * @param objects Parsed object headers from parseAllObjects
8
- * @param classResolver ClassResolver built from debug info
8
+ * @param debugInfoResolver DebugInfoResolver built from debug info
9
9
  * @returns Adjacency list: payloadPtr → array of referenced payloadPtrs
10
10
  */
11
- export declare function scanReferences(memory: DataView, objects: ObjectHeader[], classResolver: ClassResolver): Map<number, number[]>;
11
+ export declare function scanReferences(memory: DataView, objects: ObjectHeader[], debugInfoResolver: DebugInfoResolver): Map<number, number[]>;
@@ -1,5 +1,6 @@
1
1
  // Copyright (C) 2026 wasm-ecosystem
2
2
  // SPDX-License-Identifier: Apache-2.0
3
+ import { BuiltinContainerKind, getReferenceFields, isPointerfree, } from "./types.js";
3
4
  function readValidPtr(memory, addr, validPtrs) {
4
5
  if (addr + 4 > memory.byteLength) {
5
6
  return null;
@@ -10,8 +11,8 @@ function readValidPtr(memory, addr, validPtrs) {
10
11
  }
11
12
  return ptr;
12
13
  }
13
- function scanReferenceFields(memory, obj, classResolver, validPtrs, edges) {
14
- for (const field of classResolver.getReferenceFields(obj.rtId)) {
14
+ function scanReferenceFields(memory, obj, classLayout, validPtrs, edges) {
15
+ for (const field of getReferenceFields(classLayout)) {
15
16
  if (field.offset + field.size > obj.rtSize) {
16
17
  // Skip fields that don't fit within the object's size (could be a broken dumped memory or stale debug info)
17
18
  continue;
@@ -100,22 +101,48 @@ function scanSmallTupleElements(memory, obj, validPtrs, edges) {
100
101
  }
101
102
  }
102
103
  }
103
- function scanContainerElements(memory, obj, classLayout, validPtrs, edges) {
104
- const name = classLayout.name;
105
- if (name.startsWith("~lib/array/Array<")) {
106
- scanArrayElements(memory, obj, validPtrs, edges);
104
+ function scanFunctionEnv(memory, obj, classLayout, validPtrs, edges) {
105
+ const envField = classLayout.fields.find((field) => field.name === "_env");
106
+ if (!envField || envField.offset + envField.size > obj.rtSize) {
107
107
  return;
108
108
  }
109
- if (name.startsWith("~lib/staticarray/StaticArray<")) {
110
- scanStaticArrayElements(memory, obj, validPtrs, edges);
111
- return;
112
- }
113
- if (name === "~lib/tuple/SmallTuple") {
114
- scanSmallTupleElements(memory, obj, validPtrs, edges);
115
- return;
109
+ const ptr = readValidPtr(memory, obj.payloadPtr + envField.offset, validPtrs);
110
+ if (ptr !== null) {
111
+ edges.push(ptr);
116
112
  }
117
- if (classLayout.entryLayout) {
118
- scanSetMapEntries(memory, obj, classLayout.entryLayout, validPtrs, edges);
113
+ }
114
+ function scanBuiltinContainer(memory, obj, classLayout, validPtrs, edges) {
115
+ scanReferenceFields(memory, obj, classLayout, validPtrs, edges);
116
+ switch (classLayout.builtinKind) {
117
+ case BuiltinContainerKind.Array: {
118
+ if (classLayout.templateTypeIsReference === true) {
119
+ scanArrayElements(memory, obj, validPtrs, edges);
120
+ }
121
+ return;
122
+ }
123
+ case BuiltinContainerKind.StaticArray: {
124
+ if (classLayout.templateTypeIsReference === true) {
125
+ scanStaticArrayElements(memory, obj, validPtrs, edges);
126
+ }
127
+ return;
128
+ }
129
+ case BuiltinContainerKind.SmallTuple: {
130
+ scanSmallTupleElements(memory, obj, validPtrs, edges);
131
+ return;
132
+ }
133
+ case BuiltinContainerKind.Function: {
134
+ scanFunctionEnv(memory, obj, classLayout, validPtrs, edges);
135
+ return;
136
+ }
137
+ case BuiltinContainerKind.MapOrSet: {
138
+ if (classLayout.entryLayout) {
139
+ scanSetMapEntries(memory, obj, classLayout.entryLayout, validPtrs, edges);
140
+ }
141
+ return;
142
+ }
143
+ default: {
144
+ return;
145
+ }
119
146
  }
120
147
  }
121
148
  /**
@@ -123,18 +150,22 @@ function scanContainerElements(memory, obj, classLayout, validPtrs, edges) {
123
150
  *
124
151
  * @param memory Header-stripped DataView (wasm addr 0 = offset 0)
125
152
  * @param objects Parsed object headers from parseAllObjects
126
- * @param classResolver ClassResolver built from debug info
153
+ * @param debugInfoResolver DebugInfoResolver built from debug info
127
154
  * @returns Adjacency list: payloadPtr → array of referenced payloadPtrs
128
155
  */
129
- export function scanReferences(memory, objects, classResolver) {
156
+ export function scanReferences(memory, objects, debugInfoResolver) {
130
157
  const validPtrs = new Set(objects.map((o) => o.payloadPtr));
131
158
  const graph = new Map();
132
159
  for (const obj of objects) {
133
160
  const edges = [];
134
- const classLayout = classResolver.getClassDef(obj.rtId);
135
- if (classLayout && !classResolver.isPointerfree(obj.rtId)) {
136
- scanReferenceFields(memory, obj, classResolver, validPtrs, edges);
137
- scanContainerElements(memory, obj, classLayout, validPtrs, edges);
161
+ const classLayout = debugInfoResolver.getClassDef(obj.rtId);
162
+ if (classLayout) {
163
+ if (classLayout.builtinKind !== undefined) {
164
+ scanBuiltinContainer(memory, obj, classLayout, validPtrs, edges);
165
+ }
166
+ else if (!isPointerfree(classLayout)) {
167
+ scanReferenceFields(memory, obj, classLayout, validPtrs, edges);
168
+ }
138
169
  }
139
170
  graph.set(obj.payloadPtr, edges);
140
171
  }
@@ -1 +1 @@
1
- {"version":3,"file":"referenceScanner.js","sourceRoot":"","sources":["../../../tools/heap_analyzer/src/referenceScanner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"referenceScanner.js","sourceRoot":"","sources":["../../../tools/heap_analyzer/src/referenceScanner.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,10 @@
1
- import type { ObjectHeader, RootInfo, RuntimeGlobals } from "./types.js";
1
+ import type { GlobalRoot, ObjectHeader, RootInfo, RuntimeGlobalValues } from "./types.js";
2
2
  /**
3
3
  * Identify GC roots that can be recovered reliably from the current dump model.
4
4
  *
5
5
  * Currently supported:
6
+ * - GC globals identified from DWARF + wasm global metadata
6
7
  * - shadow stack roots
7
8
  * - pinned objects (transparent GC color)
8
- *
9
- * Precise GC global-root detection is intentionally not implemented yet.
10
- * Scanning arbitrary words in the static region would misclassify incidental
11
- * pointer-like bytes from static strings or static arrays as semantic globals.
12
9
  */
13
- export declare function findRoots(memory: DataView, rtGlobals: RuntimeGlobals, objects: ObjectHeader[]): RootInfo[];
10
+ export declare function findRoots(memory: DataView, rtGlobals: RuntimeGlobalValues, objects: ObjectHeader[], globalRoots?: GlobalRoot[]): RootInfo[];
@@ -5,16 +5,23 @@ import { GC_COLOR_TRANSPARENT } from "./constants.js";
5
5
  * Identify GC roots that can be recovered reliably from the current dump model.
6
6
  *
7
7
  * Currently supported:
8
+ * - GC globals identified from DWARF + wasm global metadata
8
9
  * - shadow stack roots
9
10
  * - pinned objects (transparent GC color)
10
- *
11
- * Precise GC global-root detection is intentionally not implemented yet.
12
- * Scanning arbitrary words in the static region would misclassify incidental
13
- * pointer-like bytes from static strings or static arrays as semantic globals.
14
11
  */
15
- export function findRoots(memory, rtGlobals, objects) {
12
+ export function findRoots(memory, rtGlobals, objects, globalRoots = []) {
16
13
  const validPtrs = new Set(objects.map((obj) => obj.payloadPtr));
17
14
  const roots = [];
15
+ for (const globalRoot of globalRoots) {
16
+ if (globalRoot.value !== 0 && validPtrs.has(globalRoot.value)) {
17
+ roots.push({
18
+ objectPtr: globalRoot.value,
19
+ className: "",
20
+ rootType: "global",
21
+ sourceAddress: globalRoot.globalIndex,
22
+ });
23
+ }
24
+ }
18
25
  // Shadow stack in incremental runtime contains managed object pointers.
19
26
  for (let addr = rtGlobals.stackPointer; addr < rtGlobals.heapBase; addr += 4) {
20
27
  if (addr + 4 > memory.byteLength) {
@@ -1 +1 @@
1
- {"version":3,"file":"roots.js","sourceRoot":"","sources":["../../../tools/heap_analyzer/src/roots.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAGtD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,SAAS,CAAC,MAAgB,EAAE,SAAyB,EAAE,OAAuB;IAC5F,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IAChE,MAAM,KAAK,GAAe,EAAE,CAAC;IAE7B,wEAAwE;IACxE,KAAK,IAAI,IAAI,GAAG,SAAS,CAAC,YAAY,EAAE,IAAI,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;QAC7E,IAAI,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YACjC,MAAM;QACR,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,GAAG,KAAK,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC;gBACT,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,EAAE;gBACb,QAAQ,EAAE,OAAO;gBACjB,aAAa,EAAE,IAAI;aACpB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,GAAG,CAAC,OAAO,KAAK,oBAAoB,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC;gBACT,SAAS,EAAE,GAAG,CAAC,UAAU;gBACzB,SAAS,EAAE,EAAE;gBACb,QAAQ,EAAE,QAAQ;gBAClB,aAAa,EAAE,CAAC;aACjB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"roots.js","sourceRoot":"","sources":["../../../tools/heap_analyzer/src/roots.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAGtD;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CACvB,MAAgB,EAChB,SAA8B,EAC9B,OAAuB,EACvB,cAA4B,EAAE;IAE9B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IAChE,MAAM,KAAK,GAAe,EAAE,CAAC;IAE7B,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,UAAU,CAAC,KAAK,KAAK,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC;gBACT,SAAS,EAAE,UAAU,CAAC,KAAK;gBAC3B,SAAS,EAAE,EAAE;gBACb,QAAQ,EAAE,QAAQ;gBAClB,aAAa,EAAE,UAAU,CAAC,WAAW;aACtC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,KAAK,IAAI,IAAI,GAAG,SAAS,CAAC,YAAY,EAAE,IAAI,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;QAC7E,IAAI,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YACjC,MAAM;QACR,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,GAAG,KAAK,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC;gBACT,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,EAAE;gBACb,QAAQ,EAAE,OAAO;gBACjB,aAAa,EAAE,IAAI;aACpB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,GAAG,CAAC,OAAO,KAAK,oBAAoB,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC;gBACT,SAAS,EAAE,GAAG,CAAC,UAAU;gBACzB,SAAS,EAAE,EAAE;gBACb,QAAQ,EAAE,QAAQ;gBAClB,aAAa,EAAE,CAAC;aACjB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1,2 +1,2 @@
1
- import type { HeapSnapshot, RuntimeGlobals } from "./types.js";
2
- export declare function analyzeHeap(memory: DataView, rtGlobals: RuntimeGlobals, wasmBinary: Uint8Array | ArrayBuffer): HeapSnapshot;
1
+ import type { HeapSnapshot, RuntimeGlobalValues } from "./types.js";
2
+ export declare function analyzeHeap(memory: DataView, rtGlobals: RuntimeGlobalValues, wasmBinary: Uint8Array | ArrayBuffer): HeapSnapshot;
@@ -1,28 +1,21 @@
1
1
  // Copyright (C) 2026 wasm-ecosystem
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import { AL_MASK, BLOCK_OVERHEAD, ROOT_SIZE } from "./constants.js";
4
- import { ClassResolver } from "./classResolver.js";
4
+ import { DebugInfoResolver } from "./debugInfoResolver.js";
5
5
  import { buildDominatorTree } from "./dominator.js";
6
6
  import { computeRetainedSizes, shallowSize } from "./retainedSize.js";
7
7
  import { findRoots } from "./roots.js";
8
8
  import { scanReferences } from "./referenceScanner.js";
9
9
  import { walkBlocks } from "./tlsf.js";
10
- function getAssignedRootType(rootTypes, payloadPtr) {
11
- const rootType = rootTypes.get(payloadPtr);
12
- if (!rootType) {
13
- throw new Error(`Missing root type for live object ${payloadPtr}`);
14
- }
15
- return rootType;
16
- }
17
10
  export function analyzeHeap(memory, rtGlobals, wasmBinary) {
18
- // Resolve DWARF-derived class layouts once up front for the entire pipeline.
19
- const classResolver = ClassResolver.fromWasm(wasmBinary);
11
+ // Resolve DWARF-derived class and global metadata once up front for the entire pipeline.
12
+ const debugInfoResolver = DebugInfoResolver.fromWasm(wasmBinary);
20
13
  // Step 1: Enumerate all allocated heap objects from TLSF blocks.
21
14
  const objects = walkBlocks(memory, rtGlobals.heapBase);
22
15
  // Step 2: Build the full object reference graph.
23
- const graph = scanReferences(memory, objects, classResolver);
24
- // Step 3: Discover currently supported roots: shadow stack and pinned objects.
25
- const roots = findRoots(memory, rtGlobals, objects);
16
+ const graph = scanReferences(memory, objects, debugInfoResolver);
17
+ // Step 3: Discover current roots from globals, shadow stack, and pinned objects.
18
+ const roots = findRoots(memory, rtGlobals, objects, debugInfoResolver.getGlobalRoots(rtGlobals.mutableI32GlobalValues));
26
19
  // Step 4: Traverse from roots to determine the live object set.
27
20
  const liveSet = markLive(roots, graph);
28
21
  // Step 5: Restrict both the object list and the graph to live nodes only.
@@ -33,40 +26,21 @@ export function analyzeHeap(memory, rtGlobals, wasmBinary) {
33
26
  const dominatorTree = buildDominatorTree(liveGraph, rootPtrs);
34
27
  // Step 7: Aggregate retained sizes bottom-up on the dominator tree.
35
28
  const retainedSizes = computeRetainedSizes(liveObjects, dominatorTree);
36
- // Step 8: Propagate root categories across the live graph.
37
- const rootTypes = classifyRootTypes(roots, liveGraph);
38
- const objectRtIds = new Map(objects.map((obj) => [obj.payloadPtr, obj.rtId]));
39
- // Step 9: Materialize per-object results.
29
+ // Step 8: Materialize per-object results for constructor aggregation.
40
30
  const heapObjects = liveObjects.map((obj) => ({
41
31
  address: obj.payloadPtr,
42
32
  classId: obj.rtId,
43
- className: classResolver.getClassName(obj.rtId),
33
+ className: debugInfoResolver.getClassName(obj.rtId),
44
34
  shallowSize: shallowSize(obj),
45
35
  retainedSize: retainedSizes.get(obj.payloadPtr) ?? shallowSize(obj),
46
- rootType: getAssignedRootType(rootTypes, obj.payloadPtr),
47
36
  }));
48
- // Step 10: Enrich root records with resolved class names.
49
- const rootsWithClassName = roots.map((root) => {
50
- const className = classResolver.getClassName(objectRtIds.get(root.objectPtr) ?? -1);
51
- return {
52
- objectPtr: root.objectPtr,
53
- className,
54
- rootType: root.rootType,
55
- sourceAddress: root.sourceAddress,
56
- };
57
- });
58
- // Step 11: Compute top-level totals and the class summary view.
37
+ // Step 9: Compute top-level totals and constructor view.
59
38
  const totalLiveSize = heapObjects.reduce((sum, obj) => sum + obj.shallowSize, 0);
60
39
  const totalHeapSize = memory.byteLength - computeFirstBlock(rtGlobals.heapBase);
61
- const totalFreeSize = Math.max(0, totalHeapSize - totalLiveSize);
62
40
  return {
63
- objects: heapObjects,
64
- summary: buildSummary(heapObjects),
65
- roots: rootsWithClassName,
41
+ constructors: buildConstructors(heapObjects),
66
42
  totalHeapSize,
67
43
  totalLiveSize,
68
- totalFreeSize,
69
- objectCount: heapObjects.length,
70
44
  };
71
45
  }
72
46
  function markLive(roots, graph) {
@@ -96,71 +70,45 @@ function buildLiveGraph(liveSet, graph) {
96
70
  }
97
71
  return liveGraph;
98
72
  }
99
- function classifyRootTypes(roots, graph) {
100
- // Root-type propagation is priority-based: global > local > pinned.
101
- const result = new Map();
102
- const localRoots = new Set();
103
- const pinnedRoots = new Set();
104
- const globalRoots = new Set();
105
- for (const root of roots) {
106
- switch (root.rootType) {
107
- case "global": {
108
- globalRoots.add(root.objectPtr);
109
- break;
110
- }
111
- case "local": {
112
- localRoots.add(root.objectPtr);
113
- break;
114
- }
115
- case "pinned": {
116
- pinnedRoots.add(root.objectPtr);
117
- break;
118
- }
119
- }
120
- }
121
- bfsAssignRootType(pinnedRoots, graph, result, "pinned");
122
- bfsAssignRootType(localRoots, graph, result, "local");
123
- bfsAssignRootType(globalRoots, graph, result, "global");
124
- return result;
125
- }
126
- function bfsAssignRootType(startPtrs, graph, result, rootType) {
127
- // Walk one root category at a time and stamp every reachable node with that category.
128
- const visited = new Set();
129
- const workList = Array.from(startPtrs);
130
- for (let index = 0; index < workList.length; index++) {
131
- const ptr = workList[index];
132
- if (visited.has(ptr)) {
133
- continue;
134
- }
135
- visited.add(ptr);
136
- result.set(ptr, rootType);
137
- for (const child of graph.get(ptr) ?? []) {
138
- if (!visited.has(child)) {
139
- workList.push(child);
140
- }
141
- }
142
- }
143
- }
144
- function buildSummary(objects) {
145
- // Summary is grouped by class name and sorted like a heap-summary view.
146
- const summaryByClass = new Map();
73
+ function buildConstructors(objects) {
74
+ const constructorsByClass = new Map();
147
75
  for (const obj of objects) {
148
- let entry = summaryByClass.get(obj.className);
76
+ let entry = constructorsByClass.get(obj.className);
149
77
  if (!entry) {
150
78
  entry = {
151
79
  className: obj.className,
152
- classId: obj.classId,
153
80
  count: 0,
154
81
  totalShallowSize: 0,
155
82
  totalRetainedSize: 0,
83
+ instances: [],
156
84
  };
157
- summaryByClass.set(obj.className, entry);
85
+ constructorsByClass.set(obj.className, entry);
158
86
  }
159
87
  entry.count++;
160
88
  entry.totalShallowSize += obj.shallowSize;
161
89
  entry.totalRetainedSize += obj.retainedSize;
90
+ entry.instances.push({
91
+ address: obj.address,
92
+ shallowSize: obj.shallowSize,
93
+ retainedSize: obj.retainedSize,
94
+ });
162
95
  }
163
- return [...summaryByClass.values()].toSorted((lhs, rhs) => rhs.totalRetainedSize - lhs.totalRetainedSize);
96
+ return Array.from(constructorsByClass.values(), (entry) => ({
97
+ className: entry.className,
98
+ count: entry.count,
99
+ totalShallowSize: entry.totalShallowSize,
100
+ totalRetainedSize: entry.totalRetainedSize,
101
+ instances: sortConstructorInstances(entry.instances),
102
+ })).toSorted(sortConstructors);
103
+ }
104
+ function sortConstructors(lhs, rhs) {
105
+ return (rhs.totalRetainedSize - lhs.totalRetainedSize ||
106
+ rhs.totalShallowSize - lhs.totalShallowSize ||
107
+ rhs.count - lhs.count ||
108
+ lhs.className.localeCompare(rhs.className));
109
+ }
110
+ function sortConstructorInstances(instances) {
111
+ return instances.toSorted((lhs, rhs) => rhs.retainedSize - lhs.retainedSize || rhs.shallowSize - lhs.shallowSize || lhs.address - rhs.address);
164
112
  }
165
113
  function computeFirstBlock(heapBase) {
166
114
  // Match the AssemblyScript runtime's TLSF root and first-block alignment rules.