From f60e5ac32c2347fa76d4c0e0596d203609bd0311 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Wed, 20 Sep 2023 15:17:43 -0700 Subject: [PATCH] chore: add test cases for wasm dwarf debugging Closes #1789 --- src/adapter/breakpoints.ts | 26 +- src/adapter/stackTrace.ts | 26 +- src/test/logger.ts | 6 +- src/test/node/node-runtime.test.ts | 4 +- src/test/stacks/stacksTest.ts | 10 +- src/test/variables/variablesTest.ts | 2 +- src/test/wasm/wasm.test.ts | 149 ++ .../wasm/webassembly-dwarf-basic-stepping.txt | 55 + ...line-breakpoints-set-at-all-call-sites.txt | 59 + ...embly-dwarf-inline-function-stepping-1.txt | 172 ++ ...embly-dwarf-inline-function-stepping-2.txt | 47 + ...webassembly-dwarf-scopes-and-variables.txt | 42 + src/ui/dwarfModuleProviderImpl.ts | 7 + .../web/dwarf/diverse-inlining-extern.c | 7 + .../web/dwarf/diverse-inlining-main.c | 10 + testWorkspace/web/dwarf/diverse-inlining.h | 5 + testWorkspace/web/dwarf/diverse-inlining.html | 1294 ++++++++++++ testWorkspace/web/dwarf/diverse-inlining.js | 1740 +++++++++++++++++ testWorkspace/web/dwarf/diverse-inlining.wasm | Bin 0 -> 19338 bytes testWorkspace/web/dwarf/fibonacci.c | 19 + testWorkspace/web/dwarf/fibonacci.html | 1294 ++++++++++++ testWorkspace/web/dwarf/fibonacci.js | 1694 ++++++++++++++++ testWorkspace/web/dwarf/fibonacci.wasm | Bin 0 -> 92657 bytes testWorkspace/web/dwarf/readme.md | 1 + 24 files changed, 6642 insertions(+), 27 deletions(-) create mode 100644 src/test/wasm/webassembly-dwarf-basic-stepping.txt create mode 100644 src/test/wasm/webassembly-dwarf-inline-breakpoints-set-at-all-call-sites.txt create mode 100644 src/test/wasm/webassembly-dwarf-inline-function-stepping-1.txt create mode 100644 src/test/wasm/webassembly-dwarf-inline-function-stepping-2.txt create mode 100644 src/test/wasm/webassembly-dwarf-scopes-and-variables.txt create mode 100644 testWorkspace/web/dwarf/diverse-inlining-extern.c create mode 100644 testWorkspace/web/dwarf/diverse-inlining-main.c create mode 100644 testWorkspace/web/dwarf/diverse-inlining.h create mode 100644 testWorkspace/web/dwarf/diverse-inlining.html create mode 100644 testWorkspace/web/dwarf/diverse-inlining.js create mode 100644 testWorkspace/web/dwarf/diverse-inlining.wasm create mode 100644 testWorkspace/web/dwarf/fibonacci.c create mode 100644 testWorkspace/web/dwarf/fibonacci.html create mode 100644 testWorkspace/web/dwarf/fibonacci.js create mode 100644 testWorkspace/web/dwarf/fibonacci.wasm create mode 100644 testWorkspace/web/dwarf/readme.md diff --git a/src/adapter/breakpoints.ts b/src/adapter/breakpoints.ts index f2c631119..239593900 100644 --- a/src/adapter/breakpoints.ts +++ b/src/adapter/breakpoints.ts @@ -487,16 +487,18 @@ export class BreakpointManager { const perScriptSm = (this.launchConfig as IChromiumBaseConfiguration).perScriptSourcemaps === 'yes'; + let entryBpSet: Promise; if (perScriptSm) { - return Promise.all([ + entryBpSet = Promise.all([ this.updateEntryBreakpointMode(thread, EntryBreakpointMode.Greedy), thread.setScriptSourceMapHandler(false, this._scriptSourceMapHandler), ]).then(() => true); } else if (this._breakpointsPredictor && !this.launchConfig.pauseForSourceMap) { - return thread.setScriptSourceMapHandler(false, this._scriptSourceMapHandler); + entryBpSet = thread.setScriptSourceMapHandler(false, this._scriptSourceMapHandler); } else { - return thread.setScriptSourceMapHandler(true, this._scriptSourceMapHandler); + entryBpSet = thread.setScriptSourceMapHandler(true, this._scriptSourceMapHandler); } + this._sourceMapHandlerInstalled = { entryBpSet }; } private async _uninstallSourceMapHandler(thread: Thread) { @@ -517,7 +519,7 @@ export class BreakpointManager { ids: number[], ): Promise { if (!this._sourceMapHandlerInstalled && this._thread && params.breakpoints?.length) { - this._sourceMapHandlerInstalled = { entryBpSet: this._installSourceMapHandler(this._thread) }; + this._installSourceMapHandler(this._thread); } const wasEntryBpSet = await this._sourceMapHandlerInstalled?.entryBpSet; @@ -604,6 +606,14 @@ export class BreakpointManager { return { breakpoints: [] }; } + // Ignore no-op breakpoint sets. These can come in from VS Code at the start + // of the session (if a file only has disabled breakpoints) and make it look + // like the user had removed all breakpoints they previously set, causing + // us to uninstall/re-install the SM handler repeatedly. + if (result.unbound.length === 0 && result.new.length === 0) { + return { breakpoints: [] }; + } + // Cleanup existing breakpoints before setting new ones. this._totalBreakpointsCount -= result.unbound.length; await Promise.all( @@ -615,8 +625,12 @@ export class BreakpointManager { this._totalBreakpointsCount += result.new.length; - if (this._thread && this._totalBreakpointsCount === 0 && this._sourceMapHandlerInstalled) { - this._uninstallSourceMapHandler(this._thread); + if (this._thread) { + if (this._totalBreakpointsCount === 0 && this._sourceMapHandlerInstalled) { + this._uninstallSourceMapHandler(this._thread); + } else if (this._totalBreakpointsCount > 0 && !this._sourceMapHandlerInstalled) { + this._installSourceMapHandler(this._thread); + } } if (thread && result.new.length) { diff --git a/src/adapter/stackTrace.ts b/src/adapter/stackTrace.ts index a961eeb17..fcefdcbdf 100644 --- a/src/adapter/stackTrace.ts +++ b/src/adapter/stackTrace.ts @@ -162,6 +162,7 @@ export class StackTrace { continue; } + const newFrames: InlinedFrame[] = []; for (let i = 0; i < stack.length; i++) { const inlinedFrame = new InlinedFrame({ source, @@ -170,9 +171,12 @@ export class StackTrace { name: stack[i].name, root: frame, }); - - this._appendFrame(inlinedFrame, last++); + this._frameById.set(inlinedFrame.frameId, inlinedFrame); + newFrames.push(inlinedFrame); } + + this._spliceFrames(last, 1, ...newFrames); + last += stack.length - 1; } return last; @@ -206,17 +210,19 @@ export class StackTrace { } } - private _appendFrame(frame: FrameElement, index?: number) { - if (index !== undefined) { - this.frames.splice(index, 0, frame); - } else { - this.frames.push(frame); - } - if (!(frame instanceof AsyncSeparator)) { - this._frameById.set(frame.frameId, frame); + private _spliceFrames(index: number, deleteCount: number, ...frames: FrameElement[]) { + this.frames.splice(index, deleteCount, ...frames); + for (const frame of frames) { + if (!(frame instanceof AsyncSeparator)) { + this._frameById.set(frame.frameId, frame); + } } } + private _appendFrame(frame: FrameElement) { + this._spliceFrames(this.frames.length, 0, frame); + } + public async formatAsNative(): Promise { return await this.formatWithMapper(frame => frame.formatAsNative()); } diff --git a/src/test/logger.ts b/src/test/logger.ts index eef20b10a..a9ce2fc31 100644 --- a/src/test/logger.ts +++ b/src/test/logger.ts @@ -148,7 +148,7 @@ export class Logger { return variable; } - async logStackTrace(threadId: number, withScopes?: boolean) { + async logStackTrace(threadId: number, withScopes = 0) { const initial = await this._dap.stackTrace({ threadId }); const stack = initial.stackFrames; let totalFrames = initial.totalFrames || stack.length; @@ -161,7 +161,7 @@ export class Logger { stack.push(...response.stackFrames); if (response.totalFrames) totalFrames = Math.min(totalFrames, response.totalFrames); } - let emptyLine = !!withScopes; + let emptyLine = withScopes > 0; for (const frame of stack) { if (emptyLine) this._log(''); if (frame.presentationHint === 'label') { @@ -178,7 +178,7 @@ export class Logger { frame.column }${origin}`, ); - if (!withScopes) continue; + if (withScopes-- <= 0) continue; const scopes = await this._dap.scopes({ frameId: frame.id }); if (typeof scopes === 'string') { this._log(` scope error: ${scopes}`); diff --git a/src/test/node/node-runtime.test.ts b/src/test/node/node-runtime.test.ts index 13288fb28..035d2fe8e 100644 --- a/src/test/node/node-runtime.test.ts +++ b/src/test/node/node-runtime.test.ts @@ -65,7 +65,7 @@ describe('node runtime', () => { handle.load(); const stoppedParams = await handle.dap.once('stopped'); await delay(200); // need to pause test to let debouncer update scripts - await handle.logger.logStackTrace(stoppedParams.threadId!, false); + await handle.logger.logStackTrace(stoppedParams.threadId!); handle.assertLog({ customAssert: assertSkipFiles }); }); @@ -89,7 +89,7 @@ describe('node runtime', () => { handle.dap.on('output', o => handle.logger.logOutput(o)); handle.dap.on('stopped', async o => { - await handle.logger.logStackTrace(o.threadId!, false); + await handle.logger.logStackTrace(o.threadId!); await handle.dap.continue({ threadId: o.threadId! }); }); diff --git a/src/test/stacks/stacksTest.ts b/src/test/stacks/stacksTest.ts index 8e94f9ec8..10315ccac 100644 --- a/src/test/stacks/stacksTest.ts +++ b/src/test/stacks/stacksTest.ts @@ -10,7 +10,7 @@ import { itIntegrates, waitForPause } from '../testIntegrationUtils'; describe('stacks', () => { async function dumpStackAndContinue(p: TestP, scopes: boolean) { const event = await p.dap.once('stopped'); - await p.logger.logStackTrace(event.threadId!, scopes); + await p.logger.logStackTrace(event.threadId!, scopes ? Infinity : 0); await p.dap.continue({ threadId: event.threadId! }); } @@ -250,7 +250,7 @@ describe('stacks', () => { async function waitForPausedThenDelayStackTrace(p: TestP, scopes: boolean) { const event = await p.dap.once('stopped'); await delay(200); // need to pause test to let debouncer update scripts - await p.logger.logStackTrace(event.threadId!, scopes); + await p.logger.logStackTrace(event.threadId!, scopes ? Infinity : 0); return event; } @@ -313,15 +313,15 @@ describe('stacks', () => { const event = await p.dap.once('stopped'); await delay(500); // need to pause test to let debouncer update scripts - await p.logger.logStackTrace(event.threadId!, false); + await p.logger.logStackTrace(event.threadId!); p.log('----send toggle skipfile status request----'); await p.dap.toggleSkipFileStatus({ resource: path }); - await p.logger.logStackTrace(event.threadId!, false); + await p.logger.logStackTrace(event.threadId!); p.log('----send (un)toggle skipfile status request----'); await p.dap.toggleSkipFileStatus({ resource: path }); - await p.logger.logStackTrace(event.threadId!, false); + await p.logger.logStackTrace(event.threadId!); p.assertLog(); }); diff --git a/src/test/variables/variablesTest.ts b/src/test/variables/variablesTest.ts index 50843d043..204bb37f2 100644 --- a/src/test/variables/variablesTest.ts +++ b/src/test/variables/variablesTest.ts @@ -365,7 +365,7 @@ describe('variables', () => { const p = await r.launchUrlAndLoad('minified/index.html'); p.cdp.Runtime.evaluate({ expression: `test()` }); const event = await p.dap.once('stopped'); - const stacks = await p.logger.logStackTrace(event.threadId!, true); + const stacks = await p.logger.logStackTrace(event.threadId!, Infinity); p.log('\nPreserves eval sourceURL (#1259):'); // https://github.com/microsoft/vscode-js-debug/issues/1259#issuecomment-1442584596 p.log( diff --git a/src/test/wasm/wasm.test.ts b/src/test/wasm/wasm.test.ts index 8fea3377d..a84e4771f 100644 --- a/src/test/wasm/wasm.test.ts +++ b/src/test/wasm/wasm.test.ts @@ -2,6 +2,8 @@ * Copyright (C) Microsoft Corporation. All rights reserved. *--------------------------------------------------------*/ +import Dap from '../../dap/api'; +import { TestRoot } from '../test'; import { itIntegrates } from '../testIntegrationUtils'; describe('webassembly', () => { @@ -47,4 +49,151 @@ describe('webassembly', () => { p.assertLog(); }); + + describe('dwarf', () => { + const prepare = async ( + r: TestRoot, + context: Mocha.Context, + file: string, + bp: Dap.SetBreakpointsParams, + ) => { + // starting the dwarf debugger can be pretty slow, I observed up to 40 + // seconds in one case :( + // context.timeout(120_000); + + const p = await r.launchUrlAndLoad(`dwarf/${file}.html`); + bp.source.path = p.workspacePath(bp.source.path!); + await p.dap.setBreakpoints(bp); + + await p.dap.once('breakpoint', bp => bp.breakpoint.verified); + await p.cdp.Page.reload({}); + return p; + }; + + itIntegrates('scopes and variables', async ({ r, context }) => { + const p = await prepare(r, context, 'fibonacci', { + source: { path: 'web/dwarf/fibonacci.c' }, + breakpoints: [{ line: 6 }], + }); + + const { threadId } = p.log(await p.dap.once('stopped')); + await p.logger.logStackTrace(threadId, 2); + + r.assertLog(); + }); + + itIntegrates('basic stepping', async ({ r, context }) => { + const p = await prepare(r, context, 'fibonacci', { + source: { path: 'web/dwarf/fibonacci.c' }, + breakpoints: [{ line: 6 }], + }); + + { + const { threadId } = p.log(await p.dap.once('stopped')); + await p.dap.setBreakpoints({ + source: { path: p.workspacePath('web/dwarf/fibonacci.c') }, + breakpoints: [], + }); + + p.dap.next({ threadId }); + } + + { + const { threadId } = p.log(await p.dap.once('stopped')); + await p.logger.logStackTrace(threadId); + p.dap.stepOut({ threadId }); + } + + { + const { threadId } = p.log(await p.dap.once('stopped')); + await p.logger.logStackTrace(threadId); + } + + r.assertLog(); + }); + + itIntegrates('inline breakpoints set at all call sites', async ({ r, context }) => { + const p = await prepare(r, context, 'diverse-inlining', { + source: { + path: 'web/dwarf/diverse-inlining.h', + }, + breakpoints: [{ line: 2 }], + }); + + { + const { threadId } = p.log(await p.dap.once('stopped')); + await p.logger.logStackTrace(threadId); + p.dap.continue({ threadId }); + } + + { + const { threadId } = p.log(await p.dap.once('stopped')); + await p.logger.logStackTrace(threadId, 2); + p.dap.continue({ threadId }); + } + + r.assertLog(); + }); + + itIntegrates('inline function stepping 1', async ({ r, context }) => { + const p = await prepare(r, context, 'diverse-inlining', { + source: { + path: 'web/dwarf/diverse-inlining-main.c', + }, + breakpoints: [{ line: 7 }], + }); + + const steps = [ + // stopped at `argc = foo(argc);` + 'stepIn', + // stopped at `INLINE static int` + 'stepOut', + // stopped at `argc = foo(argc);`, + 'next', + + // stopped at `argc = bar(argc);` + 'stepIn', + // stopped at `int bar(int x) {` + 'stepIn', + // stopped at `x = x + 1;` + 'stepIn', + ] as const; + + for (const step of steps) { + const { threadId } = p.log(await p.dap.once('stopped')); + await p.logger.logStackTrace(threadId); + p.dap[step]({ threadId }); + p.log(`---- ${step} ----`); + } + + const { threadId } = p.log(await p.dap.once('stopped')); + await p.logger.logStackTrace(threadId); + + r.assertLog(); + }); + + itIntegrates('inline function stepping 2', async ({ r, context }) => { + const p = await prepare(r, context, 'diverse-inlining', { + source: { + path: 'web/dwarf/diverse-inlining-extern.c', + }, + breakpoints: [{ line: 5 }], + }); + + // stopped at return foo() + { + const { threadId } = p.log(await p.dap.once('stopped')); + await p.logger.logStackTrace(threadId); + p.dap.next({ threadId }); + } + + // should be back in main, stepped over inline range + { + const { threadId } = p.log(await p.dap.once('stopped')); + await p.logger.logStackTrace(threadId); + } + + r.assertLog(); + }); + }); }); diff --git a/src/test/wasm/webassembly-dwarf-basic-stepping.txt b/src/test/wasm/webassembly-dwarf-basic-stepping.txt new file mode 100644 index 000000000..6be4cdfaa --- /dev/null +++ b/src/test/wasm/webassembly-dwarf-basic-stepping.txt @@ -0,0 +1,55 @@ +{ + allThreadsStopped : false + description : Paused on breakpoint + reason : breakpoint + threadId : +} +{ + allThreadsStopped : false + description : Paused + reason : step + threadId : +} +fib @ ${workspaceFolder}/web/dwarf/fibonacci.c:7:9 +main @ ${workspaceFolder}/web/dwarf/fibonacci.c:14:11 +Window.$main @ localhost꞉8001/dwarf/fibonacci.wat:230:1 + @ ${workspaceFolder}/web/dwarf/fibonacci.js:723:14 +Window.callMain @ ${workspaceFolder}/web/dwarf/fibonacci.js:1580:15 +Window.doRun @ ${workspaceFolder}/web/dwarf/fibonacci.js:1630:23 + @ ${workspaceFolder}/web/dwarf/fibonacci.js:1641:7 +----setTimeout---- +run @ ${workspaceFolder}/web/dwarf/fibonacci.js:1637:5 +runCaller @ ${workspaceFolder}/web/dwarf/fibonacci.js:1565:19 +removeRunDependency @ ${workspaceFolder}/web/dwarf/fibonacci.js:641:7 +receiveInstance @ ${workspaceFolder}/web/dwarf/fibonacci.js:860:5 +receiveInstantiationResult @ ${workspaceFolder}/web/dwarf/fibonacci.js:878:5 +----Promise.then---- + @ ${workspaceFolder}/web/dwarf/fibonacci.js:813:21 +----Promise.then---- +instantiateAsync @ ${workspaceFolder}/web/dwarf/fibonacci.js:805:62 +createWasm @ ${workspaceFolder}/web/dwarf/fibonacci.js:897:3 + @ ${workspaceFolder}/web/dwarf/fibonacci.js:1253:19 +{ + allThreadsStopped : false + description : Paused + reason : step + threadId : +} +main @ ${workspaceFolder}/web/dwarf/fibonacci.c:14:11 +Window.$main @ localhost꞉8001/dwarf/fibonacci.wat:230:1 + @ ${workspaceFolder}/web/dwarf/fibonacci.js:723:14 +Window.callMain @ ${workspaceFolder}/web/dwarf/fibonacci.js:1580:15 +Window.doRun @ ${workspaceFolder}/web/dwarf/fibonacci.js:1630:23 + @ ${workspaceFolder}/web/dwarf/fibonacci.js:1641:7 +----setTimeout---- +run @ ${workspaceFolder}/web/dwarf/fibonacci.js:1637:5 +runCaller @ ${workspaceFolder}/web/dwarf/fibonacci.js:1565:19 +removeRunDependency @ ${workspaceFolder}/web/dwarf/fibonacci.js:641:7 +receiveInstance @ ${workspaceFolder}/web/dwarf/fibonacci.js:860:5 +receiveInstantiationResult @ ${workspaceFolder}/web/dwarf/fibonacci.js:878:5 +----Promise.then---- + @ ${workspaceFolder}/web/dwarf/fibonacci.js:813:21 +----Promise.then---- +instantiateAsync @ ${workspaceFolder}/web/dwarf/fibonacci.js:805:62 +createWasm @ ${workspaceFolder}/web/dwarf/fibonacci.js:897:3 + @ ${workspaceFolder}/web/dwarf/fibonacci.js:1253:19 diff --git a/src/test/wasm/webassembly-dwarf-inline-breakpoints-set-at-all-call-sites.txt b/src/test/wasm/webassembly-dwarf-inline-breakpoints-set-at-all-call-sites.txt new file mode 100644 index 000000000..673319c16 --- /dev/null +++ b/src/test/wasm/webassembly-dwarf-inline-breakpoints-set-at-all-call-sites.txt @@ -0,0 +1,59 @@ +{ + allThreadsStopped : false + description : Paused on breakpoint + reason : breakpoint + threadId : +} +foo @ ${workspaceFolder}/web/dwarf/diverse-inlining.h:2:7 +__main_argc_argv @ ${workspaceFolder}/web/dwarf/diverse-inlining-main.c:7:10 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:723:14 +Window.callMain @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1626:15 +Window.doRun @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1676:23 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1687:7 +----setTimeout---- +run @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1683:5 +runCaller @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1603:19 +removeRunDependency @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:641:7 +receiveInstance @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:860:5 +receiveInstantiationResult @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:878:5 +----Promise.then---- + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:813:21 +----Promise.then---- +instantiateAsync @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:805:62 +createWasm @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:897:3 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1292:19 +{ + allThreadsStopped : false + description : Paused on breakpoint + reason : breakpoint + threadId : +} + +foo @ ${workspaceFolder}/web/dwarf/diverse-inlining.h:2:7 + scope #0: Parameters [expensive] + +bar @ ${workspaceFolder}/web/dwarf/diverse-inlining-extern.c:5:10 + scope #0: Parameters [expensive] + +__main_argc_argv @ ${workspaceFolder}/web/dwarf/diverse-inlining-main.c:8:10 + + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:723:14 + +Window.callMain @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1626:15 + +Window.doRun @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1676:23 + + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1687:7 + +----setTimeout---- +run @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1683:5 +runCaller @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1603:19 +removeRunDependency @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:641:7 +receiveInstance @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:860:5 +receiveInstantiationResult @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:878:5 +----Promise.then---- + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:813:21 +----Promise.then---- +instantiateAsync @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:805:62 +createWasm @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:897:3 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1292:19 diff --git a/src/test/wasm/webassembly-dwarf-inline-function-stepping-1.txt b/src/test/wasm/webassembly-dwarf-inline-function-stepping-1.txt new file mode 100644 index 000000000..727194ee5 --- /dev/null +++ b/src/test/wasm/webassembly-dwarf-inline-function-stepping-1.txt @@ -0,0 +1,172 @@ +{ + allThreadsStopped : false + description : Paused on breakpoint + reason : breakpoint + threadId : +} +__main_argc_argv @ ${workspaceFolder}/web/dwarf/diverse-inlining-main.c:7:14 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:723:14 +Window.callMain @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1626:15 +Window.doRun @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1676:23 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1687:7 +----setTimeout---- +run @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1683:5 +runCaller @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1603:19 +removeRunDependency @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:641:7 +receiveInstance @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:860:5 +receiveInstantiationResult @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:878:5 +----Promise.then---- + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:813:21 +----Promise.then---- +instantiateAsync @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:805:62 +createWasm @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:897:3 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1292:19 +---- stepIn ---- +{ + allThreadsStopped : false + description : Paused + reason : step + threadId : +} +foo @ ${workspaceFolder}/web/dwarf/diverse-inlining.h:1:0 +__main_argc_argv @ ${workspaceFolder}/web/dwarf/diverse-inlining-main.c:7:10 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:723:14 +Window.callMain @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1626:15 +Window.doRun @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1676:23 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1687:7 +----setTimeout---- +run @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1683:5 +runCaller @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1603:19 +removeRunDependency @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:641:7 +receiveInstance @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:860:5 +receiveInstantiationResult @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:878:5 +----Promise.then---- + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:813:21 +----Promise.then---- +instantiateAsync @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:805:62 +createWasm @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:897:3 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1292:19 +---- stepOut ---- +{ + allThreadsStopped : false + description : Paused + reason : step + threadId : +} +__main_argc_argv @ ${workspaceFolder}/web/dwarf/diverse-inlining-main.c:7:10 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:723:14 +Window.callMain @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1626:15 +Window.doRun @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1676:23 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1687:7 +----setTimeout---- +run @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1683:5 +runCaller @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1603:19 +removeRunDependency @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:641:7 +receiveInstance @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:860:5 +receiveInstantiationResult @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:878:5 +----Promise.then---- + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:813:21 +----Promise.then---- +instantiateAsync @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:805:62 +createWasm @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:897:3 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1292:19 +---- next ---- +{ + allThreadsStopped : false + description : Paused + reason : step + threadId : +} +__main_argc_argv @ ${workspaceFolder}/web/dwarf/diverse-inlining-main.c:8:14 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:723:14 +Window.callMain @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1626:15 +Window.doRun @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1676:23 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1687:7 +----setTimeout---- +run @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1683:5 +runCaller @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1603:19 +removeRunDependency @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:641:7 +receiveInstance @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:860:5 +receiveInstantiationResult @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:878:5 +----Promise.then---- + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:813:21 +----Promise.then---- +instantiateAsync @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:805:62 +createWasm @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:897:3 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1292:19 +---- stepIn ---- +{ + allThreadsStopped : false + description : Paused + reason : step + threadId : +} +bar @ ${workspaceFolder}/web/dwarf/diverse-inlining-extern.c:4:0 +__main_argc_argv @ ${workspaceFolder}/web/dwarf/diverse-inlining-main.c:8:10 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:723:14 +Window.callMain @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1626:15 +Window.doRun @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1676:23 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1687:7 +----setTimeout---- +run @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1683:5 +runCaller @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1603:19 +removeRunDependency @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:641:7 +receiveInstance @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:860:5 +receiveInstantiationResult @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:878:5 +----Promise.then---- + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:813:21 +----Promise.then---- +instantiateAsync @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:805:62 +createWasm @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:897:3 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1292:19 +---- stepIn ---- +{ + allThreadsStopped : false + description : Paused + reason : step + threadId : +} +bar @ ${workspaceFolder}/web/dwarf/diverse-inlining-extern.c:5:14 +__main_argc_argv @ ${workspaceFolder}/web/dwarf/diverse-inlining-main.c:8:10 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:723:14 +Window.callMain @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1626:15 +Window.doRun @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1676:23 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1687:7 +----setTimeout---- +run @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1683:5 +runCaller @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1603:19 +removeRunDependency @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:641:7 +receiveInstance @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:860:5 +receiveInstantiationResult @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:878:5 +----Promise.then---- + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:813:21 +----Promise.then---- +instantiateAsync @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:805:62 +createWasm @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:897:3 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1292:19 +---- stepIn ---- +{ + allThreadsStopped : false + description : Paused + reason : step + threadId : +} +foo @ ${workspaceFolder}/web/dwarf/diverse-inlining.h:2:7 +bar @ ${workspaceFolder}/web/dwarf/diverse-inlining-extern.c:5:10 +__main_argc_argv @ ${workspaceFolder}/web/dwarf/diverse-inlining-main.c:8:10 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:723:14 +Window.callMain @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1626:15 +Window.doRun @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1676:23 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1687:7 +----setTimeout---- +run @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1683:5 +runCaller @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1603:19 +removeRunDependency @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:641:7 +receiveInstance @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:860:5 +receiveInstantiationResult @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:878:5 +----Promise.then---- + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:813:21 +----Promise.then---- +instantiateAsync @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:805:62 +createWasm @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:897:3 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1292:19 diff --git a/src/test/wasm/webassembly-dwarf-inline-function-stepping-2.txt b/src/test/wasm/webassembly-dwarf-inline-function-stepping-2.txt new file mode 100644 index 000000000..c4023ec23 --- /dev/null +++ b/src/test/wasm/webassembly-dwarf-inline-function-stepping-2.txt @@ -0,0 +1,47 @@ +{ + allThreadsStopped : false + description : Paused on breakpoint + reason : breakpoint + threadId : +} +bar @ ${workspaceFolder}/web/dwarf/diverse-inlining-extern.c:5:14 +__main_argc_argv @ ${workspaceFolder}/web/dwarf/diverse-inlining-main.c:8:10 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:723:14 +Window.callMain @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1626:15 +Window.doRun @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1676:23 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1687:7 +----setTimeout---- +run @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1683:5 +runCaller @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1603:19 +removeRunDependency @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:641:7 +receiveInstance @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:860:5 +receiveInstantiationResult @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:878:5 +----Promise.then---- + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:813:21 +----Promise.then---- +instantiateAsync @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:805:62 +createWasm @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:897:3 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1292:19 +{ + allThreadsStopped : false + description : Paused + reason : step + threadId : +} +__main_argc_argv @ ${workspaceFolder}/web/dwarf/diverse-inlining-main.c:8:10 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:723:14 +Window.callMain @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1626:15 +Window.doRun @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1676:23 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1687:7 +----setTimeout---- +run @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1683:5 +runCaller @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1603:19 +removeRunDependency @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:641:7 +receiveInstance @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:860:5 +receiveInstantiationResult @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:878:5 +----Promise.then---- + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:813:21 +----Promise.then---- +instantiateAsync @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:805:62 +createWasm @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:897:3 + @ ${workspaceFolder}/web/dwarf/diverse-inlining.js:1292:19 diff --git a/src/test/wasm/webassembly-dwarf-scopes-and-variables.txt b/src/test/wasm/webassembly-dwarf-scopes-and-variables.txt new file mode 100644 index 000000000..c30ba5f35 --- /dev/null +++ b/src/test/wasm/webassembly-dwarf-scopes-and-variables.txt @@ -0,0 +1,42 @@ +{ + allThreadsStopped : false + description : Paused on breakpoint + reason : breakpoint + threadId : +} + +fib @ ${workspaceFolder}/web/dwarf/fibonacci.c:6:9 + > scope #0: Locals + a: 0 + b: 0 + c: 1 + i: 1 + scope #1: Parameters [expensive] + +main @ ${workspaceFolder}/web/dwarf/fibonacci.c:14:11 + > scope #0: Locals + a: 0 + b: 0 + +Window.$main @ localhost꞉8001/dwarf/fibonacci.wat:230:1 + + @ ${workspaceFolder}/web/dwarf/fibonacci.js:723:14 + +Window.callMain @ ${workspaceFolder}/web/dwarf/fibonacci.js:1580:15 + +Window.doRun @ ${workspaceFolder}/web/dwarf/fibonacci.js:1630:23 + + @ ${workspaceFolder}/web/dwarf/fibonacci.js:1641:7 + +----setTimeout---- +run @ ${workspaceFolder}/web/dwarf/fibonacci.js:1637:5 +runCaller @ ${workspaceFolder}/web/dwarf/fibonacci.js:1565:19 +removeRunDependency @ ${workspaceFolder}/web/dwarf/fibonacci.js:641:7 +receiveInstance @ ${workspaceFolder}/web/dwarf/fibonacci.js:860:5 +receiveInstantiationResult @ ${workspaceFolder}/web/dwarf/fibonacci.js:878:5 +----Promise.then---- + @ ${workspaceFolder}/web/dwarf/fibonacci.js:813:21 +----Promise.then---- +instantiateAsync @ ${workspaceFolder}/web/dwarf/fibonacci.js:805:62 +createWasm @ ${workspaceFolder}/web/dwarf/fibonacci.js:897:3 + @ ${workspaceFolder}/web/dwarf/fibonacci.js:1253:19 diff --git a/src/ui/dwarfModuleProviderImpl.ts b/src/ui/dwarfModuleProviderImpl.ts index 320a27df5..5059c8761 100644 --- a/src/ui/dwarfModuleProviderImpl.ts +++ b/src/ui/dwarfModuleProviderImpl.ts @@ -20,6 +20,13 @@ export class DwarfModuleProvider implements IDwarfModuleProvider { /** @inheritdoc */ public async load(): Promise { + try { + // for development, use the module to avoid having to install the extension + return await import('@vscode/dwarf-debugging'); + } catch { + // fall through + } + const ext = vscode.extensions.getExtension(EXT_ID); if (!ext) { return undefined; diff --git a/testWorkspace/web/dwarf/diverse-inlining-extern.c b/testWorkspace/web/dwarf/diverse-inlining-extern.c new file mode 100644 index 000000000..be1d098ee --- /dev/null +++ b/testWorkspace/web/dwarf/diverse-inlining-extern.c @@ -0,0 +1,7 @@ +#define INLINE __attribute__((always_inline)) +#include "diverse-inlining.h" + +int bar(int x) { + return foo(x); +} + diff --git a/testWorkspace/web/dwarf/diverse-inlining-main.c b/testWorkspace/web/dwarf/diverse-inlining-main.c new file mode 100644 index 000000000..fdd7df82f --- /dev/null +++ b/testWorkspace/web/dwarf/diverse-inlining-main.c @@ -0,0 +1,10 @@ +#define INLINE __attribute__((noinline)) +#include "diverse-inlining.h" + +extern int bar(int); + +int main(int argc, char** argv) { + argc = foo(argc); + argc = bar(argc); + return argc; +} diff --git a/testWorkspace/web/dwarf/diverse-inlining.h b/testWorkspace/web/dwarf/diverse-inlining.h new file mode 100644 index 000000000..98df27de4 --- /dev/null +++ b/testWorkspace/web/dwarf/diverse-inlining.h @@ -0,0 +1,5 @@ +INLINE static int foo(int x) { + x = x + 1; + return x; +} + diff --git a/testWorkspace/web/dwarf/diverse-inlining.html b/testWorkspace/web/dwarf/diverse-inlining.html new file mode 100644 index 000000000..e422d9772 --- /dev/null +++ b/testWorkspace/web/dwarf/diverse-inlining.html @@ -0,0 +1,1294 @@ + + + + + + Emscripten-Generated Code + + + + + image/svg+xml + + +
+
Downloading...
+ + + Resize canvas + Lock/hide mouse pointer     + + + + +
+ +
+ + +
+ +
+ + + + + + diff --git a/testWorkspace/web/dwarf/diverse-inlining.js b/testWorkspace/web/dwarf/diverse-inlining.js new file mode 100644 index 000000000..dbffeaa50 --- /dev/null +++ b/testWorkspace/web/dwarf/diverse-inlining.js @@ -0,0 +1,1740 @@ +// include: shell.js +// The Module object: Our interface to the outside world. We import +// and export values on it. There are various ways Module can be used: +// 1. Not defined. We create it here +// 2. A function parameter, function(Module) { ..generated code.. } +// 3. pre-run appended it, var Module = {}; ..generated code.. +// 4. External script tag defines var Module. +// We need to check if Module already exists (e.g. case 3 above). +// Substitution will be replaced with actual code on later stage of the build, +// this way Closure Compiler will not mangle it (e.g. case 4. above). +// Note that if you want to run closure, and also to use Module +// after the generated code, you will need to define var Module = {}; +// before the code. Then that object will be used in the code, and you +// can continue to use Module afterwards as well. +var Module = typeof Module != 'undefined' ? Module : {}; + +// --pre-jses are emitted after the Module integration code, so that they can +// refer to Module (if they choose; they can also define Module) + + +// Sometimes an existing Module object exists with properties +// meant to overwrite the default module functionality. Here +// we collect those properties and reapply _after_ we configure +// the current environment's defaults to avoid having to be so +// defensive during initialization. +var moduleOverrides = Object.assign({}, Module); + +var arguments_ = []; +var thisProgram = './this.program'; +var quit_ = (status, toThrow) => { + throw toThrow; +}; + +// Determine the runtime environment we are in. You can customize this by +// setting the ENVIRONMENT setting at compile time (see settings.js). + +// Attempt to auto-detect the environment +var ENVIRONMENT_IS_WEB = typeof window == 'object'; +var ENVIRONMENT_IS_WORKER = typeof importScripts == 'function'; +// N.b. Electron.js environment is simultaneously a NODE-environment, but +// also a web environment. +var ENVIRONMENT_IS_NODE = typeof process == 'object' && typeof process.versions == 'object' && typeof process.versions.node == 'string'; +var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + +if (Module['ENVIRONMENT']) { + throw new Error('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -sENVIRONMENT=web or -sENVIRONMENT=node)'); +} + +// `/` should be present at the end if `scriptDirectory` is not empty +var scriptDirectory = ''; +function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; +} + +// Hooks that are implemented differently in different runtime environments. +var read_, + readAsync, + readBinary, + setWindowTitle; + +if (ENVIRONMENT_IS_NODE) { + if (typeof process == 'undefined' || !process.release || process.release.name !== 'node') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + var nodeVersion = process.versions.node; + var numericVersion = nodeVersion.split('.').slice(0, 3); + numericVersion = (numericVersion[0] * 10000) + (numericVersion[1] * 100) + (numericVersion[2].split('-')[0] * 1); + var minVersion = 160000; + if (numericVersion < 160000) { + throw new Error('This emscripten-generated code requires node v16.0.0 (detected v' + nodeVersion + ')'); + } + + // `require()` is no-op in an ESM module, use `createRequire()` to construct + // the require()` function. This is only necessary for multi-environment + // builds, `-sENVIRONMENT=node` emits a static import declaration instead. + // TODO: Swap all `require()`'s with `import()`'s? + // These modules will usually be used on Node.js. Load them eagerly to avoid + // the complexity of lazy-loading. + var fs = require('fs'); + var nodePath = require('path'); + + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = nodePath.dirname(scriptDirectory) + '/'; + } else { + scriptDirectory = __dirname + '/'; + } + +// include: node_shell_read.js +read_ = (filename, binary) => { + // We need to re-wrap `file://` strings to URLs. Normalizing isn't + // necessary in that case, the path should already be absolute. + filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); +}; + +readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert(ret.buffer); + return ret; +}; + +readAsync = (filename, onload, onerror, binary = true) => { + // See the comment in the `read_` function. + filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); + fs.readFile(filename, binary ? undefined : 'utf8', (err, data) => { + if (err) onerror(err); + else onload(binary ? data.buffer : data); + }); +}; +// end include: node_shell_read.js + if (!Module['thisProgram'] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + + arguments_ = process.argv.slice(2); + + if (typeof module != 'undefined') { + module['exports'] = Module; + } + + process.on('uncaughtException', (ex) => { + // suppress ExitStatus exceptions from showing an error + if (ex !== 'unwind' && !(ex instanceof ExitStatus) && !(ex.context instanceof ExitStatus)) { + throw ex; + } + }); + + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + + Module['inspect'] = () => '[Emscripten Module object]'; + +} else +if (ENVIRONMENT_IS_SHELL) { + + if ((typeof process == 'object' && typeof require === 'function') || typeof window == 'object' || typeof importScripts == 'function') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + if (typeof read != 'undefined') { + read_ = read; + } + + readBinary = (f) => { + if (typeof readbuffer == 'function') { + return new Uint8Array(readbuffer(f)); + } + let data = read(f, 'binary'); + assert(typeof data == 'object'); + return data; + }; + + readAsync = (f, onload, onerror) => { + setTimeout(() => onload(readBinary(f))); + }; + + if (typeof clearTimeout == 'undefined') { + globalThis.clearTimeout = (id) => {}; + } + + if (typeof setTimeout == 'undefined') { + // spidermonkey lacks setTimeout but we use it above in readAsync. + globalThis.setTimeout = (f) => (typeof f == 'function') ? f() : abort(); + } + + if (typeof scriptArgs != 'undefined') { + arguments_ = scriptArgs; + } else if (typeof arguments != 'undefined') { + arguments_ = arguments; + } + + if (typeof quit == 'function') { + quit_ = (status, toThrow) => { + // Unlike node which has process.exitCode, d8 has no such mechanism. So we + // have no way to set the exit code and then let the program exit with + // that code when it naturally stops running (say, when all setTimeouts + // have completed). For that reason, we must call `quit` - the only way to + // set the exit code - but quit also halts immediately. To increase + // consistency with node (and the web) we schedule the actual quit call + // using a setTimeout to give the current stack and any exception handlers + // a chance to run. This enables features such as addOnPostRun (which + // expected to be able to run code after main returns). + setTimeout(() => { + if (!(toThrow instanceof ExitStatus)) { + let toLog = toThrow; + if (toThrow && typeof toThrow == 'object' && toThrow.stack) { + toLog = [toThrow, toThrow.stack]; + } + err(`exiting due to exception: ${toLog}`); + } + quit(status); + }); + throw toThrow; + }; + } + + if (typeof print != 'undefined') { + // Prefer to use print/printErr where they exist, as they usually work better. + if (typeof console == 'undefined') console = /** @type{!Console} */({}); + console.log = /** @type{!function(this:Console, ...*): undefined} */ (print); + console.warn = console.error = /** @type{!function(this:Console, ...*): undefined} */ (typeof printErr != 'undefined' ? printErr : print); + } + +} else + +// Note that this includes Node.js workers when relevant (pthreads is enabled). +// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and +// ENVIRONMENT_IS_NODE. +if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled + scriptDirectory = self.location.href; + } else if (typeof document != 'undefined' && document.currentScript) { // web + scriptDirectory = document.currentScript.src; + } + // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them. + // otherwise, slice off the final part of the url to find the script directory. + // if scriptDirectory does not contain a slash, lastIndexOf will return -1, + // and scriptDirectory will correctly be replaced with an empty string. + // If scriptDirectory contains a query (starting with ?) or a fragment (starting with #), + // they are removed because they could contain a slash. + if (scriptDirectory.indexOf('blob:') !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf('/')+1); + } else { + scriptDirectory = ''; + } + + if (!(typeof window == 'object' || typeof importScripts == 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + // Differentiate the Web Worker from the Node Worker case, as reading must + // be done differently. + { +// include: web_or_worker_shell_read.js +read_ = (url) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.send(null); + return xhr.responseText; + } + + if (ENVIRONMENT_IS_WORKER) { + readBinary = (url) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.responseType = 'arraybuffer'; + xhr.send(null); + return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response)); + }; + } + + readAsync = (url, onload, onerror) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + xhr.onload = () => { + if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + } + +// end include: web_or_worker_shell_read.js + } + + setWindowTitle = (title) => document.title = title; +} else +{ + throw new Error('environment detection error'); +} + +var out = Module['print'] || console.log.bind(console); +var err = Module['printErr'] || console.error.bind(console); + +// Merge back in the overrides +Object.assign(Module, moduleOverrides); +// Free the object hierarchy contained in the overrides, this lets the GC +// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array. +moduleOverrides = null; +checkIncomingModuleAPI(); + +// Emit code to handle expected values on the Module object. This applies Module.x +// to the proper local x. This has two benefits: first, we only emit it if it is +// expected to arrive, and second, by using a local everywhere else that can be +// minified. + +if (Module['arguments']) arguments_ = Module['arguments'];legacyModuleProp('arguments', 'arguments_'); + +if (Module['thisProgram']) thisProgram = Module['thisProgram'];legacyModuleProp('thisProgram', 'thisProgram'); + +if (Module['quit']) quit_ = Module['quit'];legacyModuleProp('quit', 'quit_'); + +// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message +// Assertions on removed incoming Module JS APIs. +assert(typeof Module['memoryInitializerPrefixURL'] == 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['pthreadMainPrefixURL'] == 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['cdInitializerPrefixURL'] == 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['filePackagePrefixURL'] == 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['read'] == 'undefined', 'Module.read option was removed (modify read_ in JS)'); +assert(typeof Module['readAsync'] == 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)'); +assert(typeof Module['readBinary'] == 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)'); +assert(typeof Module['setWindowTitle'] == 'undefined', 'Module.setWindowTitle option was removed (modify setWindowTitle in JS)'); +assert(typeof Module['TOTAL_MEMORY'] == 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY'); +legacyModuleProp('asm', 'wasmExports'); +legacyModuleProp('read', 'read_'); +legacyModuleProp('readAsync', 'readAsync'); +legacyModuleProp('readBinary', 'readBinary'); +legacyModuleProp('setWindowTitle', 'setWindowTitle'); +var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js'; +var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js'; +var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js'; +var FETCHFS = 'FETCHFS is no longer included by default; build with -lfetchfs.js'; +var ICASEFS = 'ICASEFS is no longer included by default; build with -licasefs.js'; +var JSFILEFS = 'JSFILEFS is no longer included by default; build with -ljsfilefs.js'; +var OPFS = 'OPFS is no longer included by default; build with -lopfs.js'; + +var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js'; + +assert(!ENVIRONMENT_IS_SHELL, "shell environment detected but not enabled at build time. Add 'shell' to `-sENVIRONMENT` to enable."); + + +// end include: shell.js +// include: preamble.js +// === Preamble library stuff === + +// Documentation for the public APIs defined in this file must be updated in: +// site/source/docs/api_reference/preamble.js.rst +// A prebuilt local version of the documentation is available at: +// site/build/text/docs/api_reference/preamble.js.txt +// You can also build docs locally as HTML or other formats in site/ +// An online HTML version (which may be of a different version of Emscripten) +// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html + +var wasmBinary; +if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];legacyModuleProp('wasmBinary', 'wasmBinary'); +var noExitRuntime = Module['noExitRuntime'] || true;legacyModuleProp('noExitRuntime', 'noExitRuntime'); + +if (typeof WebAssembly != 'object') { + abort('no native wasm support detected'); +} + +// Wasm globals + +var wasmMemory; + +//======================================== +// Runtime essentials +//======================================== + +// whether we are quitting the application. no code should run after this. +// set in exit() and abort() +var ABORT = false; + +// set by exit() and abort(). Passed to 'onExit' handler. +// NOTE: This is also used as the process return code code in shell environments +// but only when noExitRuntime is false. +var EXITSTATUS; + +/** @type {function(*, string=)} */ +function assert(condition, text) { + if (!condition) { + abort('Assertion failed' + (text ? ': ' + text : '')); + } +} + +// We used to include malloc/free by default in the past. Show a helpful error in +// builds with assertions. +function _malloc() { + abort("malloc() called but not included in the build - add '_malloc' to EXPORTED_FUNCTIONS"); +} +function _free() { + // Show a helpful error since we used to include free by default in the past. + abort("free() called but not included in the build - add '_free' to EXPORTED_FUNCTIONS"); +} + +// Memory management + +var HEAP, +/** @type {!Int8Array} */ + HEAP8, +/** @type {!Uint8Array} */ + HEAPU8, +/** @type {!Int16Array} */ + HEAP16, +/** @type {!Uint16Array} */ + HEAPU16, +/** @type {!Int32Array} */ + HEAP32, +/** @type {!Uint32Array} */ + HEAPU32, +/** @type {!Float32Array} */ + HEAPF32, +/** @type {!Float64Array} */ + HEAPF64; + +function updateMemoryViews() { + var b = wasmMemory.buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(b); + Module['HEAP16'] = HEAP16 = new Int16Array(b); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(b); + Module['HEAP32'] = HEAP32 = new Int32Array(b); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + Module['HEAPF64'] = HEAPF64 = new Float64Array(b); +} + +assert(!Module['STACK_SIZE'], 'STACK_SIZE can no longer be set at runtime. Use -sSTACK_SIZE at link time') + +assert(typeof Int32Array != 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray != undefined && Int32Array.prototype.set != undefined, + 'JS engine does not provide full typed array support'); + +// If memory is defined in wasm, the user can't provide it, or set INITIAL_MEMORY +assert(!Module['wasmMemory'], 'Use of `wasmMemory` detected. Use -sIMPORTED_MEMORY to define wasmMemory externally'); +assert(!Module['INITIAL_MEMORY'], 'Detected runtime INITIAL_MEMORY setting. Use -sIMPORTED_MEMORY to define wasmMemory dynamically'); + +// include: runtime_init_table.js +// In regular non-RELOCATABLE mode the table is exported +// from the wasm module and this will be assigned once +// the exports are available. +var wasmTable; +// end include: runtime_init_table.js +// include: runtime_stack_check.js +// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode. +function writeStackCookie() { + var max = _emscripten_stack_get_end(); + assert((max & 3) == 0); + // If the stack ends at address zero we write our cookies 4 bytes into the + // stack. This prevents interference with SAFE_HEAP and ASAN which also + // monitor writes to address zero. + if (max == 0) { + max += 4; + } + // The stack grow downwards towards _emscripten_stack_get_end. + // We write cookies to the final two words in the stack and detect if they are + // ever overwritten. + HEAPU32[((max)>>2)] = 0x02135467; + HEAPU32[(((max)+(4))>>2)] = 0x89BACDFE; + // Also test the global address 0 for integrity. + HEAPU32[((0)>>2)] = 1668509029; +} + +function checkStackCookie() { + if (ABORT) return; + var max = _emscripten_stack_get_end(); + // See writeStackCookie(). + if (max == 0) { + max += 4; + } + var cookie1 = HEAPU32[((max)>>2)]; + var cookie2 = HEAPU32[(((max)+(4))>>2)]; + if (cookie1 != 0x02135467 || cookie2 != 0x89BACDFE) { + abort(`Stack overflow! Stack cookie has been overwritten at ${ptrToString(max)}, expected hex dwords 0x89BACDFE and 0x2135467, but received ${ptrToString(cookie2)} ${ptrToString(cookie1)}`); + } + // Also test the global address 0 for integrity. + if (HEAPU32[((0)>>2)] != 0x63736d65 /* 'emsc' */) { + abort('Runtime error: The application has corrupted its heap memory area (address zero)!'); + } +} +// end include: runtime_stack_check.js +// include: runtime_assertions.js +// Endianness check +(function() { + var h16 = new Int16Array(1); + var h8 = new Int8Array(h16.buffer); + h16[0] = 0x6373; + if (h8[0] !== 0x73 || h8[1] !== 0x63) throw 'Runtime error: expected the system to be little-endian! (Run with -sSUPPORT_BIG_ENDIAN to bypass)'; +})(); + +// end include: runtime_assertions.js +var __ATPRERUN__ = []; // functions called before the runtime is initialized +var __ATINIT__ = []; // functions called during startup +var __ATMAIN__ = []; // functions called when main() is to be run +var __ATEXIT__ = []; // functions called during shutdown +var __ATPOSTRUN__ = []; // functions called after the main() is called + +var runtimeInitialized = false; + +var runtimeKeepaliveCounter = 0; + +function keepRuntimeAlive() { + return noExitRuntime || runtimeKeepaliveCounter > 0; +} + +function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); +} + +function initRuntime() { + assert(!runtimeInitialized); + runtimeInitialized = true; + + checkStackCookie(); + + + callRuntimeCallbacks(__ATINIT__); +} + +function preMain() { + checkStackCookie(); + + callRuntimeCallbacks(__ATMAIN__); +} + +function postRun() { + checkStackCookie(); + + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + + callRuntimeCallbacks(__ATPOSTRUN__); +} + +function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); +} + +function addOnInit(cb) { + __ATINIT__.unshift(cb); +} + +function addOnPreMain(cb) { + __ATMAIN__.unshift(cb); +} + +function addOnExit(cb) { +} + +function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); +} + +// include: runtime_math.js +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32 + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc + +assert(Math.imul, 'This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.fround, 'This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.clz32, 'This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.trunc, 'This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +// end include: runtime_math.js +// A counter of dependencies for calling run(). If we need to +// do asynchronous work before running, increment this and +// decrement it. Incrementing must happen in a place like +// Module.preRun (used by emcc to add file preloading). +// Note that you can add dependencies in preRun, even though +// it happens right before run - run will be postponed until +// the dependencies are met. +var runDependencies = 0; +var runDependencyWatcher = null; +var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled +var runDependencyTracking = {}; + +function getUniqueRunDependency(id) { + var orig = id; + while (1) { + if (!runDependencyTracking[id]) return id; + id = orig + Math.random(); + } +} + +function addRunDependency(id) { + runDependencies++; + + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + + if (id) { + assert(!runDependencyTracking[id]); + runDependencyTracking[id] = 1; + if (runDependencyWatcher === null && typeof setInterval != 'undefined') { + // Check for missing dependencies every few seconds + runDependencyWatcher = setInterval(() => { + if (ABORT) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + return; + } + var shown = false; + for (var dep in runDependencyTracking) { + if (!shown) { + shown = true; + err('still waiting on run dependencies:'); + } + err(`dependency: ${dep}`); + } + if (shown) { + err('(end of list)'); + } + }, 10000); + } + } else { + err('warning: run dependency added without ID'); + } +} + +function removeRunDependency(id) { + runDependencies--; + + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + + if (id) { + assert(runDependencyTracking[id]); + delete runDependencyTracking[id]; + } else { + err('warning: run dependency removed without ID'); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); // can add another dependenciesFulfilled + } + } +} + +/** @param {string|number=} what */ +function abort(what) { + if (Module['onAbort']) { + Module['onAbort'](what); + } + + what = 'Aborted(' + what + ')'; + // TODO(sbc): Should we remove printing and leave it up to whoever + // catches the exception? + err(what); + + ABORT = true; + EXITSTATUS = 1; + + // Use a wasm runtime error, because a JS error might be seen as a foreign + // exception, which means we'd run destructors on it. We need the error to + // simply make the program stop. + // FIXME This approach does not work in Wasm EH because it currently does not assume + // all RuntimeErrors are from traps; it decides whether a RuntimeError is from + // a trap or not based on a hidden field within the object. So at the moment + // we don't have a way of throwing a wasm trap from JS. TODO Make a JS API that + // allows this in the wasm spec. + + // Suppress closure compiler warning here. Closure compiler's builtin extern + // defintion for WebAssembly.RuntimeError claims it takes no arguments even + // though it can. + // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed. + /** @suppress {checkTypes} */ + var e = new WebAssembly.RuntimeError(what); + + // Throw the error whether or not MODULARIZE is set because abort is used + // in code paths apart from instantiation where an exception is expected + // to be thrown when abort is called. + throw e; +} + +// include: memoryprofiler.js +// end include: memoryprofiler.js +// show errors on likely calls to FS when it was not included +var FS = { + error() { + abort('Filesystem support (FS) was not included. The problem is that you are using files from JS, but files were not used from C/C++, so filesystem support was not auto-included. You can force-include filesystem support with -sFORCE_FILESYSTEM'); + }, + init() { FS.error() }, + createDataFile() { FS.error() }, + createPreloadedFile() { FS.error() }, + createLazyFile() { FS.error() }, + open() { FS.error() }, + mkdev() { FS.error() }, + registerDevice() { FS.error() }, + analyzePath() { FS.error() }, + + ErrnoError() { FS.error() }, +}; +Module['FS_createDataFile'] = FS.createDataFile; +Module['FS_createPreloadedFile'] = FS.createPreloadedFile; + +// include: URIUtils.js +// Prefix of data URIs emitted by SINGLE_FILE and related options. +var dataURIPrefix = 'data:application/octet-stream;base64,'; + +// Indicates whether filename is a base64 data URI. +function isDataURI(filename) { + // Prefix of data URIs emitted by SINGLE_FILE and related options. + return filename.startsWith(dataURIPrefix); +} + +// Indicates whether filename is delivered via file protocol (as opposed to http/https) +function isFileURI(filename) { + return filename.startsWith('file://'); +} +// end include: URIUtils.js +function createExportWrapper(name) { + return function() { + assert(runtimeInitialized, `native function \`${name}\` called before runtime initialization`); + var f = wasmExports[name]; + assert(f, `exported native function \`${name}\` not found`); + return f.apply(null, arguments); + }; +} + +// include: runtime_exceptions.js +// end include: runtime_exceptions.js +var wasmBinaryFile; + wasmBinaryFile = 'diverse-inlining.wasm'; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + +function getBinarySync(file) { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } + throw "both async and sync fetching of the wasm failed"; +} + +function getBinaryPromise(binaryFile) { + // If we don't have the binary yet, try to load it asynchronously. + // Fetch has some additional restrictions over XHR, like it can't be used on a file:// url. + // See https://github.com/github/fetch/pull/92#issuecomment-140665932 + // Cordova or Electron apps are typically loaded from a file:// url. + // So use fetch if it is available and the url is not a file, otherwise fall back to XHR. + if (!wasmBinary + && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch == 'function' + && !isFileURI(binaryFile) + ) { + return fetch(binaryFile, { credentials: 'same-origin' }).then((response) => { + if (!response['ok']) { + throw "failed to load wasm binary file at '" + binaryFile + "'"; + } + return response['arrayBuffer'](); + }).catch(() => getBinarySync(binaryFile)); + } + else if (readAsync) { + // fetch is not available or url is file => try XHR (readAsync uses XHR internally) + return new Promise((resolve, reject) => { + readAsync(binaryFile, (response) => resolve(new Uint8Array(/** @type{!ArrayBuffer} */(response))), reject) + }); + } + } + + // Otherwise, getBinarySync should be able to get it synchronously + return Promise.resolve().then(() => getBinarySync(binaryFile)); +} + +function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile).then((binary) => { + return WebAssembly.instantiate(binary, imports); + }).then((instance) => { + return instance; + }).then(receiver, (reason) => { + err(`failed to asynchronously prepare wasm: ${reason}`); + + // Warn on some common problems. + if (isFileURI(wasmBinaryFile)) { + err(`warning: Loading from a file URI (${wasmBinaryFile}) is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing`); + } + abort(reason); + }); +} + +function instantiateAsync(binary, binaryFile, imports, callback) { + if (!binary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(binaryFile) && + // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously. + !isFileURI(binaryFile) && + // Avoid instantiateStreaming() on Node.js environment for now, as while + // Node.js v18.1.0 implements it, it does not have a full fetch() + // implementation yet. + // + // Reference: + // https://github.com/emscripten-core/emscripten/pull/16917 + !ENVIRONMENT_IS_NODE && + typeof fetch == 'function') { + return fetch(binaryFile, { credentials: 'same-origin' }).then((response) => { + // Suppress closure warning here since the upstream definition for + // instantiateStreaming only allows Promise rather than + // an actual Response. + // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure is fixed. + /** @suppress {checkTypes} */ + var result = WebAssembly.instantiateStreaming(response, imports); + + return result.then( + callback, + function(reason) { + // We expect the most common failure cause to be a bad MIME type for the binary, + // in which case falling back to ArrayBuffer instantiation should work. + err(`wasm streaming compile failed: ${reason}`); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer(binaryFile, imports, callback); + }); + }); + } + return instantiateArrayBuffer(binaryFile, imports, callback); +} + +// Create the wasm instance. +// Receives the wasm imports, returns the exports. +function createWasm() { + // prepare imports + var info = { + 'env': wasmImports, + 'wasi_snapshot_preview1': wasmImports, + }; + // Load the wasm module and create an instance of using native support in the JS engine. + // handle a generated wasm instance, receiving its exports and + // performing other necessary setup + /** @param {WebAssembly.Module=} module*/ + function receiveInstance(instance, module) { + var exports = instance.exports; + + wasmExports = exports; + + + wasmMemory = wasmExports['memory']; + + assert(wasmMemory, "memory not found in wasm exports"); + // This assertion doesn't hold when emscripten is run in --post-link + // mode. + // TODO(sbc): Read INITIAL_MEMORY out of the wasm file in post-link mode. + //assert(wasmMemory.buffer.byteLength === 16777216); + updateMemoryViews(); + + wasmTable = wasmExports['__indirect_function_table']; + + assert(wasmTable, "table not found in wasm exports"); + + addOnInit(wasmExports['__wasm_call_ctors']); + + removeRunDependency('wasm-instantiate'); + return exports; + } + // wait for the pthread pool (if any) + addRunDependency('wasm-instantiate'); + + // Prefer streaming instantiation if available. + // Async compilation can be confusing when an error on the page overwrites Module + // (for example, if the order of elements is wrong, and the one defining Module is + // later), so we save Module and check it later. + var trueModule = Module; + function receiveInstantiationResult(result) { + // 'result' is a ResultObject object which has both the module and instance. + // receiveInstance() will swap in the exports (to Module.asm) so they can be called + assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?'); + trueModule = null; + // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line. + // When the regression is fixed, can restore the above PTHREADS-enabled path. + receiveInstance(result['instance']); + } + + // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback + // to manually instantiate the Wasm module themselves. This allows pages to + // run the instantiation parallel to any other async startup actions they are + // performing. + // Also pthreads and wasm workers initialize the wasm instance through this + // path. + if (Module['instantiateWasm']) { + + try { + return Module['instantiateWasm'](info, receiveInstance); + } catch(e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + return false; + } + } + + instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult); + return {}; // no exports yet; we'll fill them in later +} + +// Globals used by JS i64 conversions (see makeSetValue) +var tempDouble; +var tempI64; + +// include: runtime_debug.js +function legacyModuleProp(prop, newName, incomming=true) { + if (!Object.getOwnPropertyDescriptor(Module, prop)) { + Object.defineProperty(Module, prop, { + configurable: true, + get() { + let extra = incomming ? ' (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)' : ''; + abort(`\`Module.${prop}\` has been replaced by \`${newName}\`` + extra); + + } + }); + } +} + +function ignoredModuleProp(prop) { + if (Object.getOwnPropertyDescriptor(Module, prop)) { + abort(`\`Module.${prop}\` was supplied but \`${prop}\` not included in INCOMING_MODULE_JS_API`); + } +} + +// forcing the filesystem exports a few things by default +function isExportedByForceFilesystem(name) { + return name === 'FS_createPath' || + name === 'FS_createDataFile' || + name === 'FS_createPreloadedFile' || + name === 'FS_unlink' || + name === 'addRunDependency' || + // The old FS has some functionality that WasmFS lacks. + name === 'FS_createLazyFile' || + name === 'FS_createDevice' || + name === 'removeRunDependency'; +} + +function missingGlobal(sym, msg) { + if (typeof globalThis !== 'undefined') { + Object.defineProperty(globalThis, sym, { + configurable: true, + get() { + warnOnce('`' + sym + '` is not longer defined by emscripten. ' + msg); + return undefined; + } + }); + } +} + +missingGlobal('buffer', 'Please use HEAP8.buffer or wasmMemory.buffer'); +missingGlobal('asm', 'Please use wasmExports instead'); + +function missingLibrarySymbol(sym) { + if (typeof globalThis !== 'undefined' && !Object.getOwnPropertyDescriptor(globalThis, sym)) { + Object.defineProperty(globalThis, sym, { + configurable: true, + get() { + // Can't `abort()` here because it would break code that does runtime + // checks. e.g. `if (typeof SDL === 'undefined')`. + var msg = '`' + sym + '` is a library symbol and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line'; + // DEFAULT_LIBRARY_FUNCS_TO_INCLUDE requires the name as it appears in + // library.js, which means $name for a JS name with no prefix, or name + // for a JS name like _name. + var librarySymbol = sym; + if (!librarySymbol.startsWith('_')) { + librarySymbol = '$' + sym; + } + msg += " (e.g. -sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE='" + librarySymbol + "')"; + if (isExportedByForceFilesystem(sym)) { + msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you'; + } + warnOnce(msg); + return undefined; + } + }); + } + // Any symbol that is not included from the JS libary is also (by definition) + // not exported on the Module object. + unexportedRuntimeSymbol(sym); +} + +function unexportedRuntimeSymbol(sym) { + if (!Object.getOwnPropertyDescriptor(Module, sym)) { + Object.defineProperty(Module, sym, { + configurable: true, + get() { + var msg = "'" + sym + "' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the Emscripten FAQ)"; + if (isExportedByForceFilesystem(sym)) { + msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you'; + } + abort(msg); + } + }); + } +} + +// Used by XXXXX_DEBUG settings to output debug messages. +function dbg(text) { + // TODO(sbc): Make this configurable somehow. Its not always convenient for + // logging to show up as warnings. + console.warn.apply(console, arguments); +} +// end include: runtime_debug.js +// === Body === + +// end include: preamble.js + + /** @constructor */ + function ExitStatus(status) { + this.name = 'ExitStatus'; + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + // Pass the module as the first argument. + callbacks.shift()(Module); + } + }; + + + /** + * @param {number} ptr + * @param {string} type + */ + function getValue(ptr, type = 'i8') { + if (type.endsWith('*')) type = '*'; + switch (type) { + case 'i1': return HEAP8[((ptr)>>0)]; + case 'i8': return HEAP8[((ptr)>>0)]; + case 'i16': return HEAP16[((ptr)>>1)]; + case 'i32': return HEAP32[((ptr)>>2)]; + case 'i64': abort('to do getValue(i64) use WASM_BIGINT'); + case 'float': return HEAPF32[((ptr)>>2)]; + case 'double': return HEAPF64[((ptr)>>3)]; + case '*': return HEAPU32[((ptr)>>2)]; + default: abort(`invalid type for getValue: ${type}`); + } + } + + var ptrToString = (ptr) => { + assert(typeof ptr === 'number'); + // With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned. + ptr >>>= 0; + return '0x' + ptr.toString(16).padStart(8, '0'); + }; + + + /** + * @param {number} ptr + * @param {number} value + * @param {string} type + */ + function setValue(ptr, value, type = 'i8') { + if (type.endsWith('*')) type = '*'; + switch (type) { + case 'i1': HEAP8[((ptr)>>0)] = value; break; + case 'i8': HEAP8[((ptr)>>0)] = value; break; + case 'i16': HEAP16[((ptr)>>1)] = value; break; + case 'i32': HEAP32[((ptr)>>2)] = value; break; + case 'i64': abort('to do setValue(i64) use WASM_BIGINT'); + case 'float': HEAPF32[((ptr)>>2)] = value; break; + case 'double': HEAPF64[((ptr)>>3)] = value; break; + case '*': HEAPU32[((ptr)>>2)] = value; break; + default: abort(`invalid type for setValue: ${type}`); + } + } + + var warnOnce = (text) => { + if (!warnOnce.shown) warnOnce.shown = {}; + if (!warnOnce.shown[text]) { + warnOnce.shown[text] = 1; + if (ENVIRONMENT_IS_NODE) text = 'warning: ' + text; + err(text); + } + }; + + + var UTF8Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ + var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + // TextDecoder needs to know the byte length in advance, it doesn't stop on + // null terminator by itself. Also, use the length info to avoid running tiny + // strings through TextDecoder, since .subarray() allocates garbage. + // (As a tiny code save trick, compare endPtr against endIdx using a negation, + // so that undefined means Infinity) + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + // If building with TextDecoder, we have already computed the string length + // above, so test loop end condition against that + while (idx < endPtr) { + // For UTF8 byte structure, see: + // http://en.wikipedia.org/wiki/UTF-8#Description + // https://www.ietf.org/rfc/rfc2279.txt + // https://tools.ietf.org/html/rfc3629 + var u0 = heapOrArray[idx++]; + if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 0xF0) == 0xE0) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte ' + ptrToString(u0) + ' encountered when deserializing a UTF-8 string in wasm memory to a JS string!'); + u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); + } + + if (u0 < 0x10000) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } + } + return str; + }; + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index (i.e. maxBytesToRead will not + * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing + * frequent uses of UTF8ToString() with and without maxBytesToRead may throw + * JS JIT optimizations off, so it is worth to consider consistently using one + * @return {string} + */ + var UTF8ToString = (ptr, maxBytesToRead) => { + assert(typeof ptr == 'number'); + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; + }; + var SYSCALLS = { + varargs:undefined, + get() { + assert(SYSCALLS.varargs != undefined); + var ret = HEAP32[((SYSCALLS.varargs)>>2)]; + SYSCALLS.varargs += 4; + return ret; + }, + getp() { return SYSCALLS.get() }, + getStr(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, + }; + var _proc_exit = (code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + if (Module['onExit']) Module['onExit'](code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + /** @param {boolean|number=} implicit */ + var exitJS = (status, implicit) => { + EXITSTATUS = status; + + checkUnflushedContent(); + + // if exit() was called explicitly, warn the user if the runtime isn't actually being shut down + if (keepRuntimeAlive() && !implicit) { + var msg = `program exited (with status: ${status}), but keepRuntimeAlive() is set (counter=${runtimeKeepaliveCounter}) due to an async operation, so halting execution but not exiting the runtime or preventing further async execution (you can use emscripten_force_exit, if you want to force a true shutdown)`; + err(msg); + } + + _proc_exit(status); + }; + + var handleException = (e) => { + // Certain exception types we do not treat as errors since they are used for + // internal control flow. + // 1. ExitStatus, which is thrown by exit() + // 2. "unwind", which is thrown by emscripten_unwind_to_js_event_loop() and others + // that wish to return to JS event loop. + if (e instanceof ExitStatus || e == 'unwind') { + return EXITSTATUS; + } + checkStackCookie(); + if (e instanceof WebAssembly.RuntimeError) { + if (_emscripten_stack_get_current() <= 0) { + err('Stack overflow detected. You can try increasing -sSTACK_SIZE (currently set to 65536)'); + } + } + quit_(1, e); + }; + + var lengthBytesUTF8 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code + // unit, not a Unicode code point of the character! So decode + // UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var c = str.charCodeAt(i); // possibly a lead surrogate + if (c <= 0x7F) { + len++; + } else if (c <= 0x7FF) { + len += 2; + } else if (c >= 0xD800 && c <= 0xDFFF) { + len += 4; ++i; + } else { + len += 3; + } + } + return len; + }; + + var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + assert(typeof str === 'string'); + // Parameter maxBytesToWrite is not optional. Negative values, 0, null, + // undefined and false each don't write out any bytes. + if (!(maxBytesToWrite > 0)) + return 0; + + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code + // unit, not a Unicode code point of the character! So decode + // UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description + // and https://www.ietf.org/rfc/rfc2279.txt + // and https://tools.ietf.org/html/rfc3629 + var u = str.charCodeAt(i); // possibly a lead surrogate + if (u >= 0xD800 && u <= 0xDFFF) { + var u1 = str.charCodeAt(++i); + u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF); + } + if (u <= 0x7F) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 0x7FF) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 0xC0 | (u >> 6); + heap[outIdx++] = 0x80 | (u & 63); + } else if (u <= 0xFFFF) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 0xE0 | (u >> 12); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + if (u > 0x10FFFF) warnOnce('Invalid Unicode code point ' + ptrToString(u) + ' encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF).'); + heap[outIdx++] = 0xF0 | (u >> 18); + heap[outIdx++] = 0x80 | ((u >> 12) & 63); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } + } + // Null-terminate the pointer to the buffer. + heap[outIdx] = 0; + return outIdx - startIdx; + }; + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => { + assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + }; + var stringToUTF8OnStack = (str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; + }; +function checkIncomingModuleAPI() { + ignoredModuleProp('fetchSettings'); +} +var wasmImports = { + +}; +var wasmExports = createWasm(); +var ___wasm_call_ctors = createExportWrapper('__wasm_call_ctors'); +var _main = Module['_main'] = createExportWrapper('__main_argc_argv'); +var ___errno_location = createExportWrapper('__errno_location'); +var _fflush = Module['_fflush'] = createExportWrapper('fflush'); +var _emscripten_stack_init = () => (_emscripten_stack_init = wasmExports['emscripten_stack_init'])(); +var _emscripten_stack_get_free = () => (_emscripten_stack_get_free = wasmExports['emscripten_stack_get_free'])(); +var _emscripten_stack_get_base = () => (_emscripten_stack_get_base = wasmExports['emscripten_stack_get_base'])(); +var _emscripten_stack_get_end = () => (_emscripten_stack_get_end = wasmExports['emscripten_stack_get_end'])(); +var stackSave = createExportWrapper('stackSave'); +var stackRestore = createExportWrapper('stackRestore'); +var stackAlloc = createExportWrapper('stackAlloc'); +var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports['emscripten_stack_get_current'])(); + + +// include: postamble.js +// === Auto-generated postamble setup entry stuff === + +var missingLibrarySymbols = [ + 'writeI53ToI64', + 'writeI53ToI64Clamped', + 'writeI53ToI64Signaling', + 'writeI53ToU64Clamped', + 'writeI53ToU64Signaling', + 'readI53FromI64', + 'readI53FromU64', + 'convertI32PairToI53', + 'convertI32PairToI53Checked', + 'convertU32PairToI53', + 'zeroMemory', + 'getHeapMax', + 'abortOnCannotGrowMemory', + 'growMemory', + 'isLeapYear', + 'ydayFromDate', + 'arraySum', + 'addDays', + 'setErrNo', + 'inetPton4', + 'inetNtop4', + 'inetPton6', + 'inetNtop6', + 'readSockaddr', + 'writeSockaddr', + 'getHostByName', + 'initRandomFill', + 'randomFill', + 'getCallstack', + 'emscriptenLog', + 'convertPCtoSourceLocation', + 'readEmAsmArgs', + 'jstoi_q', + 'jstoi_s', + 'getExecutableName', + 'listenOnce', + 'autoResumeAudioContext', + 'dynCallLegacy', + 'getDynCaller', + 'dynCall', + 'runtimeKeepalivePush', + 'runtimeKeepalivePop', + 'callUserCallback', + 'maybeExit', + 'safeSetTimeout', + 'asmjsMangle', + 'asyncLoad', + 'alignMemory', + 'mmapAlloc', + 'handleAllocatorInit', + 'HandleAllocator', + 'getNativeTypeSize', + 'STACK_SIZE', + 'STACK_ALIGN', + 'POINTER_SIZE', + 'ASSERTIONS', + 'getCFunc', + 'ccall', + 'cwrap', + 'uleb128Encode', + 'sigToWasmTypes', + 'generateFuncType', + 'convertJsFunctionToWasm', + 'getEmptyTableSlot', + 'updateTableMap', + 'getFunctionAddress', + 'addFunction', + 'removeFunction', + 'reallyNegative', + 'unSign', + 'strLen', + 'reSign', + 'formatString', + 'intArrayFromString', + 'intArrayToString', + 'AsciiToString', + 'stringToAscii', + 'UTF16ToString', + 'stringToUTF16', + 'lengthBytesUTF16', + 'UTF32ToString', + 'stringToUTF32', + 'lengthBytesUTF32', + 'stringToNewUTF8', + 'writeArrayToMemory', + 'registerKeyEventCallback', + 'maybeCStringToJsString', + 'findEventTarget', + 'findCanvasEventTarget', + 'getBoundingClientRect', + 'fillMouseEventData', + 'registerMouseEventCallback', + 'registerWheelEventCallback', + 'registerUiEventCallback', + 'registerFocusEventCallback', + 'fillDeviceOrientationEventData', + 'registerDeviceOrientationEventCallback', + 'fillDeviceMotionEventData', + 'registerDeviceMotionEventCallback', + 'screenOrientation', + 'fillOrientationChangeEventData', + 'registerOrientationChangeEventCallback', + 'fillFullscreenChangeEventData', + 'registerFullscreenChangeEventCallback', + 'JSEvents_requestFullscreen', + 'JSEvents_resizeCanvasForFullscreen', + 'registerRestoreOldStyle', + 'hideEverythingExceptGivenElement', + 'restoreHiddenElements', + 'setLetterbox', + 'softFullscreenResizeWebGLRenderTarget', + 'doRequestFullscreen', + 'fillPointerlockChangeEventData', + 'registerPointerlockChangeEventCallback', + 'registerPointerlockErrorEventCallback', + 'requestPointerLock', + 'fillVisibilityChangeEventData', + 'registerVisibilityChangeEventCallback', + 'registerTouchEventCallback', + 'fillGamepadEventData', + 'registerGamepadEventCallback', + 'registerBeforeUnloadEventCallback', + 'fillBatteryEventData', + 'battery', + 'registerBatteryEventCallback', + 'setCanvasElementSize', + 'getCanvasElementSize', + 'demangle', + 'demangleAll', + 'jsStackTrace', + 'stackTrace', + 'getEnvStrings', + 'checkWasiClock', + 'flush_NO_FILESYSTEM', + 'wasiRightsToMuslOFlags', + 'wasiOFlagsToMuslOFlags', + 'createDyncallWrapper', + 'setImmediateWrapped', + 'clearImmediateWrapped', + 'polyfillSetImmediate', + 'getPromise', + 'makePromise', + 'idsToPromises', + 'makePromiseCallback', + 'ExceptionInfo', + 'findMatchingCatch', + 'setMainLoop', + 'getSocketFromFD', + 'getSocketAddress', + 'FS_createPreloadedFile', + 'FS_modeStringToFlags', + 'FS_getMode', + 'FS_stdin_getChar', + '_setNetworkCallback', + 'heapObjectForWebGLType', + 'heapAccessShiftForWebGLHeap', + 'webgl_enable_ANGLE_instanced_arrays', + 'webgl_enable_OES_vertex_array_object', + 'webgl_enable_WEBGL_draw_buffers', + 'webgl_enable_WEBGL_multi_draw', + 'emscriptenWebGLGet', + 'computeUnpackAlignedImageSize', + 'colorChannelsInGlTextureFormat', + 'emscriptenWebGLGetTexPixelData', + '__glGenObject', + 'emscriptenWebGLGetUniform', + 'webglGetUniformLocation', + 'webglPrepareUniformLocationsBeforeFirstUse', + 'webglGetLeftBracePos', + 'emscriptenWebGLGetVertexAttrib', + '__glGetActiveAttribOrUniform', + 'writeGLArray', + 'registerWebGlEventCallback', + 'runAndAbortIfError', + 'SDL_unicode', + 'SDL_ttfContext', + 'SDL_audio', + 'GLFW_Window', + 'ALLOC_NORMAL', + 'ALLOC_STACK', + 'allocate', + 'writeStringToMemory', + 'writeAsciiToMemory', +]; +missingLibrarySymbols.forEach(missingLibrarySymbol) + +var unexportedSymbols = [ + 'run', + 'addOnPreRun', + 'addOnInit', + 'addOnPreMain', + 'addOnExit', + 'addOnPostRun', + 'addRunDependency', + 'removeRunDependency', + 'FS_createFolder', + 'FS_createPath', + 'FS_createDataFile', + 'FS_createLazyFile', + 'FS_createLink', + 'FS_createDevice', + 'FS_readFile', + 'FS_unlink', + 'out', + 'err', + 'callMain', + 'abort', + 'keepRuntimeAlive', + 'wasmMemory', + 'wasmTable', + 'wasmExports', + 'stackAlloc', + 'stackSave', + 'stackRestore', + 'getTempRet0', + 'setTempRet0', + 'writeStackCookie', + 'checkStackCookie', + 'ptrToString', + 'exitJS', + 'ENV', + 'MONTH_DAYS_REGULAR', + 'MONTH_DAYS_LEAP', + 'MONTH_DAYS_REGULAR_CUMULATIVE', + 'MONTH_DAYS_LEAP_CUMULATIVE', + 'ERRNO_CODES', + 'ERRNO_MESSAGES', + 'DNS', + 'Protocols', + 'Sockets', + 'timers', + 'warnOnce', + 'UNWIND_CACHE', + 'readEmAsmArgsArray', + 'handleException', + 'freeTableIndexes', + 'functionsInTableMap', + 'setValue', + 'getValue', + 'PATH', + 'PATH_FS', + 'UTF8Decoder', + 'UTF8ArrayToString', + 'UTF8ToString', + 'stringToUTF8Array', + 'stringToUTF8', + 'lengthBytesUTF8', + 'UTF16Decoder', + 'stringToUTF8OnStack', + 'JSEvents', + 'specialHTMLTargets', + 'currentFullscreenStrategy', + 'restoreOldWindowedStyle', + 'ExitStatus', + 'promiseMap', + 'uncaughtExceptionCount', + 'exceptionLast', + 'exceptionCaught', + 'Browser', + 'wget', + 'SYSCALLS', + 'preloadPlugins', + 'FS_stdin_getChar_buffer', + 'FS', + 'MEMFS', + 'TTY', + 'PIPEFS', + 'SOCKFS', + 'tempFixedLengthArray', + 'miniTempWebGLFloatBuffers', + 'miniTempWebGLIntBuffers', + 'GL', + 'emscripten_webgl_power_preferences', + 'AL', + 'GLUT', + 'EGL', + 'GLEW', + 'IDBStore', + 'SDL', + 'SDL_gfx', + 'GLFW', + 'allocateUTF8', + 'allocateUTF8OnStack', +]; +unexportedSymbols.forEach(unexportedRuntimeSymbol); + + + +var calledRun; + +dependenciesFulfilled = function runCaller() { + // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled +}; + +function callMain(args = []) { + assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on Module["onRuntimeInitialized"])'); + assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called'); + + var entryFunction = _main; + + args.unshift(thisProgram); + + var argc = args.length; + var argv = stackAlloc((argc + 1) * 4); + var argv_ptr = argv; + args.forEach((arg) => { + HEAPU32[((argv_ptr)>>2)] = stringToUTF8OnStack(arg); + argv_ptr += 4; + }); + HEAPU32[((argv_ptr)>>2)] = 0; + + try { + + var ret = entryFunction(argc, argv); + + // if we're not running an evented main loop, it's time to exit + exitJS(ret, /* implicit = */ true); + return ret; + } + catch (e) { + return handleException(e); + } +} + +function stackCheckInit() { + // This is normally called automatically during __wasm_call_ctors but need to + // get these values before even running any of the ctors so we call it redundantly + // here. + _emscripten_stack_init(); + // TODO(sbc): Move writeStackCookie to native to to avoid this. + writeStackCookie(); +} + +function run(args = arguments_) { + + if (runDependencies > 0) { + return; + } + + stackCheckInit(); + + preRun(); + + // a preRun added a dependency, run will be called later + if (runDependencies > 0) { + return; + } + + function doRun() { + // run may have just been called through dependencies being fulfilled just in this very frame, + // or while the async setStatus time below was happening + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + + if (ABORT) return; + + initRuntime(); + + preMain(); + + if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized'](); + + if (shouldRunNow) callMain(args); + + postRun(); + } + + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function() { + setTimeout(function() { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else + { + doRun(); + } + checkStackCookie(); +} + +function checkUnflushedContent() { + // Compiler settings do not allow exiting the runtime, so flushing + // the streams is not possible. but in ASSERTIONS mode we check + // if there was something to flush, and if so tell the user they + // should request that the runtime be exitable. + // Normally we would not even include flush() at all, but in ASSERTIONS + // builds we do so just for this check, and here we see if there is any + // content to flush, that is, we check if there would have been + // something a non-ASSERTIONS build would have not seen. + // How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0 + // mode (which has its own special function for this; otherwise, all + // the code is inside libc) + var oldOut = out; + var oldErr = err; + var has = false; + out = err = (x) => { + has = true; + } + try { // it doesn't matter if it fails + _fflush(0); + } catch(e) {} + out = oldOut; + err = oldErr; + if (has) { + warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the Emscripten FAQ), or make sure to emit a newline when you printf etc.'); + warnOnce('(this may also be due to not including full filesystem support - try building with -sFORCE_FILESYSTEM)'); + } +} + +if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } +} + +// shouldRunNow refers to calling main(), not run(). +var shouldRunNow = true; + +if (Module['noInitialRun']) shouldRunNow = false; + +run(); + + +// end include: postamble.js diff --git a/testWorkspace/web/dwarf/diverse-inlining.wasm b/testWorkspace/web/dwarf/diverse-inlining.wasm new file mode 100644 index 0000000000000000000000000000000000000000..e11660eff62e70232af6f9d8b5037fb5c04716ab GIT binary patch literal 19338 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 UuOsP!s9Mzo>>&OO(N;tLKP^Bd5C8xG literal 0 HcmV?d00001 diff --git a/testWorkspace/web/dwarf/fibonacci.c b/testWorkspace/web/dwarf/fibonacci.c new file mode 100644 index 000000000..de73c4f64 --- /dev/null +++ b/testWorkspace/web/dwarf/fibonacci.c @@ -0,0 +1,19 @@ +#include + +int fib(int n) { + int a, b = 0, c = 1; + for (int i = 1; i < n; ++i) { + a = b; + b = c; + c = a + b; + } + return c; +} + +int main() { + int a = fib(9); + printf("9th fib: %d\n", a); + int b = fib(5); + printf("5th fib: %d\n", b); + return 0; +} diff --git a/testWorkspace/web/dwarf/fibonacci.html b/testWorkspace/web/dwarf/fibonacci.html new file mode 100644 index 000000000..7cae3bf26 --- /dev/null +++ b/testWorkspace/web/dwarf/fibonacci.html @@ -0,0 +1,1294 @@ + + + + + + Emscripten-Generated Code + + + + + image/svg+xml + + +
+
Downloading...
+ + + Resize canvas + Lock/hide mouse pointer     + + + + +
+ +
+ + +
+ +
+ + + + + + diff --git a/testWorkspace/web/dwarf/fibonacci.js b/testWorkspace/web/dwarf/fibonacci.js new file mode 100644 index 000000000..bc1365623 --- /dev/null +++ b/testWorkspace/web/dwarf/fibonacci.js @@ -0,0 +1,1694 @@ +// include: shell.js +// The Module object: Our interface to the outside world. We import +// and export values on it. There are various ways Module can be used: +// 1. Not defined. We create it here +// 2. A function parameter, function(Module) { ..generated code.. } +// 3. pre-run appended it, var Module = {}; ..generated code.. +// 4. External script tag defines var Module. +// We need to check if Module already exists (e.g. case 3 above). +// Substitution will be replaced with actual code on later stage of the build, +// this way Closure Compiler will not mangle it (e.g. case 4. above). +// Note that if you want to run closure, and also to use Module +// after the generated code, you will need to define var Module = {}; +// before the code. Then that object will be used in the code, and you +// can continue to use Module afterwards as well. +var Module = typeof Module != 'undefined' ? Module : {}; + +// --pre-jses are emitted after the Module integration code, so that they can +// refer to Module (if they choose; they can also define Module) + + +// Sometimes an existing Module object exists with properties +// meant to overwrite the default module functionality. Here +// we collect those properties and reapply _after_ we configure +// the current environment's defaults to avoid having to be so +// defensive during initialization. +var moduleOverrides = Object.assign({}, Module); + +var arguments_ = []; +var thisProgram = './this.program'; +var quit_ = (status, toThrow) => { + throw toThrow; +}; + +// Determine the runtime environment we are in. You can customize this by +// setting the ENVIRONMENT setting at compile time (see settings.js). + +// Attempt to auto-detect the environment +var ENVIRONMENT_IS_WEB = typeof window == 'object'; +var ENVIRONMENT_IS_WORKER = typeof importScripts == 'function'; +// N.b. Electron.js environment is simultaneously a NODE-environment, but +// also a web environment. +var ENVIRONMENT_IS_NODE = typeof process == 'object' && typeof process.versions == 'object' && typeof process.versions.node == 'string'; +var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + +if (Module['ENVIRONMENT']) { + throw new Error('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -sENVIRONMENT=web or -sENVIRONMENT=node)'); +} + +// `/` should be present at the end if `scriptDirectory` is not empty +var scriptDirectory = ''; +function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; +} + +// Hooks that are implemented differently in different runtime environments. +var read_, + readAsync, + readBinary, + setWindowTitle; + +if (ENVIRONMENT_IS_NODE) { + if (typeof process == 'undefined' || !process.release || process.release.name !== 'node') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + var nodeVersion = process.versions.node; + var numericVersion = nodeVersion.split('.').slice(0, 3); + numericVersion = (numericVersion[0] * 10000) + (numericVersion[1] * 100) + (numericVersion[2].split('-')[0] * 1); + var minVersion = 160000; + if (numericVersion < 160000) { + throw new Error('This emscripten-generated code requires node v16.0.0 (detected v' + nodeVersion + ')'); + } + + // `require()` is no-op in an ESM module, use `createRequire()` to construct + // the require()` function. This is only necessary for multi-environment + // builds, `-sENVIRONMENT=node` emits a static import declaration instead. + // TODO: Swap all `require()`'s with `import()`'s? + // These modules will usually be used on Node.js. Load them eagerly to avoid + // the complexity of lazy-loading. + var fs = require('fs'); + var nodePath = require('path'); + + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = nodePath.dirname(scriptDirectory) + '/'; + } else { + scriptDirectory = __dirname + '/'; + } + +// include: node_shell_read.js +read_ = (filename, binary) => { + // We need to re-wrap `file://` strings to URLs. Normalizing isn't + // necessary in that case, the path should already be absolute. + filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); +}; + +readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert(ret.buffer); + return ret; +}; + +readAsync = (filename, onload, onerror, binary = true) => { + // See the comment in the `read_` function. + filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); + fs.readFile(filename, binary ? undefined : 'utf8', (err, data) => { + if (err) onerror(err); + else onload(binary ? data.buffer : data); + }); +}; +// end include: node_shell_read.js + if (!Module['thisProgram'] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + + arguments_ = process.argv.slice(2); + + if (typeof module != 'undefined') { + module['exports'] = Module; + } + + process.on('uncaughtException', (ex) => { + // suppress ExitStatus exceptions from showing an error + if (ex !== 'unwind' && !(ex instanceof ExitStatus) && !(ex.context instanceof ExitStatus)) { + throw ex; + } + }); + + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + + Module['inspect'] = () => '[Emscripten Module object]'; + +} else +if (ENVIRONMENT_IS_SHELL) { + + if ((typeof process == 'object' && typeof require === 'function') || typeof window == 'object' || typeof importScripts == 'function') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + if (typeof read != 'undefined') { + read_ = read; + } + + readBinary = (f) => { + if (typeof readbuffer == 'function') { + return new Uint8Array(readbuffer(f)); + } + let data = read(f, 'binary'); + assert(typeof data == 'object'); + return data; + }; + + readAsync = (f, onload, onerror) => { + setTimeout(() => onload(readBinary(f))); + }; + + if (typeof clearTimeout == 'undefined') { + globalThis.clearTimeout = (id) => {}; + } + + if (typeof setTimeout == 'undefined') { + // spidermonkey lacks setTimeout but we use it above in readAsync. + globalThis.setTimeout = (f) => (typeof f == 'function') ? f() : abort(); + } + + if (typeof scriptArgs != 'undefined') { + arguments_ = scriptArgs; + } else if (typeof arguments != 'undefined') { + arguments_ = arguments; + } + + if (typeof quit == 'function') { + quit_ = (status, toThrow) => { + // Unlike node which has process.exitCode, d8 has no such mechanism. So we + // have no way to set the exit code and then let the program exit with + // that code when it naturally stops running (say, when all setTimeouts + // have completed). For that reason, we must call `quit` - the only way to + // set the exit code - but quit also halts immediately. To increase + // consistency with node (and the web) we schedule the actual quit call + // using a setTimeout to give the current stack and any exception handlers + // a chance to run. This enables features such as addOnPostRun (which + // expected to be able to run code after main returns). + setTimeout(() => { + if (!(toThrow instanceof ExitStatus)) { + let toLog = toThrow; + if (toThrow && typeof toThrow == 'object' && toThrow.stack) { + toLog = [toThrow, toThrow.stack]; + } + err(`exiting due to exception: ${toLog}`); + } + quit(status); + }); + throw toThrow; + }; + } + + if (typeof print != 'undefined') { + // Prefer to use print/printErr where they exist, as they usually work better. + if (typeof console == 'undefined') console = /** @type{!Console} */({}); + console.log = /** @type{!function(this:Console, ...*): undefined} */ (print); + console.warn = console.error = /** @type{!function(this:Console, ...*): undefined} */ (typeof printErr != 'undefined' ? printErr : print); + } + +} else + +// Note that this includes Node.js workers when relevant (pthreads is enabled). +// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and +// ENVIRONMENT_IS_NODE. +if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled + scriptDirectory = self.location.href; + } else if (typeof document != 'undefined' && document.currentScript) { // web + scriptDirectory = document.currentScript.src; + } + // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them. + // otherwise, slice off the final part of the url to find the script directory. + // if scriptDirectory does not contain a slash, lastIndexOf will return -1, + // and scriptDirectory will correctly be replaced with an empty string. + // If scriptDirectory contains a query (starting with ?) or a fragment (starting with #), + // they are removed because they could contain a slash. + if (scriptDirectory.indexOf('blob:') !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf('/')+1); + } else { + scriptDirectory = ''; + } + + if (!(typeof window == 'object' || typeof importScripts == 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + // Differentiate the Web Worker from the Node Worker case, as reading must + // be done differently. + { +// include: web_or_worker_shell_read.js +read_ = (url) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.send(null); + return xhr.responseText; + } + + if (ENVIRONMENT_IS_WORKER) { + readBinary = (url) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.responseType = 'arraybuffer'; + xhr.send(null); + return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response)); + }; + } + + readAsync = (url, onload, onerror) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + xhr.onload = () => { + if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + } + +// end include: web_or_worker_shell_read.js + } + + setWindowTitle = (title) => document.title = title; +} else +{ + throw new Error('environment detection error'); +} + +var out = Module['print'] || console.log.bind(console); +var err = Module['printErr'] || console.error.bind(console); + +// Merge back in the overrides +Object.assign(Module, moduleOverrides); +// Free the object hierarchy contained in the overrides, this lets the GC +// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array. +moduleOverrides = null; +checkIncomingModuleAPI(); + +// Emit code to handle expected values on the Module object. This applies Module.x +// to the proper local x. This has two benefits: first, we only emit it if it is +// expected to arrive, and second, by using a local everywhere else that can be +// minified. + +if (Module['arguments']) arguments_ = Module['arguments'];legacyModuleProp('arguments', 'arguments_'); + +if (Module['thisProgram']) thisProgram = Module['thisProgram'];legacyModuleProp('thisProgram', 'thisProgram'); + +if (Module['quit']) quit_ = Module['quit'];legacyModuleProp('quit', 'quit_'); + +// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message +// Assertions on removed incoming Module JS APIs. +assert(typeof Module['memoryInitializerPrefixURL'] == 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['pthreadMainPrefixURL'] == 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['cdInitializerPrefixURL'] == 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['filePackagePrefixURL'] == 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['read'] == 'undefined', 'Module.read option was removed (modify read_ in JS)'); +assert(typeof Module['readAsync'] == 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)'); +assert(typeof Module['readBinary'] == 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)'); +assert(typeof Module['setWindowTitle'] == 'undefined', 'Module.setWindowTitle option was removed (modify setWindowTitle in JS)'); +assert(typeof Module['TOTAL_MEMORY'] == 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY'); +legacyModuleProp('asm', 'wasmExports'); +legacyModuleProp('read', 'read_'); +legacyModuleProp('readAsync', 'readAsync'); +legacyModuleProp('readBinary', 'readBinary'); +legacyModuleProp('setWindowTitle', 'setWindowTitle'); +var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js'; +var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js'; +var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js'; +var FETCHFS = 'FETCHFS is no longer included by default; build with -lfetchfs.js'; +var ICASEFS = 'ICASEFS is no longer included by default; build with -licasefs.js'; +var JSFILEFS = 'JSFILEFS is no longer included by default; build with -ljsfilefs.js'; +var OPFS = 'OPFS is no longer included by default; build with -lopfs.js'; + +var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js'; + +assert(!ENVIRONMENT_IS_SHELL, "shell environment detected but not enabled at build time. Add 'shell' to `-sENVIRONMENT` to enable."); + + +// end include: shell.js +// include: preamble.js +// === Preamble library stuff === + +// Documentation for the public APIs defined in this file must be updated in: +// site/source/docs/api_reference/preamble.js.rst +// A prebuilt local version of the documentation is available at: +// site/build/text/docs/api_reference/preamble.js.txt +// You can also build docs locally as HTML or other formats in site/ +// An online HTML version (which may be of a different version of Emscripten) +// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html + +var wasmBinary; +if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];legacyModuleProp('wasmBinary', 'wasmBinary'); +var noExitRuntime = Module['noExitRuntime'] || true;legacyModuleProp('noExitRuntime', 'noExitRuntime'); + +if (typeof WebAssembly != 'object') { + abort('no native wasm support detected'); +} + +// Wasm globals + +var wasmMemory; + +//======================================== +// Runtime essentials +//======================================== + +// whether we are quitting the application. no code should run after this. +// set in exit() and abort() +var ABORT = false; + +// set by exit() and abort(). Passed to 'onExit' handler. +// NOTE: This is also used as the process return code code in shell environments +// but only when noExitRuntime is false. +var EXITSTATUS; + +/** @type {function(*, string=)} */ +function assert(condition, text) { + if (!condition) { + abort('Assertion failed' + (text ? ': ' + text : '')); + } +} + +// We used to include malloc/free by default in the past. Show a helpful error in +// builds with assertions. +function _malloc() { + abort("malloc() called but not included in the build - add '_malloc' to EXPORTED_FUNCTIONS"); +} +function _free() { + // Show a helpful error since we used to include free by default in the past. + abort("free() called but not included in the build - add '_free' to EXPORTED_FUNCTIONS"); +} + +// Memory management + +var HEAP, +/** @type {!Int8Array} */ + HEAP8, +/** @type {!Uint8Array} */ + HEAPU8, +/** @type {!Int16Array} */ + HEAP16, +/** @type {!Uint16Array} */ + HEAPU16, +/** @type {!Int32Array} */ + HEAP32, +/** @type {!Uint32Array} */ + HEAPU32, +/** @type {!Float32Array} */ + HEAPF32, +/** @type {!Float64Array} */ + HEAPF64; + +function updateMemoryViews() { + var b = wasmMemory.buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(b); + Module['HEAP16'] = HEAP16 = new Int16Array(b); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(b); + Module['HEAP32'] = HEAP32 = new Int32Array(b); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + Module['HEAPF64'] = HEAPF64 = new Float64Array(b); +} + +assert(!Module['STACK_SIZE'], 'STACK_SIZE can no longer be set at runtime. Use -sSTACK_SIZE at link time') + +assert(typeof Int32Array != 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray != undefined && Int32Array.prototype.set != undefined, + 'JS engine does not provide full typed array support'); + +// If memory is defined in wasm, the user can't provide it, or set INITIAL_MEMORY +assert(!Module['wasmMemory'], 'Use of `wasmMemory` detected. Use -sIMPORTED_MEMORY to define wasmMemory externally'); +assert(!Module['INITIAL_MEMORY'], 'Detected runtime INITIAL_MEMORY setting. Use -sIMPORTED_MEMORY to define wasmMemory dynamically'); + +// include: runtime_init_table.js +// In regular non-RELOCATABLE mode the table is exported +// from the wasm module and this will be assigned once +// the exports are available. +var wasmTable; +// end include: runtime_init_table.js +// include: runtime_stack_check.js +// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode. +function writeStackCookie() { + var max = _emscripten_stack_get_end(); + assert((max & 3) == 0); + // If the stack ends at address zero we write our cookies 4 bytes into the + // stack. This prevents interference with SAFE_HEAP and ASAN which also + // monitor writes to address zero. + if (max == 0) { + max += 4; + } + // The stack grow downwards towards _emscripten_stack_get_end. + // We write cookies to the final two words in the stack and detect if they are + // ever overwritten. + HEAPU32[((max)>>2)] = 0x02135467; + HEAPU32[(((max)+(4))>>2)] = 0x89BACDFE; + // Also test the global address 0 for integrity. + HEAPU32[((0)>>2)] = 1668509029; +} + +function checkStackCookie() { + if (ABORT) return; + var max = _emscripten_stack_get_end(); + // See writeStackCookie(). + if (max == 0) { + max += 4; + } + var cookie1 = HEAPU32[((max)>>2)]; + var cookie2 = HEAPU32[(((max)+(4))>>2)]; + if (cookie1 != 0x02135467 || cookie2 != 0x89BACDFE) { + abort(`Stack overflow! Stack cookie has been overwritten at ${ptrToString(max)}, expected hex dwords 0x89BACDFE and 0x2135467, but received ${ptrToString(cookie2)} ${ptrToString(cookie1)}`); + } + // Also test the global address 0 for integrity. + if (HEAPU32[((0)>>2)] != 0x63736d65 /* 'emsc' */) { + abort('Runtime error: The application has corrupted its heap memory area (address zero)!'); + } +} +// end include: runtime_stack_check.js +// include: runtime_assertions.js +// Endianness check +(function() { + var h16 = new Int16Array(1); + var h8 = new Int8Array(h16.buffer); + h16[0] = 0x6373; + if (h8[0] !== 0x73 || h8[1] !== 0x63) throw 'Runtime error: expected the system to be little-endian! (Run with -sSUPPORT_BIG_ENDIAN to bypass)'; +})(); + +// end include: runtime_assertions.js +var __ATPRERUN__ = []; // functions called before the runtime is initialized +var __ATINIT__ = []; // functions called during startup +var __ATMAIN__ = []; // functions called when main() is to be run +var __ATEXIT__ = []; // functions called during shutdown +var __ATPOSTRUN__ = []; // functions called after the main() is called + +var runtimeInitialized = false; + +var runtimeKeepaliveCounter = 0; + +function keepRuntimeAlive() { + return noExitRuntime || runtimeKeepaliveCounter > 0; +} + +function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); +} + +function initRuntime() { + assert(!runtimeInitialized); + runtimeInitialized = true; + + checkStackCookie(); + + + callRuntimeCallbacks(__ATINIT__); +} + +function preMain() { + checkStackCookie(); + + callRuntimeCallbacks(__ATMAIN__); +} + +function postRun() { + checkStackCookie(); + + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + + callRuntimeCallbacks(__ATPOSTRUN__); +} + +function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); +} + +function addOnInit(cb) { + __ATINIT__.unshift(cb); +} + +function addOnPreMain(cb) { + __ATMAIN__.unshift(cb); +} + +function addOnExit(cb) { +} + +function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); +} + +// include: runtime_math.js +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32 + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc + +assert(Math.imul, 'This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.fround, 'This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.clz32, 'This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.trunc, 'This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +// end include: runtime_math.js +// A counter of dependencies for calling run(). If we need to +// do asynchronous work before running, increment this and +// decrement it. Incrementing must happen in a place like +// Module.preRun (used by emcc to add file preloading). +// Note that you can add dependencies in preRun, even though +// it happens right before run - run will be postponed until +// the dependencies are met. +var runDependencies = 0; +var runDependencyWatcher = null; +var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled +var runDependencyTracking = {}; + +function getUniqueRunDependency(id) { + var orig = id; + while (1) { + if (!runDependencyTracking[id]) return id; + id = orig + Math.random(); + } +} + +function addRunDependency(id) { + runDependencies++; + + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + + if (id) { + assert(!runDependencyTracking[id]); + runDependencyTracking[id] = 1; + if (runDependencyWatcher === null && typeof setInterval != 'undefined') { + // Check for missing dependencies every few seconds + runDependencyWatcher = setInterval(() => { + if (ABORT) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + return; + } + var shown = false; + for (var dep in runDependencyTracking) { + if (!shown) { + shown = true; + err('still waiting on run dependencies:'); + } + err(`dependency: ${dep}`); + } + if (shown) { + err('(end of list)'); + } + }, 10000); + } + } else { + err('warning: run dependency added without ID'); + } +} + +function removeRunDependency(id) { + runDependencies--; + + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + + if (id) { + assert(runDependencyTracking[id]); + delete runDependencyTracking[id]; + } else { + err('warning: run dependency removed without ID'); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); // can add another dependenciesFulfilled + } + } +} + +/** @param {string|number=} what */ +function abort(what) { + if (Module['onAbort']) { + Module['onAbort'](what); + } + + what = 'Aborted(' + what + ')'; + // TODO(sbc): Should we remove printing and leave it up to whoever + // catches the exception? + err(what); + + ABORT = true; + EXITSTATUS = 1; + + // Use a wasm runtime error, because a JS error might be seen as a foreign + // exception, which means we'd run destructors on it. We need the error to + // simply make the program stop. + // FIXME This approach does not work in Wasm EH because it currently does not assume + // all RuntimeErrors are from traps; it decides whether a RuntimeError is from + // a trap or not based on a hidden field within the object. So at the moment + // we don't have a way of throwing a wasm trap from JS. TODO Make a JS API that + // allows this in the wasm spec. + + // Suppress closure compiler warning here. Closure compiler's builtin extern + // defintion for WebAssembly.RuntimeError claims it takes no arguments even + // though it can. + // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed. + /** @suppress {checkTypes} */ + var e = new WebAssembly.RuntimeError(what); + + // Throw the error whether or not MODULARIZE is set because abort is used + // in code paths apart from instantiation where an exception is expected + // to be thrown when abort is called. + throw e; +} + +// include: memoryprofiler.js +// end include: memoryprofiler.js +// show errors on likely calls to FS when it was not included +var FS = { + error() { + abort('Filesystem support (FS) was not included. The problem is that you are using files from JS, but files were not used from C/C++, so filesystem support was not auto-included. You can force-include filesystem support with -sFORCE_FILESYSTEM'); + }, + init() { FS.error() }, + createDataFile() { FS.error() }, + createPreloadedFile() { FS.error() }, + createLazyFile() { FS.error() }, + open() { FS.error() }, + mkdev() { FS.error() }, + registerDevice() { FS.error() }, + analyzePath() { FS.error() }, + + ErrnoError() { FS.error() }, +}; +Module['FS_createDataFile'] = FS.createDataFile; +Module['FS_createPreloadedFile'] = FS.createPreloadedFile; + +// include: URIUtils.js +// Prefix of data URIs emitted by SINGLE_FILE and related options. +var dataURIPrefix = 'data:application/octet-stream;base64,'; + +// Indicates whether filename is a base64 data URI. +function isDataURI(filename) { + // Prefix of data URIs emitted by SINGLE_FILE and related options. + return filename.startsWith(dataURIPrefix); +} + +// Indicates whether filename is delivered via file protocol (as opposed to http/https) +function isFileURI(filename) { + return filename.startsWith('file://'); +} +// end include: URIUtils.js +function createExportWrapper(name) { + return function() { + assert(runtimeInitialized, `native function \`${name}\` called before runtime initialization`); + var f = wasmExports[name]; + assert(f, `exported native function \`${name}\` not found`); + return f.apply(null, arguments); + }; +} + +// include: runtime_exceptions.js +// end include: runtime_exceptions.js +var wasmBinaryFile; + wasmBinaryFile = 'fibonacci.wasm'; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + +function getBinarySync(file) { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } + throw "both async and sync fetching of the wasm failed"; +} + +function getBinaryPromise(binaryFile) { + // If we don't have the binary yet, try to load it asynchronously. + // Fetch has some additional restrictions over XHR, like it can't be used on a file:// url. + // See https://github.com/github/fetch/pull/92#issuecomment-140665932 + // Cordova or Electron apps are typically loaded from a file:// url. + // So use fetch if it is available and the url is not a file, otherwise fall back to XHR. + if (!wasmBinary + && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch == 'function' + && !isFileURI(binaryFile) + ) { + return fetch(binaryFile, { credentials: 'same-origin' }).then((response) => { + if (!response['ok']) { + throw "failed to load wasm binary file at '" + binaryFile + "'"; + } + return response['arrayBuffer'](); + }).catch(() => getBinarySync(binaryFile)); + } + else if (readAsync) { + // fetch is not available or url is file => try XHR (readAsync uses XHR internally) + return new Promise((resolve, reject) => { + readAsync(binaryFile, (response) => resolve(new Uint8Array(/** @type{!ArrayBuffer} */(response))), reject) + }); + } + } + + // Otherwise, getBinarySync should be able to get it synchronously + return Promise.resolve().then(() => getBinarySync(binaryFile)); +} + +function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile).then((binary) => { + return WebAssembly.instantiate(binary, imports); + }).then((instance) => { + return instance; + }).then(receiver, (reason) => { + err(`failed to asynchronously prepare wasm: ${reason}`); + + // Warn on some common problems. + if (isFileURI(wasmBinaryFile)) { + err(`warning: Loading from a file URI (${wasmBinaryFile}) is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing`); + } + abort(reason); + }); +} + +function instantiateAsync(binary, binaryFile, imports, callback) { + if (!binary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(binaryFile) && + // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously. + !isFileURI(binaryFile) && + // Avoid instantiateStreaming() on Node.js environment for now, as while + // Node.js v18.1.0 implements it, it does not have a full fetch() + // implementation yet. + // + // Reference: + // https://github.com/emscripten-core/emscripten/pull/16917 + !ENVIRONMENT_IS_NODE && + typeof fetch == 'function') { + return fetch(binaryFile, { credentials: 'same-origin' }).then((response) => { + // Suppress closure warning here since the upstream definition for + // instantiateStreaming only allows Promise rather than + // an actual Response. + // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure is fixed. + /** @suppress {checkTypes} */ + var result = WebAssembly.instantiateStreaming(response, imports); + + return result.then( + callback, + function(reason) { + // We expect the most common failure cause to be a bad MIME type for the binary, + // in which case falling back to ArrayBuffer instantiation should work. + err(`wasm streaming compile failed: ${reason}`); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer(binaryFile, imports, callback); + }); + }); + } + return instantiateArrayBuffer(binaryFile, imports, callback); +} + +// Create the wasm instance. +// Receives the wasm imports, returns the exports. +function createWasm() { + // prepare imports + var info = { + 'env': wasmImports, + 'wasi_snapshot_preview1': wasmImports, + }; + // Load the wasm module and create an instance of using native support in the JS engine. + // handle a generated wasm instance, receiving its exports and + // performing other necessary setup + /** @param {WebAssembly.Module=} module*/ + function receiveInstance(instance, module) { + var exports = instance.exports; + + wasmExports = exports; + + + wasmMemory = wasmExports['memory']; + + assert(wasmMemory, "memory not found in wasm exports"); + // This assertion doesn't hold when emscripten is run in --post-link + // mode. + // TODO(sbc): Read INITIAL_MEMORY out of the wasm file in post-link mode. + //assert(wasmMemory.buffer.byteLength === 16777216); + updateMemoryViews(); + + wasmTable = wasmExports['__indirect_function_table']; + + assert(wasmTable, "table not found in wasm exports"); + + addOnInit(wasmExports['__wasm_call_ctors']); + + removeRunDependency('wasm-instantiate'); + return exports; + } + // wait for the pthread pool (if any) + addRunDependency('wasm-instantiate'); + + // Prefer streaming instantiation if available. + // Async compilation can be confusing when an error on the page overwrites Module + // (for example, if the order of elements is wrong, and the one defining Module is + // later), so we save Module and check it later. + var trueModule = Module; + function receiveInstantiationResult(result) { + // 'result' is a ResultObject object which has both the module and instance. + // receiveInstance() will swap in the exports (to Module.asm) so they can be called + assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?'); + trueModule = null; + // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line. + // When the regression is fixed, can restore the above PTHREADS-enabled path. + receiveInstance(result['instance']); + } + + // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback + // to manually instantiate the Wasm module themselves. This allows pages to + // run the instantiation parallel to any other async startup actions they are + // performing. + // Also pthreads and wasm workers initialize the wasm instance through this + // path. + if (Module['instantiateWasm']) { + + try { + return Module['instantiateWasm'](info, receiveInstance); + } catch(e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + return false; + } + } + + instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult); + return {}; // no exports yet; we'll fill them in later +} + +// Globals used by JS i64 conversions (see makeSetValue) +var tempDouble; +var tempI64; + +// include: runtime_debug.js +function legacyModuleProp(prop, newName, incomming=true) { + if (!Object.getOwnPropertyDescriptor(Module, prop)) { + Object.defineProperty(Module, prop, { + configurable: true, + get() { + let extra = incomming ? ' (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)' : ''; + abort(`\`Module.${prop}\` has been replaced by \`${newName}\`` + extra); + + } + }); + } +} + +function ignoredModuleProp(prop) { + if (Object.getOwnPropertyDescriptor(Module, prop)) { + abort(`\`Module.${prop}\` was supplied but \`${prop}\` not included in INCOMING_MODULE_JS_API`); + } +} + +// forcing the filesystem exports a few things by default +function isExportedByForceFilesystem(name) { + return name === 'FS_createPath' || + name === 'FS_createDataFile' || + name === 'FS_createPreloadedFile' || + name === 'FS_unlink' || + name === 'addRunDependency' || + // The old FS has some functionality that WasmFS lacks. + name === 'FS_createLazyFile' || + name === 'FS_createDevice' || + name === 'removeRunDependency'; +} + +function missingGlobal(sym, msg) { + if (typeof globalThis !== 'undefined') { + Object.defineProperty(globalThis, sym, { + configurable: true, + get() { + warnOnce('`' + sym + '` is not longer defined by emscripten. ' + msg); + return undefined; + } + }); + } +} + +missingGlobal('buffer', 'Please use HEAP8.buffer or wasmMemory.buffer'); +missingGlobal('asm', 'Please use wasmExports instead'); + +function missingLibrarySymbol(sym) { + if (typeof globalThis !== 'undefined' && !Object.getOwnPropertyDescriptor(globalThis, sym)) { + Object.defineProperty(globalThis, sym, { + configurable: true, + get() { + // Can't `abort()` here because it would break code that does runtime + // checks. e.g. `if (typeof SDL === 'undefined')`. + var msg = '`' + sym + '` is a library symbol and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line'; + // DEFAULT_LIBRARY_FUNCS_TO_INCLUDE requires the name as it appears in + // library.js, which means $name for a JS name with no prefix, or name + // for a JS name like _name. + var librarySymbol = sym; + if (!librarySymbol.startsWith('_')) { + librarySymbol = '$' + sym; + } + msg += " (e.g. -sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE='" + librarySymbol + "')"; + if (isExportedByForceFilesystem(sym)) { + msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you'; + } + warnOnce(msg); + return undefined; + } + }); + } + // Any symbol that is not included from the JS libary is also (by definition) + // not exported on the Module object. + unexportedRuntimeSymbol(sym); +} + +function unexportedRuntimeSymbol(sym) { + if (!Object.getOwnPropertyDescriptor(Module, sym)) { + Object.defineProperty(Module, sym, { + configurable: true, + get() { + var msg = "'" + sym + "' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the Emscripten FAQ)"; + if (isExportedByForceFilesystem(sym)) { + msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you'; + } + abort(msg); + } + }); + } +} + +// Used by XXXXX_DEBUG settings to output debug messages. +function dbg(text) { + // TODO(sbc): Make this configurable somehow. Its not always convenient for + // logging to show up as warnings. + console.warn.apply(console, arguments); +} +// end include: runtime_debug.js +// === Body === + +// end include: preamble.js + + /** @constructor */ + function ExitStatus(status) { + this.name = 'ExitStatus'; + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + // Pass the module as the first argument. + callbacks.shift()(Module); + } + }; + + + /** + * @param {number} ptr + * @param {string} type + */ + function getValue(ptr, type = 'i8') { + if (type.endsWith('*')) type = '*'; + switch (type) { + case 'i1': return HEAP8[((ptr)>>0)]; + case 'i8': return HEAP8[((ptr)>>0)]; + case 'i16': return HEAP16[((ptr)>>1)]; + case 'i32': return HEAP32[((ptr)>>2)]; + case 'i64': abort('to do getValue(i64) use WASM_BIGINT'); + case 'float': return HEAPF32[((ptr)>>2)]; + case 'double': return HEAPF64[((ptr)>>3)]; + case '*': return HEAPU32[((ptr)>>2)]; + default: abort(`invalid type for getValue: ${type}`); + } + } + + var ptrToString = (ptr) => { + assert(typeof ptr === 'number'); + // With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned. + ptr >>>= 0; + return '0x' + ptr.toString(16).padStart(8, '0'); + }; + + + /** + * @param {number} ptr + * @param {number} value + * @param {string} type + */ + function setValue(ptr, value, type = 'i8') { + if (type.endsWith('*')) type = '*'; + switch (type) { + case 'i1': HEAP8[((ptr)>>0)] = value; break; + case 'i8': HEAP8[((ptr)>>0)] = value; break; + case 'i16': HEAP16[((ptr)>>1)] = value; break; + case 'i32': HEAP32[((ptr)>>2)] = value; break; + case 'i64': abort('to do setValue(i64) use WASM_BIGINT'); + case 'float': HEAPF32[((ptr)>>2)] = value; break; + case 'double': HEAPF64[((ptr)>>3)] = value; break; + case '*': HEAPU32[((ptr)>>2)] = value; break; + default: abort(`invalid type for setValue: ${type}`); + } + } + + var warnOnce = (text) => { + if (!warnOnce.shown) warnOnce.shown = {}; + if (!warnOnce.shown[text]) { + warnOnce.shown[text] = 1; + if (ENVIRONMENT_IS_NODE) text = 'warning: ' + text; + err(text); + } + }; + + var _emscripten_memcpy_big = (dest, src, num) => HEAPU8.copyWithin(dest, src, src + num); + + var printCharBuffers = [null,[],[]]; + + var UTF8Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ + var UTF8ArrayToString = (heapOrArray, idx, maxBytesToRead) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + // TextDecoder needs to know the byte length in advance, it doesn't stop on + // null terminator by itself. Also, use the length info to avoid running tiny + // strings through TextDecoder, since .subarray() allocates garbage. + // (As a tiny code save trick, compare endPtr against endIdx using a negation, + // so that undefined means Infinity) + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + // If building with TextDecoder, we have already computed the string length + // above, so test loop end condition against that + while (idx < endPtr) { + // For UTF8 byte structure, see: + // http://en.wikipedia.org/wiki/UTF-8#Description + // https://www.ietf.org/rfc/rfc2279.txt + // https://tools.ietf.org/html/rfc3629 + var u0 = heapOrArray[idx++]; + if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 0xF0) == 0xE0) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte ' + ptrToString(u0) + ' encountered when deserializing a UTF-8 string in wasm memory to a JS string!'); + u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); + } + + if (u0 < 0x10000) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } + } + return str; + }; + var printChar = (stream, curr) => { + var buffer = printCharBuffers[stream]; + assert(buffer); + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0)); + buffer.length = 0; + } else { + buffer.push(curr); + } + }; + + var flush_NO_FILESYSTEM = () => { + // flush anything remaining in the buffers during shutdown + _fflush(0); + if (printCharBuffers[1].length) printChar(1, 10); + if (printCharBuffers[2].length) printChar(2, 10); + }; + + + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index (i.e. maxBytesToRead will not + * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing + * frequent uses of UTF8ToString() with and without maxBytesToRead may throw + * JS JIT optimizations off, so it is worth to consider consistently using one + * @return {string} + */ + var UTF8ToString = (ptr, maxBytesToRead) => { + assert(typeof ptr == 'number'); + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; + }; + var SYSCALLS = { + varargs:undefined, + get() { + assert(SYSCALLS.varargs != undefined); + var ret = HEAP32[((SYSCALLS.varargs)>>2)]; + SYSCALLS.varargs += 4; + return ret; + }, + getp() { return SYSCALLS.get() }, + getStr(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, + }; + var _fd_write = (fd, iov, iovcnt, pnum) => { + // hack to support printf in SYSCALLS_REQUIRE_FILESYSTEM=0 + var num = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[((iov)>>2)]; + var len = HEAPU32[(((iov)+(4))>>2)]; + iov += 8; + for (var j = 0; j < len; j++) { + printChar(fd, HEAPU8[ptr+j]); + } + num += len; + } + HEAPU32[((pnum)>>2)] = num; + return 0; + }; + + + var _proc_exit = (code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + if (Module['onExit']) Module['onExit'](code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + /** @param {boolean|number=} implicit */ + var exitJS = (status, implicit) => { + EXITSTATUS = status; + + checkUnflushedContent(); + + // if exit() was called explicitly, warn the user if the runtime isn't actually being shut down + if (keepRuntimeAlive() && !implicit) { + var msg = `program exited (with status: ${status}), but keepRuntimeAlive() is set (counter=${runtimeKeepaliveCounter}) due to an async operation, so halting execution but not exiting the runtime or preventing further async execution (you can use emscripten_force_exit, if you want to force a true shutdown)`; + err(msg); + } + + _proc_exit(status); + }; + + var handleException = (e) => { + // Certain exception types we do not treat as errors since they are used for + // internal control flow. + // 1. ExitStatus, which is thrown by exit() + // 2. "unwind", which is thrown by emscripten_unwind_to_js_event_loop() and others + // that wish to return to JS event loop. + if (e instanceof ExitStatus || e == 'unwind') { + return EXITSTATUS; + } + checkStackCookie(); + if (e instanceof WebAssembly.RuntimeError) { + if (_emscripten_stack_get_current() <= 0) { + err('Stack overflow detected. You can try increasing -sSTACK_SIZE (currently set to 65536)'); + } + } + quit_(1, e); + }; +function checkIncomingModuleAPI() { + ignoredModuleProp('fetchSettings'); +} +var wasmImports = { + emscripten_memcpy_big: _emscripten_memcpy_big, + fd_write: _fd_write +}; +var wasmExports = createWasm(); +var ___wasm_call_ctors = createExportWrapper('__wasm_call_ctors'); +var _main = Module['_main'] = createExportWrapper('main'); +var ___errno_location = createExportWrapper('__errno_location'); +var _fflush = Module['_fflush'] = createExportWrapper('fflush'); +var _emscripten_stack_init = () => (_emscripten_stack_init = wasmExports['emscripten_stack_init'])(); +var _emscripten_stack_get_free = () => (_emscripten_stack_get_free = wasmExports['emscripten_stack_get_free'])(); +var _emscripten_stack_get_base = () => (_emscripten_stack_get_base = wasmExports['emscripten_stack_get_base'])(); +var _emscripten_stack_get_end = () => (_emscripten_stack_get_end = wasmExports['emscripten_stack_get_end'])(); +var stackSave = createExportWrapper('stackSave'); +var stackRestore = createExportWrapper('stackRestore'); +var stackAlloc = createExportWrapper('stackAlloc'); +var _emscripten_stack_get_current = () => (_emscripten_stack_get_current = wasmExports['emscripten_stack_get_current'])(); +var dynCall_jiji = Module['dynCall_jiji'] = createExportWrapper('dynCall_jiji'); + + +// include: postamble.js +// === Auto-generated postamble setup entry stuff === + +var missingLibrarySymbols = [ + 'writeI53ToI64', + 'writeI53ToI64Clamped', + 'writeI53ToI64Signaling', + 'writeI53ToU64Clamped', + 'writeI53ToU64Signaling', + 'readI53FromI64', + 'readI53FromU64', + 'convertI32PairToI53', + 'convertI32PairToI53Checked', + 'convertU32PairToI53', + 'zeroMemory', + 'getHeapMax', + 'abortOnCannotGrowMemory', + 'growMemory', + 'isLeapYear', + 'ydayFromDate', + 'arraySum', + 'addDays', + 'setErrNo', + 'inetPton4', + 'inetNtop4', + 'inetPton6', + 'inetNtop6', + 'readSockaddr', + 'writeSockaddr', + 'getHostByName', + 'initRandomFill', + 'randomFill', + 'getCallstack', + 'emscriptenLog', + 'convertPCtoSourceLocation', + 'readEmAsmArgs', + 'jstoi_q', + 'jstoi_s', + 'getExecutableName', + 'listenOnce', + 'autoResumeAudioContext', + 'dynCallLegacy', + 'getDynCaller', + 'dynCall', + 'runtimeKeepalivePush', + 'runtimeKeepalivePop', + 'callUserCallback', + 'maybeExit', + 'safeSetTimeout', + 'asmjsMangle', + 'asyncLoad', + 'alignMemory', + 'mmapAlloc', + 'handleAllocatorInit', + 'HandleAllocator', + 'getNativeTypeSize', + 'STACK_SIZE', + 'STACK_ALIGN', + 'POINTER_SIZE', + 'ASSERTIONS', + 'getCFunc', + 'ccall', + 'cwrap', + 'uleb128Encode', + 'sigToWasmTypes', + 'generateFuncType', + 'convertJsFunctionToWasm', + 'getEmptyTableSlot', + 'updateTableMap', + 'getFunctionAddress', + 'addFunction', + 'removeFunction', + 'reallyNegative', + 'unSign', + 'strLen', + 'reSign', + 'formatString', + 'stringToUTF8Array', + 'stringToUTF8', + 'lengthBytesUTF8', + 'intArrayFromString', + 'intArrayToString', + 'AsciiToString', + 'stringToAscii', + 'UTF16ToString', + 'stringToUTF16', + 'lengthBytesUTF16', + 'UTF32ToString', + 'stringToUTF32', + 'lengthBytesUTF32', + 'stringToNewUTF8', + 'stringToUTF8OnStack', + 'writeArrayToMemory', + 'registerKeyEventCallback', + 'maybeCStringToJsString', + 'findEventTarget', + 'findCanvasEventTarget', + 'getBoundingClientRect', + 'fillMouseEventData', + 'registerMouseEventCallback', + 'registerWheelEventCallback', + 'registerUiEventCallback', + 'registerFocusEventCallback', + 'fillDeviceOrientationEventData', + 'registerDeviceOrientationEventCallback', + 'fillDeviceMotionEventData', + 'registerDeviceMotionEventCallback', + 'screenOrientation', + 'fillOrientationChangeEventData', + 'registerOrientationChangeEventCallback', + 'fillFullscreenChangeEventData', + 'registerFullscreenChangeEventCallback', + 'JSEvents_requestFullscreen', + 'JSEvents_resizeCanvasForFullscreen', + 'registerRestoreOldStyle', + 'hideEverythingExceptGivenElement', + 'restoreHiddenElements', + 'setLetterbox', + 'softFullscreenResizeWebGLRenderTarget', + 'doRequestFullscreen', + 'fillPointerlockChangeEventData', + 'registerPointerlockChangeEventCallback', + 'registerPointerlockErrorEventCallback', + 'requestPointerLock', + 'fillVisibilityChangeEventData', + 'registerVisibilityChangeEventCallback', + 'registerTouchEventCallback', + 'fillGamepadEventData', + 'registerGamepadEventCallback', + 'registerBeforeUnloadEventCallback', + 'fillBatteryEventData', + 'battery', + 'registerBatteryEventCallback', + 'setCanvasElementSize', + 'getCanvasElementSize', + 'demangle', + 'demangleAll', + 'jsStackTrace', + 'stackTrace', + 'getEnvStrings', + 'checkWasiClock', + 'wasiRightsToMuslOFlags', + 'wasiOFlagsToMuslOFlags', + 'createDyncallWrapper', + 'setImmediateWrapped', + 'clearImmediateWrapped', + 'polyfillSetImmediate', + 'getPromise', + 'makePromise', + 'idsToPromises', + 'makePromiseCallback', + 'ExceptionInfo', + 'findMatchingCatch', + 'setMainLoop', + 'getSocketFromFD', + 'getSocketAddress', + 'FS_createPreloadedFile', + 'FS_modeStringToFlags', + 'FS_getMode', + 'FS_stdin_getChar', + '_setNetworkCallback', + 'heapObjectForWebGLType', + 'heapAccessShiftForWebGLHeap', + 'webgl_enable_ANGLE_instanced_arrays', + 'webgl_enable_OES_vertex_array_object', + 'webgl_enable_WEBGL_draw_buffers', + 'webgl_enable_WEBGL_multi_draw', + 'emscriptenWebGLGet', + 'computeUnpackAlignedImageSize', + 'colorChannelsInGlTextureFormat', + 'emscriptenWebGLGetTexPixelData', + '__glGenObject', + 'emscriptenWebGLGetUniform', + 'webglGetUniformLocation', + 'webglPrepareUniformLocationsBeforeFirstUse', + 'webglGetLeftBracePos', + 'emscriptenWebGLGetVertexAttrib', + '__glGetActiveAttribOrUniform', + 'writeGLArray', + 'registerWebGlEventCallback', + 'runAndAbortIfError', + 'SDL_unicode', + 'SDL_ttfContext', + 'SDL_audio', + 'GLFW_Window', + 'ALLOC_NORMAL', + 'ALLOC_STACK', + 'allocate', + 'writeStringToMemory', + 'writeAsciiToMemory', +]; +missingLibrarySymbols.forEach(missingLibrarySymbol) + +var unexportedSymbols = [ + 'run', + 'addOnPreRun', + 'addOnInit', + 'addOnPreMain', + 'addOnExit', + 'addOnPostRun', + 'addRunDependency', + 'removeRunDependency', + 'FS_createFolder', + 'FS_createPath', + 'FS_createDataFile', + 'FS_createLazyFile', + 'FS_createLink', + 'FS_createDevice', + 'FS_readFile', + 'FS_unlink', + 'out', + 'err', + 'callMain', + 'abort', + 'keepRuntimeAlive', + 'wasmMemory', + 'wasmTable', + 'wasmExports', + 'stackAlloc', + 'stackSave', + 'stackRestore', + 'getTempRet0', + 'setTempRet0', + 'writeStackCookie', + 'checkStackCookie', + 'ptrToString', + 'exitJS', + 'ENV', + 'MONTH_DAYS_REGULAR', + 'MONTH_DAYS_LEAP', + 'MONTH_DAYS_REGULAR_CUMULATIVE', + 'MONTH_DAYS_LEAP_CUMULATIVE', + 'ERRNO_CODES', + 'ERRNO_MESSAGES', + 'DNS', + 'Protocols', + 'Sockets', + 'timers', + 'warnOnce', + 'UNWIND_CACHE', + 'readEmAsmArgsArray', + 'handleException', + 'freeTableIndexes', + 'functionsInTableMap', + 'setValue', + 'getValue', + 'PATH', + 'PATH_FS', + 'UTF8Decoder', + 'UTF8ArrayToString', + 'UTF8ToString', + 'UTF16Decoder', + 'JSEvents', + 'specialHTMLTargets', + 'currentFullscreenStrategy', + 'restoreOldWindowedStyle', + 'ExitStatus', + 'flush_NO_FILESYSTEM', + 'promiseMap', + 'uncaughtExceptionCount', + 'exceptionLast', + 'exceptionCaught', + 'Browser', + 'wget', + 'SYSCALLS', + 'preloadPlugins', + 'FS_stdin_getChar_buffer', + 'FS', + 'MEMFS', + 'TTY', + 'PIPEFS', + 'SOCKFS', + 'tempFixedLengthArray', + 'miniTempWebGLFloatBuffers', + 'miniTempWebGLIntBuffers', + 'GL', + 'emscripten_webgl_power_preferences', + 'AL', + 'GLUT', + 'EGL', + 'GLEW', + 'IDBStore', + 'SDL', + 'SDL_gfx', + 'GLFW', + 'allocateUTF8', + 'allocateUTF8OnStack', +]; +unexportedSymbols.forEach(unexportedRuntimeSymbol); + + + +var calledRun; + +dependenciesFulfilled = function runCaller() { + // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled +}; + +function callMain() { + assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on Module["onRuntimeInitialized"])'); + assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called'); + + var entryFunction = _main; + + var argc = 0; + var argv = 0; + + try { + + var ret = entryFunction(argc, argv); + + // if we're not running an evented main loop, it's time to exit + exitJS(ret, /* implicit = */ true); + return ret; + } + catch (e) { + return handleException(e); + } +} + +function stackCheckInit() { + // This is normally called automatically during __wasm_call_ctors but need to + // get these values before even running any of the ctors so we call it redundantly + // here. + _emscripten_stack_init(); + // TODO(sbc): Move writeStackCookie to native to to avoid this. + writeStackCookie(); +} + +function run() { + + if (runDependencies > 0) { + return; + } + + stackCheckInit(); + + preRun(); + + // a preRun added a dependency, run will be called later + if (runDependencies > 0) { + return; + } + + function doRun() { + // run may have just been called through dependencies being fulfilled just in this very frame, + // or while the async setStatus time below was happening + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + + if (ABORT) return; + + initRuntime(); + + preMain(); + + if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized'](); + + if (shouldRunNow) callMain(); + + postRun(); + } + + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function() { + setTimeout(function() { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else + { + doRun(); + } + checkStackCookie(); +} + +function checkUnflushedContent() { + // Compiler settings do not allow exiting the runtime, so flushing + // the streams is not possible. but in ASSERTIONS mode we check + // if there was something to flush, and if so tell the user they + // should request that the runtime be exitable. + // Normally we would not even include flush() at all, but in ASSERTIONS + // builds we do so just for this check, and here we see if there is any + // content to flush, that is, we check if there would have been + // something a non-ASSERTIONS build would have not seen. + // How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0 + // mode (which has its own special function for this; otherwise, all + // the code is inside libc) + var oldOut = out; + var oldErr = err; + var has = false; + out = err = (x) => { + has = true; + } + try { // it doesn't matter if it fails + flush_NO_FILESYSTEM(); + } catch(e) {} + out = oldOut; + err = oldErr; + if (has) { + warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the Emscripten FAQ), or make sure to emit a newline when you printf etc.'); + warnOnce('(this may also be due to not including full filesystem support - try building with -sFORCE_FILESYSTEM)'); + } +} + +if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } +} + +// shouldRunNow refers to calling main(), not run(). +var shouldRunNow = true; + +if (Module['noInitialRun']) shouldRunNow = false; + +run(); + + +// end include: postamble.js diff --git a/testWorkspace/web/dwarf/fibonacci.wasm b/testWorkspace/web/dwarf/fibonacci.wasm new file mode 100644 index 0000000000000000000000000000000000000000..ddae359f26a646df046fcaaf338470b809d71663 GIT binary patch literal 92657 zcmdSC37A|}wKlx>8LCdzsj27c?n>uWRVV2rou&gJ2@ptE2#{ceh=381&P>t?8JiHi zF=-%T1VKQqvj%YBdJ!*P#fhs#P(c|42lReUhzMR4#R>2N=6~O{ ^&67T)~=lP%K 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