warpo 2.5.0-alpha-3 → 3.1.0

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 (110) hide show
  1. package/asconfig.schema.json +13 -0
  2. package/dist/debug_server/debugSession.d.ts +17 -1
  3. package/dist/debug_server/debugSession.js +169 -7
  4. package/dist/debug_server/debugSession.js.map +1 -1
  5. package/dist/debug_server/debugger.d.ts +25 -0
  6. package/dist/debug_server/debugger.js +4 -0
  7. package/dist/debug_server/debugger.js.map +1 -0
  8. package/dist/debug_server/debuggerWasmModule.d.ts +28 -0
  9. package/dist/debug_server/debuggerWasmModule.js +75 -0
  10. package/dist/debug_server/debuggerWasmModule.js.map +1 -0
  11. package/dist/debug_server/nodeDebugger.d.ts +27 -0
  12. package/dist/debug_server/nodeDebugger.js +240 -0
  13. package/dist/debug_server/nodeDebugger.js.map +1 -0
  14. package/dist/debug_server/tests/debugSession.test.js +45 -1
  15. package/dist/debug_server/tests/debugSession.test.js.map +1 -1
  16. package/dist/debug_server/tests/testModule/debugger_basic.d.ts +1 -0
  17. package/dist/debug_server/tests/testModule/debugger_basic.js +6 -0
  18. package/dist/debug_server/tests/testModule/debugger_basic.js.map +1 -0
  19. package/dist/debug_server/wasmEntry.d.ts +1 -0
  20. package/dist/debug_server/wasmEntry.js +36 -0
  21. package/dist/debug_server/wasmEntry.js.map +1 -0
  22. package/dist/heap_analyzer/src/comparison.d.ts +2 -0
  23. package/dist/heap_analyzer/src/comparison.js +77 -0
  24. package/dist/heap_analyzer/src/comparison.js.map +1 -0
  25. package/dist/heap_analyzer/src/constants.d.ts +21 -0
  26. package/dist/heap_analyzer/src/constants.js +30 -0
  27. package/dist/heap_analyzer/src/constants.js.map +1 -0
  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/dominator.d.ts +17 -0
  32. package/dist/heap_analyzer/src/dominator.js +149 -0
  33. package/dist/heap_analyzer/src/dominator.js.map +1 -0
  34. package/dist/heap_analyzer/src/dumpReader.d.ts +2 -0
  35. package/dist/heap_analyzer/src/dumpReader.js +34 -0
  36. package/dist/heap_analyzer/src/dumpReader.js.map +1 -0
  37. package/dist/heap_analyzer/src/dwarfParser.d.ts +138 -0
  38. package/dist/heap_analyzer/src/dwarfParser.js +400 -0
  39. package/dist/heap_analyzer/src/dwarfParser.js.map +1 -0
  40. package/dist/heap_analyzer/src/index.d.ts +7 -0
  41. package/dist/heap_analyzer/src/index.js +16 -0
  42. package/dist/heap_analyzer/src/index.js.map +1 -0
  43. package/dist/heap_analyzer/src/referenceScanner.d.ts +11 -0
  44. package/dist/heap_analyzer/src/referenceScanner.js +174 -0
  45. package/dist/heap_analyzer/src/referenceScanner.js.map +1 -0
  46. package/dist/heap_analyzer/src/retainedSize.d.ts +9 -0
  47. package/dist/heap_analyzer/src/retainedSize.js +78 -0
  48. package/dist/heap_analyzer/src/retainedSize.js.map +1 -0
  49. package/dist/heap_analyzer/src/roots.d.ts +10 -0
  50. package/dist/heap_analyzer/src/roots.js +52 -0
  51. package/dist/heap_analyzer/src/roots.js.map +1 -0
  52. package/dist/heap_analyzer/src/snapshot.d.ts +2 -0
  53. package/dist/heap_analyzer/src/snapshot.js +118 -0
  54. package/dist/heap_analyzer/src/snapshot.js.map +1 -0
  55. package/dist/heap_analyzer/src/tlsf.d.ts +18 -0
  56. package/dist/heap_analyzer/src/tlsf.js +48 -0
  57. package/dist/heap_analyzer/src/tlsf.js.map +1 -0
  58. package/dist/heap_analyzer/src/types.d.ts +113 -0
  59. package/dist/heap_analyzer/src/types.js +25 -0
  60. package/dist/heap_analyzer/src/types.js.map +1 -0
  61. package/dist/heap_analyzer/tests/comparison.test.d.ts +1 -0
  62. package/dist/heap_analyzer/tests/comparison.test.js +121 -0
  63. package/dist/heap_analyzer/tests/comparison.test.js.map +1 -0
  64. package/dist/heap_analyzer/tests/debugInfoResolver.test.d.ts +1 -0
  65. package/dist/heap_analyzer/tests/debugInfoResolver.test.js +205 -0
  66. package/dist/heap_analyzer/tests/debugInfoResolver.test.js.map +1 -0
  67. package/dist/heap_analyzer/tests/dominator.test.d.ts +1 -0
  68. package/dist/heap_analyzer/tests/dominator.test.js +438 -0
  69. package/dist/heap_analyzer/tests/dominator.test.js.map +1 -0
  70. package/dist/heap_analyzer/tests/dumpReader.test.d.ts +1 -0
  71. package/dist/heap_analyzer/tests/dumpReader.test.js +61 -0
  72. package/dist/heap_analyzer/tests/dumpReader.test.js.map +1 -0
  73. package/dist/heap_analyzer/tests/dwarfParser.test.d.ts +1 -0
  74. package/dist/heap_analyzer/tests/dwarfParser.test.js +292 -0
  75. package/dist/heap_analyzer/tests/dwarfParser.test.js.map +1 -0
  76. package/dist/heap_analyzer/tests/fixture/dwarfFixture.d.ts +2 -0
  77. package/dist/heap_analyzer/tests/fixture/dwarfFixture.js +266 -0
  78. package/dist/heap_analyzer/tests/fixture/dwarfFixture.js.map +1 -0
  79. package/dist/heap_analyzer/tests/retainedSize.test.d.ts +1 -0
  80. package/dist/heap_analyzer/tests/retainedSize.test.js +57 -0
  81. package/dist/heap_analyzer/tests/retainedSize.test.js.map +1 -0
  82. package/dist/heap_analyzer/tests/roots.test.d.ts +1 -0
  83. package/dist/heap_analyzer/tests/roots.test.js +88 -0
  84. package/dist/heap_analyzer/tests/roots.test.js.map +1 -0
  85. package/dist/heap_analyzer/tests/snapshot.test.d.ts +1 -0
  86. package/dist/heap_analyzer/tests/snapshot.test.js +106 -0
  87. package/dist/heap_analyzer/tests/snapshot.test.js.map +1 -0
  88. package/dist/heap_analyzer/tests/testHelper.d.ts +18 -0
  89. package/dist/heap_analyzer/tests/testHelper.js +68 -0
  90. package/dist/heap_analyzer/tests/testHelper.js.map +1 -0
  91. package/dist/heap_analyzer/tests/tlsf.test.d.ts +1 -0
  92. package/dist/heap_analyzer/tests/tlsf.test.js +98 -0
  93. package/dist/heap_analyzer/tests/tlsf.test.js.map +1 -0
  94. package/dist/heap_analyzer/tests/wasmExecutor.d.ts +9 -0
  95. package/dist/heap_analyzer/tests/wasmExecutor.js +50 -0
  96. package/dist/heap_analyzer/tests/wasmExecutor.js.map +1 -0
  97. package/dist/scripts/lib.d.ts +5 -1
  98. package/dist/scripts/lib.js +171 -24
  99. package/dist/scripts/lib.js.map +1 -1
  100. package/dist/test_runner/core/compiler.js +0 -1
  101. package/dist/test_runner/core/compiler.js.map +1 -1
  102. package/dist/warpo.d.ts +12 -1
  103. package/dist/warpo.js +32 -7
  104. package/dist/warpo.js.map +1 -1
  105. package/dist/warpo_internal.d.ts +1 -1
  106. package/dist/warpo_internal.js +23 -14
  107. package/dist/warpo_internal.js.map +1 -1
  108. package/package.json +17 -4
  109. package/types/std/index.d.ts +0 -4
  110. package/types/warpo/index.d.ts +8 -0
@@ -0,0 +1,240 @@
1
+ // Copyright (C) 2025 wasm-ecosystem
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { spawn } from "node:child_process";
4
+ import { appendFileSync, writeFileSync } from "node:fs";
5
+ import * as path from "node:path";
6
+ import * as net from "node:net";
7
+ import { fileURLToPath } from "node:url";
8
+ import { DebuggerWasmModule } from "./debuggerWasmModule.js";
9
+ const DIRNAME = path.dirname(fileURLToPath(import.meta.url));
10
+ const DEBUG_SERVER_TRACE_ENABLED = process.env.WARPO_DEBUG_SERVER_TRACE === "1";
11
+ const DEBUG_SERVER_TRACE_FILE = path.join(process.cwd(), ".warpo-debug-server-trace.log");
12
+ if (DEBUG_SERVER_TRACE_ENABLED) {
13
+ try {
14
+ writeFileSync(DEBUG_SERVER_TRACE_FILE, "");
15
+ }
16
+ catch {
17
+ // Tracing should never block launching the runtime.
18
+ }
19
+ }
20
+ function trace(message) {
21
+ if (DEBUG_SERVER_TRACE_ENABLED) {
22
+ try {
23
+ appendFileSync(DEBUG_SERVER_TRACE_FILE, `[node-debugger] ${message}\n`);
24
+ }
25
+ catch {
26
+ // Tracing should never block launching the runtime.
27
+ }
28
+ }
29
+ }
30
+ function findFreePort() {
31
+ return new Promise((resolve, reject) => {
32
+ const srv = net.createServer();
33
+ srv.listen(0, "127.0.0.1", () => {
34
+ const addr = srv.address();
35
+ if (addr && typeof addr === "object") {
36
+ srv.close(() => resolve(addr.port));
37
+ }
38
+ else {
39
+ srv.close(() => reject(new Error("Failed to obtain a free port")));
40
+ }
41
+ });
42
+ srv.on("error", reject);
43
+ });
44
+ }
45
+ function wait(ms) {
46
+ return new Promise((resolve) => {
47
+ setTimeout(resolve, ms);
48
+ });
49
+ }
50
+ export class NodeDebugger {
51
+ name = "node";
52
+ onModuleLoad;
53
+ onPause;
54
+ child;
55
+ ws;
56
+ cdpId = 0;
57
+ pendingCommandCallbacks = new Map();
58
+ paused = false;
59
+ wasmFilePath;
60
+ async launch(config) {
61
+ this.wasmFilePath = config.wasmFilePath;
62
+ const port = await findFreePort();
63
+ this.child = spawn(process.execPath, [
64
+ `--inspect=${port}`,
65
+ path.join(DIRNAME, "wasmEntry.js"),
66
+ config.wasmFilePath,
67
+ config.entryFunctionName,
68
+ ...config.args.map(String),
69
+ ], { stdio: ["pipe", "pipe", "pipe"] });
70
+ const wsUrl = await this.fetchWsUrl(port);
71
+ await this.connectCDP(wsUrl);
72
+ }
73
+ dispose() {
74
+ this.paused = false;
75
+ this.wasmFilePath = undefined;
76
+ this.ws?.close();
77
+ this.child?.kill();
78
+ }
79
+ isPaused() {
80
+ return this.paused;
81
+ }
82
+ pause() {
83
+ this.sendCommand("Debugger.pause");
84
+ }
85
+ async resume() {
86
+ await this.waitForCommand("Debugger.resume");
87
+ this.paused = false;
88
+ }
89
+ finishModuleLoad() {
90
+ this.sendCommand("Runtime.runIfWaitingForDebugger");
91
+ }
92
+ setWasmBreakpoint(module, bytecodeOffset, callbacks) {
93
+ this.sendCommand("Debugger.setBreakpointByUrl", {
94
+ url: module.url,
95
+ lineNumber: 0,
96
+ columnNumber: bytecodeOffset,
97
+ }, {
98
+ onSuccess: () => {
99
+ trace(`setWasmBreakpoint success offset=${bytecodeOffset}`);
100
+ callbacks?.onSuccess?.();
101
+ },
102
+ onError: (error) => {
103
+ trace(`setWasmBreakpoint error offset=${bytecodeOffset} message=${error.message}`);
104
+ callbacks?.onError?.(error);
105
+ },
106
+ });
107
+ }
108
+ async fetchWsUrl(port) {
109
+ const deadline = Date.now() + 5000;
110
+ while (Date.now() < deadline) {
111
+ try {
112
+ const resp = await fetch(`http://127.0.0.1:${port}/json`);
113
+ if (!resp.ok) {
114
+ throw new Error(`inspector endpoint returned ${resp.status}`);
115
+ }
116
+ const [info] = (await resp.json());
117
+ if (info?.webSocketDebuggerUrl) {
118
+ return info.webSocketDebuggerUrl;
119
+ }
120
+ }
121
+ catch {
122
+ // The inspector endpoint is not always ready immediately after spawn.
123
+ }
124
+ await wait(50);
125
+ }
126
+ throw new Error(`timed out waiting for inspector endpoint on port ${port}`);
127
+ }
128
+ sendCommand(method, params, callbacks) {
129
+ if (!this.ws) {
130
+ throw new Error("debugger is not connected");
131
+ }
132
+ const id = ++this.cdpId;
133
+ if (callbacks) {
134
+ this.pendingCommandCallbacks.set(id, callbacks);
135
+ }
136
+ this.ws.send(JSON.stringify({ id, method, params }));
137
+ }
138
+ waitForCommand(method, params) {
139
+ return new Promise((resolve, reject) => {
140
+ this.sendCommand(method, params, {
141
+ onSuccess: () => {
142
+ resolve();
143
+ },
144
+ onError: (error) => {
145
+ reject(error);
146
+ },
147
+ });
148
+ });
149
+ }
150
+ connectCDP(wsUrl) {
151
+ return new Promise((resolve, reject) => {
152
+ const ws = new WebSocket(wsUrl);
153
+ this.ws = ws;
154
+ ws.addEventListener("open", () => {
155
+ void (async () => {
156
+ try {
157
+ trace("ws open -> Debugger.enable");
158
+ await this.waitForCommand("Debugger.enable");
159
+ trace("Debugger.enable -> Debugger.setBreakpointsActive");
160
+ await this.waitForCommand("Debugger.setBreakpointsActive", { active: true });
161
+ trace("Debugger.setBreakpointsActive -> Runtime.runIfWaitingForDebugger");
162
+ await this.waitForCommand("Runtime.runIfWaitingForDebugger");
163
+ trace("Runtime.runIfWaitingForDebugger -> launch ready");
164
+ resolve();
165
+ }
166
+ catch (error) {
167
+ reject(error instanceof Error ? error : new Error(String(error)));
168
+ }
169
+ })();
170
+ });
171
+ ws.addEventListener("error", (e) => {
172
+ const message = e instanceof Error ? e.message : "WebSocket connection failed";
173
+ reject(new Error(message));
174
+ });
175
+ ws.addEventListener("message", (ev) => {
176
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
177
+ const msg = JSON.parse(String(ev.data));
178
+ if (typeof msg.id === "number") {
179
+ this.handleCommandResponse(msg.id, msg);
180
+ return;
181
+ }
182
+ if (msg.method === "Debugger.paused") {
183
+ const reason = this.getPauseReason(msg.params);
184
+ this.paused = true;
185
+ trace(`Debugger.paused reason=${reason}`);
186
+ void Promise.resolve(this.onPause?.({ reason })).catch((error) => {
187
+ trace(`pause handler failed: ${error instanceof Error ? error.message : "unknown error"}`);
188
+ });
189
+ return;
190
+ }
191
+ if (msg.method === "Debugger.scriptParsed") {
192
+ const params = msg.params;
193
+ const lang = typeof params?.scriptLanguage === "string" ? params.scriptLanguage : "unknown";
194
+ const url = typeof params?.url === "string" ? params.url : "";
195
+ trace(`Debugger.scriptParsed language=${lang} url=${url}`);
196
+ if (params && lang === "WebAssembly" && typeof params.scriptId === "string") {
197
+ trace(`wasm module detected scriptId=${params.scriptId}`);
198
+ void this.handleModuleLoad({
199
+ scriptId: params.scriptId,
200
+ url,
201
+ }).catch((error) => {
202
+ const message = error instanceof Error ? error.message : "unknown error";
203
+ trace(`module load handler failed: ${message}`);
204
+ process.stderr.write(`[node-debugger] module load handler failed: ${message}\n`);
205
+ });
206
+ }
207
+ }
208
+ });
209
+ });
210
+ }
211
+ handleCommandResponse(id, msg) {
212
+ const callbacks = this.pendingCommandCallbacks.get(id);
213
+ if (!callbacks) {
214
+ return;
215
+ }
216
+ this.pendingCommandCallbacks.delete(id);
217
+ if (msg.error) {
218
+ callbacks.onError?.(new Error(msg.error.message ?? "CDP command failed"));
219
+ return;
220
+ }
221
+ callbacks.onSuccess?.();
222
+ }
223
+ getPauseReason(params) {
224
+ if (Array.isArray(params?.hitBreakpoints) && params.hitBreakpoints.length > 0) {
225
+ return "breakpoint";
226
+ }
227
+ if (typeof params?.reason === "string") {
228
+ return params.reason;
229
+ }
230
+ return "unknown";
231
+ }
232
+ async handleModuleLoad(runtimeInfo) {
233
+ if (!this.wasmFilePath) {
234
+ throw new Error("wasm file path is not available");
235
+ }
236
+ const module = await DebuggerWasmModule.load(this.wasmFilePath, runtimeInfo);
237
+ void this.onModuleLoad?.(module);
238
+ }
239
+ }
240
+ //# sourceMappingURL=nodeDebugger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeDebugger.js","sourceRoot":"","sources":["../../tools/debug_server/nodeDebugger.ts"],"names":[],"mappings":"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"}
@@ -3,11 +3,15 @@
3
3
  import { DebugClient } from "@vscode/debugadapter-testsupport";
4
4
  import * as assert from "node:assert/strict";
5
5
  import * as path from "node:path";
6
- import { describe, it, beforeEach, afterEach } from "node:test";
6
+ import { describe, it, before, beforeEach, afterEach } from "node:test";
7
7
  import { fileURLToPath } from "node:url";
8
8
  import { launchDapServer } from "./launcher.js";
9
+ import { build } from "../../scripts/lib.js";
9
10
  const DIRNAME = path.dirname(fileURLToPath(import.meta.url));
10
11
  const DAP_SERVER = path.resolve(DIRNAME, "..", "..", "..", "dist", "debug_server", "dapServer.js");
12
+ const TEST_MODULE_DIR = path.resolve(DIRNAME, "testModule");
13
+ const TEST_MODULE_SOURCE = path.join(TEST_MODULE_DIR, "debugger_basic.ts");
14
+ const TEST_MODULE_OUTPUT = path.join(TEST_MODULE_DIR, "build/debugger_basic.wasm");
11
15
  const waitForExit = (child, timeoutMs) => new Promise((resolve) => {
12
16
  if (child.exitCode !== null) {
13
17
  resolve(true);
@@ -23,6 +27,19 @@ const waitForExit = (child, timeoutMs) => new Promise((resolve) => {
23
27
  };
24
28
  child.once("exit", onExit);
25
29
  });
30
+ before(async () => {
31
+ let buildOutput = "";
32
+ const exitCode = await build({
33
+ argv: [TEST_MODULE_SOURCE, "-o", TEST_MODULE_OUTPUT, "--debug"],
34
+ cwd: TEST_MODULE_DIR,
35
+ onStdout: (chunk) => {
36
+ buildOutput += chunk;
37
+ },
38
+ });
39
+ if (exitCode !== 0) {
40
+ throw new Error(`failed to build debugger test module: ${buildOutput}`);
41
+ }
42
+ });
26
43
  void describe("WarpoDebugSession", () => {
27
44
  let dc;
28
45
  let serverChild;
@@ -57,5 +74,32 @@ void describe("WarpoDebugSession", () => {
57
74
  assert.equal(response.body.breakpoints[1].verified, true);
58
75
  assert.equal(response.body.breakpoints[1].line, 10);
59
76
  });
77
+ void it("should report the built wasm as a loaded source on launch", { timeout: 5000 }, async () => {
78
+ await dc.initializeRequest();
79
+ const breakpointResponse = await dc.setBreakpointsRequest({
80
+ source: { path: TEST_MODULE_SOURCE },
81
+ breakpoints: [{ line: 3 }],
82
+ });
83
+ assert.equal(breakpointResponse.body.breakpoints.length, 1);
84
+ assert.equal(breakpointResponse.body.breakpoints[0].verified, true);
85
+ assert.equal(breakpointResponse.body.breakpoints[0].line, 3);
86
+ const launchArgs = {
87
+ program: TEST_MODULE_OUTPUT,
88
+ launchType: "wasm file",
89
+ runtime: "node",
90
+ entryFunctionName: "_start",
91
+ };
92
+ const loadedSourcePromise = dc.waitForEvent("loadedSource");
93
+ const stoppedPromise = dc.waitForEvent("stopped");
94
+ await dc.launchRequest(launchArgs);
95
+ const loadedSourceEvent = await loadedSourcePromise;
96
+ const loadedSourceBody = loadedSourceEvent.body;
97
+ const stoppedEvent = await stoppedPromise;
98
+ const stoppedBody = stoppedEvent.body;
99
+ assert.equal(loadedSourceBody?.reason, "new");
100
+ assert.equal(loadedSourceBody?.source?.path, path.resolve(TEST_MODULE_OUTPUT));
101
+ assert.equal(loadedSourceBody?.source?.name, path.basename(TEST_MODULE_OUTPUT));
102
+ assert.equal(stoppedBody?.reason, "breakpoint");
103
+ });
60
104
  });
61
105
  //# sourceMappingURL=debugSession.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"debugSession.test.js","sourceRoot":"","sources":["../../../tools/debug_server/tests/debugSession.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"debugSession.test.js","sourceRoot":"","sources":["../../../tools/debug_server/tests/debugSession.test.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAE/D,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC;AAC7C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAwB,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;AACnG,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAC5D,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAC;AAC3E,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,2BAA2B,CAAC,CAAC;AAEnF,MAAM,WAAW,GAAG,CAAC,KAA+B,EAAE,SAAiB,EAAoB,EAAE,CAC3F,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;IACtB,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;QAC5B,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC,EAAE,SAAS,CAAC,CAAC;IAEd,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC,CAAC;IAEF,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEL,MAAM,CAAC,KAAK,IAAI,EAAE;IAChB,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC;QAC3B,IAAI,EAAE,CAAC,kBAAkB,EAAE,IAAI,EAAE,kBAAkB,EAAE,SAAS,CAAC;QAC/D,GAAG,EAAE,eAAe;QACpB,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;YAC1B,WAAW,IAAI,KAAK,CAAC;QACvB,CAAC;KACF,CAAC,CAAC;IACH,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,yCAAyC,WAAW,EAAE,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,KAAK,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACtC,IAAI,EAAe,CAAC;IACpB,IAAI,WAAqC,CAAC;IAE1C,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QAC1D,WAAW,GAAG,KAAK,CAAC;QACpB,EAAE,GAAG,IAAI,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;QACtC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,0CAA0C;QAC5C,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,WAAW,CAAC,IAAI,EAAE,CAAC;YACnB,MAAM,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,KAAK,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;QAE7B,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,qBAAqB,CAAC;YAC9C,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YAC3B,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;SACzC,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,KAAK,EAAE,CAAC,2DAA2D,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,IAAI,EAAE;QACjG,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;QAE7B,MAAM,kBAAkB,GAAG,MAAM,EAAE,CAAC,qBAAqB,CAAC;YACxD,MAAM,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE;YACpC,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;SAC3B,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC5D,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACpE,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAE7D,MAAM,UAAU,GAKZ;YACF,OAAO,EAAE,kBAAkB;YAC3B,UAAU,EAAE,WAAW;YACvB,OAAO,EAAE,MAAM;YACf,iBAAiB,EAAE,QAAQ;SAC5B,CAAC;QAEF,MAAM,mBAAmB,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAElD,MAAM,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAEnC,MAAM,iBAAiB,GAAG,MAAM,mBAAmB,CAAC;QACpD,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,IAAsE,CAAC;QAClH,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC;QAC1C,MAAM,WAAW,GAAG,YAAY,CAAC,IAAuC,CAAC;QAEzE,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC/E,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAChF,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function _start(): i32;
@@ -0,0 +1,6 @@
1
+ // @ts-nocheck
2
+ export function _start() {
3
+ let a = 1;
4
+ return a;
5
+ }
6
+ //# sourceMappingURL=debugger_basic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debugger_basic.js","sourceRoot":"","sources":["../../../../tools/debug_server/tests/testModule/debugger_basic.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,MAAM,UAAU,MAAM;IACpB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,36 @@
1
+ // Copyright (C) 2025 wasm-ecosystem
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /* eslint-disable n/no-process-exit, unicorn/no-process-exit */
4
+ import * as fs from "node:fs";
5
+ import * as inspector from "node:inspector";
6
+ import * as path from "node:path";
7
+ const [wasmFilePath, entryFunctionName, ...rawArgs] = process.argv.slice(2);
8
+ if (!wasmFilePath || !entryFunctionName) {
9
+ console.error("Usage: wasmEntry.js <wasmFilePath> <entryFunctionName> [args...]");
10
+ process.exit(1);
11
+ }
12
+ const resolvedPath = path.resolve(wasmFilePath);
13
+ if (!fs.existsSync(resolvedPath)) {
14
+ console.error(`Wasm file not found: ${resolvedPath}`);
15
+ process.exit(1);
16
+ }
17
+ const args = rawArgs.map(Number);
18
+ async function main() {
19
+ inspector.waitForDebugger();
20
+ const buffer = fs.readFileSync(resolvedPath);
21
+ const module = await WebAssembly.compile(buffer);
22
+ const instance = await WebAssembly.instantiate(module, {});
23
+ inspector.waitForDebugger();
24
+ const fn = instance.exports[entryFunctionName];
25
+ if (typeof fn !== "function") {
26
+ const keys = Object.keys(instance.exports).join(", ");
27
+ console.error(`Export "${entryFunctionName}" is not a function. Available exports: ${keys}`);
28
+ process.exit(1);
29
+ }
30
+ console.log(`Calling ${entryFunctionName}(${args.join(", ")})...`);
31
+ const result = fn(...args);
32
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string, @typescript-eslint/restrict-template-expressions
33
+ console.log(`Result: ${result}`);
34
+ }
35
+ await main();
36
+ //# sourceMappingURL=wasmEntry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wasmEntry.js","sourceRoot":"","sources":["../../tools/debug_server/wasmEntry.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AACtC,+DAA+D;AAE/D,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,CAAC,YAAY,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAE5E,IAAI,CAAC,YAAY,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACxC,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;IAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;AAChD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;IACjC,OAAO,CAAC,KAAK,CAAC,wBAAwB,YAAY,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAEjC,KAAK,UAAU,IAAI;IACjB,SAAS,CAAC,eAAe,EAAE,CAAC;IAE5B,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAE3D,SAAS,CAAC,eAAe,EAAE,CAAC;IAE5B,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC/C,IAAI,OAAO,EAAE,KAAK,UAAU,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO,CAAC,KAAK,CAAC,WAAW,iBAAiB,2CAA2C,IAAI,EAAE,CAAC,CAAC;QAC7F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,iBAAiB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnE,MAAM,MAAM,GAAI,EAAkC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5D,kHAAkH;IAClH,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,IAAI,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { HeapComparison, HeapSnapshot } from "./types.js";
2
+ export declare function compareSnapshots(before: HeapSnapshot, after: HeapSnapshot): HeapComparison;
@@ -0,0 +1,77 @@
1
+ // Copyright (C) 2026 wasm-ecosystem
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export function compareSnapshots(before, after) {
4
+ const beforeConstructors = new Map(before.constructors.map((entry) => [entry.className, entry]));
5
+ const afterConstructors = new Map(after.constructors.map((entry) => [entry.className, entry]));
6
+ const classNames = new Set([...beforeConstructors.keys(), ...afterConstructors.keys()]);
7
+ return {
8
+ beforeTotalHeapSize: before.totalHeapSize,
9
+ afterTotalHeapSize: after.totalHeapSize,
10
+ totalHeapSizeDelta: after.totalHeapSize - before.totalHeapSize,
11
+ beforeTotalLiveSize: before.totalLiveSize,
12
+ afterTotalLiveSize: after.totalLiveSize,
13
+ totalLiveSizeDelta: after.totalLiveSize - before.totalLiveSize,
14
+ constructors: [...classNames]
15
+ .map((className) => compareConstructorEntries(className, beforeConstructors.get(className), afterConstructors.get(className)))
16
+ .filter((entry) => entry.instances.length > 0)
17
+ .toSorted(sortConstructorComparisons),
18
+ };
19
+ }
20
+ function compareConstructorEntries(className, beforeEntry, afterEntry) {
21
+ const beforeInstancesByAddress = indexInstancesByAddress(beforeEntry?.instances ?? []);
22
+ const afterInstancesByAddress = indexInstancesByAddress(afterEntry?.instances ?? []);
23
+ const newInstances = [...afterInstancesByAddress.entries()]
24
+ .filter(([address]) => !beforeInstancesByAddress.has(address))
25
+ .map(([, instance]) => ({
26
+ address: instance.address,
27
+ shallowSize: instance.shallowSize,
28
+ retainedSize: instance.retainedSize,
29
+ changeKind: "new",
30
+ }));
31
+ const deletedInstances = [...beforeInstancesByAddress.entries()]
32
+ .filter(([address]) => !afterInstancesByAddress.has(address))
33
+ .map(([, instance]) => ({
34
+ address: instance.address,
35
+ shallowSize: instance.shallowSize,
36
+ retainedSize: instance.retainedSize,
37
+ changeKind: "delete",
38
+ }));
39
+ const instances = [...newInstances, ...deletedInstances].toSorted(sortComparisonInstances);
40
+ const allocatedSize = sumShallowSize(newInstances);
41
+ const freedSize = sumShallowSize(deletedInstances);
42
+ return {
43
+ className,
44
+ newCount: newInstances.length,
45
+ deletedCount: deletedInstances.length,
46
+ countDelta: newInstances.length - deletedInstances.length,
47
+ allocatedSize,
48
+ freedSize,
49
+ sizeDelta: allocatedSize - freedSize,
50
+ instances,
51
+ };
52
+ }
53
+ function indexInstancesByAddress(instances) {
54
+ return new Map(instances.map((instance) => [instance.address, instance]));
55
+ }
56
+ function sortConstructorComparisons(lhs, rhs) {
57
+ return (rhs.sizeDelta - lhs.sizeDelta ||
58
+ rhs.allocatedSize - lhs.allocatedSize ||
59
+ rhs.countDelta - lhs.countDelta ||
60
+ lhs.className.localeCompare(rhs.className));
61
+ }
62
+ function sortComparisonInstances(lhs, rhs) {
63
+ return (compareChangeKind(lhs.changeKind, rhs.changeKind) ||
64
+ rhs.shallowSize - lhs.shallowSize ||
65
+ rhs.retainedSize - lhs.retainedSize ||
66
+ lhs.address - rhs.address);
67
+ }
68
+ function compareChangeKind(lhs, rhs) {
69
+ if (lhs === rhs) {
70
+ return 0;
71
+ }
72
+ return lhs === "new" ? -1 : 1;
73
+ }
74
+ function sumShallowSize(instances) {
75
+ return instances.reduce((sum, instance) => sum + instance.shallowSize, 0);
76
+ }
77
+ //# sourceMappingURL=comparison.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comparison.js","sourceRoot":"","sources":["../../../tools/heap_analyzer/src/comparison.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAWtC,MAAM,UAAU,gBAAgB,CAAC,MAAoB,EAAE,KAAmB;IACxE,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACjG,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/F,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,kBAAkB,CAAC,IAAI,EAAE,EAAE,GAAG,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAExF,OAAO;QACL,mBAAmB,EAAE,MAAM,CAAC,aAAa;QACzC,kBAAkB,EAAE,KAAK,CAAC,aAAa;QACvC,kBAAkB,EAAE,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa;QAC9D,mBAAmB,EAAE,MAAM,CAAC,aAAa;QACzC,kBAAkB,EAAE,KAAK,CAAC,aAAa;QACvC,kBAAkB,EAAE,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa;QAC9D,YAAY,EAAE,CAAC,GAAG,UAAU,CAAC;aAC1B,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CACjB,yBAAyB,CAAC,SAAS,EAAE,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAC1G;aACA,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;aAC7C,QAAQ,CAAC,0BAA0B,CAAC;KACxC,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAChC,SAAiB,EACjB,WAAyC,EACzC,UAAwC;IAExC,MAAM,wBAAwB,GAAG,uBAAuB,CAAC,WAAW,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC;IACvF,MAAM,uBAAuB,GAAG,uBAAuB,CAAC,UAAU,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC;IACrF,MAAM,YAAY,GAAyB,CAAC,GAAG,uBAAuB,CAAC,OAAO,EAAE,CAAC;SAC9E,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,wBAAwB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;SAC7D,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;QACtB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,UAAU,EAAE,KAAK;KAClB,CAAC,CAAC,CAAC;IACN,MAAM,gBAAgB,GAAyB,CAAC,GAAG,wBAAwB,CAAC,OAAO,EAAE,CAAC;SACnF,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;SAC5D,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;QACtB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,UAAU,EAAE,QAAQ;KACrB,CAAC,CAAC,CAAC;IACN,MAAM,SAAS,GAAG,CAAC,GAAG,YAAY,EAAE,GAAG,gBAAgB,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;IAC3F,MAAM,aAAa,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAEnD,OAAO;QACL,SAAS;QACT,QAAQ,EAAE,YAAY,CAAC,MAAM;QAC7B,YAAY,EAAE,gBAAgB,CAAC,MAAM;QACrC,UAAU,EAAE,YAAY,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM;QACzD,aAAa;QACb,SAAS;QACT,SAAS,EAAE,aAAa,GAAG,SAAS;QACpC,SAAS;KACV,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,SAAgC;IAC/D,OAAO,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,0BAA0B,CAAC,GAA+B,EAAE,GAA+B;IAClG,OAAO,CACL,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS;QAC7B,GAAG,CAAC,aAAa,GAAG,GAAG,CAAC,aAAa;QACrC,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU;QAC/B,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAC3C,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,GAAuB,EAAE,GAAuB;IAC/E,OAAO,CACL,iBAAiB,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC;QACjD,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW;QACjC,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY;QACnC,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAC1B,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAqC,EAAE,GAAqC;IACrG,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;QAChB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,cAAc,CAAC,SAAyD;IAC/E,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,GAAG,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,21 @@
1
+ export declare const AL_BITS = 4;
2
+ export declare const AL_SIZE: number;
3
+ export declare const AL_MASK: number;
4
+ export declare const BLOCK_OVERHEAD = 4;
5
+ export declare const OBJECT_OVERHEAD = 16;
6
+ export declare const TOTAL_OVERHEAD: number;
7
+ export declare const SL_BITS = 4;
8
+ export declare const SB_BITS = 8;
9
+ export declare const FL_BITS = 23;
10
+ export declare const SL_SIZE: number;
11
+ export declare const ROOT_SIZE = 1572;
12
+ export declare const FREE = 1;
13
+ export declare const LEFT_FREE = 2;
14
+ export declare const TAGS_MASK = 3;
15
+ export declare const COLOR_MASK = 3;
16
+ export declare const GC_COLOR_GRAY = 2;
17
+ export declare const GC_COLOR_TRANSPARENT = 3;
18
+ export declare const DUMP_MAGIC = 1145590593;
19
+ export declare const DUMP_MAGIC_BYTES: Uint8Array<ArrayBuffer>;
20
+ export declare const DUMP_VERSION = 2;
21
+ export declare const DUMP_HEADER_SIZE = 24;
@@ -0,0 +1,30 @@
1
+ // Copyright (C) 2026 wasm-ecosystem
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ // TLSF Allocator Constants (32-bit)
4
+ export const AL_BITS = 4;
5
+ export const AL_SIZE = 1 << AL_BITS; // 16
6
+ export const AL_MASK = AL_SIZE - 1; // 15
7
+ export const BLOCK_OVERHEAD = 4; // mmInfo only
8
+ export const OBJECT_OVERHEAD = 16; // nextWithColor + prev + rtId + rtSize
9
+ export const TOTAL_OVERHEAD = BLOCK_OVERHEAD + OBJECT_OVERHEAD; // 20
10
+ export const SL_BITS = 4;
11
+ export const SB_BITS = 8;
12
+ export const FL_BITS = 23;
13
+ export const SL_SIZE = 1 << SL_BITS; // 16
14
+ export const ROOT_SIZE = 1572; // TLSF root structure size
15
+ // Block flags (in mmInfo)
16
+ export const FREE = 1;
17
+ export const LEFT_FREE = 2;
18
+ export const TAGS_MASK = 3;
19
+ // GC Color (in nextWithColor & 3)
20
+ export const COLOR_MASK = 3;
21
+ // 0 and 1 are white/black but swap each GC cycle (white ^= 1 in rt/itcms.ts)
22
+ // Only gray (2) and transparent (3) have fixed meaning
23
+ export const GC_COLOR_GRAY = 2;
24
+ export const GC_COLOR_TRANSPARENT = 3; // pinned, always reachable
25
+ // Dump file
26
+ export const DUMP_MAGIC = 0x44485341; // "A S H D" in LE
27
+ export const DUMP_MAGIC_BYTES = new Uint8Array([0x41, 0x53, 0x48, 0x44]); // A, S, H, D
28
+ export const DUMP_VERSION = 2;
29
+ export const DUMP_HEADER_SIZE = 24;
30
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../tools/heap_analyzer/src/constants.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC,oCAAoC;AACpC,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC;AACzB,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,KAAK;AAC1C,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK;AAEzC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,cAAc;AAC/C,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC,CAAC,uCAAuC;AAC1E,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,GAAG,eAAe,CAAC,CAAC,KAAK;AAErE,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC;AACzB,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC;AACzB,MAAM,CAAC,MAAM,OAAO,GAAG,EAAE,CAAC;AAC1B,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,KAAK;AAC1C,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,2BAA2B;AAE1D,0BAA0B;AAC1B,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC;AACtB,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;AAC3B,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;AAE3B,kCAAkC;AAClC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC;AAC5B,6EAA6E;AAC7E,uDAAuD;AACvD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC;AAC/B,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,CAAC,2BAA2B;AAElE,YAAY;AACZ,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,kBAAkB;AACxD,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa;AACvF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAC9B,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { type ClassLayout, type GlobalRoot } from "./types.js";
2
+ export declare function attachBuiltinKind(classLayout: Pick<ClassLayout, "name" | "builtinKind">): void;
3
+ /**
4
+ * Resolves class layouts and global-root metadata from WebAssembly debug
5
+ * information and provides helper queries for reference scanning.
6
+ *
7
+ * Only classes with a runtime ID (`DW_AT_signature`) are included.
8
+ */
9
+ export declare class DebugInfoResolver {
10
+ private readonly layoutMap;
11
+ private readonly globalVariableDebugInfos;
12
+ private readonly wasmGlobalEntries;
13
+ private constructor();
14
+ static fromWasm(wasmBinary: Uint8Array | ArrayBuffer): DebugInfoResolver;
15
+ getLayouts(): ClassLayout[];
16
+ /** Returns class name, or "Class#<id>" if not found in debug info */
17
+ getClassName(classId: number): string;
18
+ /** Returns ClassDef or undefined */
19
+ getClassDef(classId: number): ClassLayout | undefined;
20
+ getGlobalRoots(mutableI32GlobalValues: number[]): GlobalRoot[];
21
+ /** Maps i32 wasm global indices to runtime mutable values or immutable initial values. */
22
+ private buildI32GlobalValueMap;
23
+ }
24
+ /**
25
+ * Resolve all class layouts from DWARF debug information embedded in a
26
+ * WebAssembly binary.
27
+ *
28
+ * Only classes with a runtime ID (`DW_AT_signature`) are included.
29
+ */
30
+ export declare function resolveClassLayouts(wasmBinary: Uint8Array | ArrayBuffer): ClassLayout[];