wasm-idle 0.7.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +760 -81
- package/dist/index.d.ts +4 -9
- package/dist/index.js +2 -4
- package/dist/playground/applicationAssets.d.ts +4 -0
- package/dist/playground/applicationAssets.js +277 -0
- package/dist/playground/assemblyscript.d.ts +41 -0
- package/dist/playground/assemblyscript.js +630 -0
- package/dist/playground/assetBridge.d.ts +18 -7
- package/dist/playground/assetBridge.js +824 -100
- package/dist/playground/assets.d.ts +813 -19
- package/dist/playground/assets.js +2096 -156
- package/dist/playground/awk.d.ts +5 -0
- package/dist/playground/awk.js +60 -0
- package/dist/playground/bash.d.ts +53 -0
- package/dist/playground/bash.js +1096 -0
- package/dist/playground/bashWorkerProtocol.d.ts +88 -0
- package/dist/playground/bashWorkerProtocol.js +135 -0
- package/dist/playground/bqn.d.ts +5 -0
- package/dist/playground/bqn.js +57 -0
- package/dist/playground/bqnPreflight.d.ts +26 -0
- package/dist/playground/bqnPreflight.js +399 -0
- package/dist/playground/c3.d.ts +15 -0
- package/dist/playground/c3.js +154 -0
- package/dist/playground/clang.d.ts +35 -19
- package/dist/playground/clang.js +241 -52
- package/dist/playground/clangAssetIntegrity.d.ts +32 -0
- package/dist/playground/clangAssetIntegrity.js +8 -0
- package/dist/playground/clojurescript.d.ts +5 -0
- package/dist/playground/clojurescript.js +59 -0
- package/dist/playground/clojurescriptPreflight.d.ts +26 -0
- package/dist/playground/clojurescriptPreflight.js +383 -0
- package/dist/playground/cobol.d.ts +46 -0
- package/dist/playground/cobol.js +703 -0
- package/dist/playground/d.d.ts +47 -0
- package/dist/playground/d.js +644 -0
- package/dist/playground/dOuterAssets.d.ts +16 -0
- package/dist/playground/dOuterAssets.js +163 -0
- package/dist/playground/dotnet.d.ts +99 -0
- package/dist/playground/dotnet.js +1131 -0
- package/dist/playground/duckdb.d.ts +36 -0
- package/dist/playground/duckdb.js +542 -0
- package/dist/playground/elixir.d.ts +18 -10
- package/dist/playground/elixir.js +630 -96
- package/dist/playground/elixirAssets.d.ts +6 -0
- package/dist/playground/elixirAssets.js +33 -0
- package/dist/playground/executionObservation.d.ts +22 -0
- package/dist/playground/executionObservation.js +65 -0
- package/dist/playground/forth.d.ts +5 -0
- package/dist/playground/forth.js +53 -0
- package/dist/playground/forthPreflight.d.ts +24 -0
- package/dist/playground/forthPreflight.js +198 -0
- package/dist/playground/fortran.d.ts +47 -0
- package/dist/playground/fortran.js +651 -0
- package/dist/playground/fortranAssets.d.ts +6 -0
- package/dist/playground/fortranAssets.js +27 -0
- package/dist/playground/gleam.d.ts +6 -0
- package/dist/playground/gleam.js +33 -0
- package/dist/playground/go.d.ts +17 -11
- package/dist/playground/go.js +376 -72
- package/dist/playground/goDebugInstrumentation.d.ts +1 -0
- package/dist/playground/goDebugInstrumentation.js +229 -0
- package/dist/playground/haskell.d.ts +44 -0
- package/dist/playground/haskell.js +678 -0
- package/dist/playground/haskellAssets.d.ts +24 -0
- package/dist/playground/haskellAssets.js +93 -0
- package/dist/playground/index.d.ts +1 -1
- package/dist/playground/index.js +360 -111
- package/dist/playground/j.d.ts +5 -0
- package/dist/playground/j.js +60 -0
- package/dist/playground/jPreflight.d.ts +26 -0
- package/dist/playground/jPreflight.js +372 -0
- package/dist/playground/janet.d.ts +5 -0
- package/dist/playground/janet.js +64 -0
- package/dist/playground/java.d.ts +24 -10
- package/dist/playground/java.js +706 -84
- package/dist/playground/javaSource.d.ts +5 -0
- package/dist/playground/javaSource.js +16 -0
- package/dist/playground/javaStdin.d.ts +1 -1
- package/dist/playground/javaStdin.js +13 -4
- package/dist/playground/julia.d.ts +5 -0
- package/dist/playground/julia.js +64 -0
- package/dist/playground/lfortran.d.ts +8 -0
- package/dist/playground/lfortran.js +30 -0
- package/dist/playground/lfortranAssets.d.ts +21 -0
- package/dist/playground/lfortranAssets.js +118 -0
- package/dist/playground/lisp.d.ts +45 -0
- package/dist/playground/lisp.js +640 -0
- package/dist/playground/lispAssets.d.ts +9 -0
- package/dist/playground/lispAssets.js +74 -0
- package/dist/playground/lldbManifest.d.ts +3 -0
- package/dist/playground/lldbManifest.js +155 -0
- package/dist/playground/lldbSession.d.ts +115 -0
- package/dist/playground/lldbSession.js +1347 -0
- package/dist/playground/loadingProgress.d.ts +16 -0
- package/dist/playground/loadingProgress.js +166 -0
- package/dist/playground/lua.d.ts +44 -0
- package/dist/playground/lua.js +630 -0
- package/dist/playground/nim.d.ts +5 -0
- package/dist/playground/nim.js +76 -0
- package/dist/playground/objectivec.d.ts +39 -0
- package/dist/playground/objectivec.js +288 -0
- package/dist/playground/ocaml.d.ts +28 -10
- package/dist/playground/ocaml.js +815 -253
- package/dist/playground/octave.d.ts +43 -0
- package/dist/playground/octave.js +783 -0
- package/dist/playground/options.d.ts +19 -40
- package/dist/playground/options.js +2 -1
- package/dist/playground/pascal.d.ts +5 -0
- package/dist/playground/pascal.js +60 -0
- package/dist/playground/perl.d.ts +5 -0
- package/dist/playground/perl.js +61 -0
- package/dist/playground/php.d.ts +44 -0
- package/dist/playground/php.js +665 -0
- package/dist/playground/prolog.d.ts +6 -0
- package/dist/playground/prolog.js +75 -0
- package/dist/playground/python.d.ts +20 -14
- package/dist/playground/python.js +445 -101
- package/dist/playground/pythonPackageLock.d.ts +6 -0
- package/dist/playground/pythonPackageLock.js +56 -0
- package/dist/playground/r.d.ts +44 -0
- package/dist/playground/r.js +637 -0
- package/dist/playground/ruby.d.ts +46 -0
- package/dist/playground/ruby.js +732 -0
- package/dist/playground/rubyAssets.d.ts +23 -0
- package/dist/playground/rubyAssets.js +68 -0
- package/dist/playground/rubyTestPreflight.d.ts +2 -0
- package/dist/playground/rubyTestPreflight.js +18 -0
- package/dist/playground/runtimeModule.d.ts +1 -0
- package/dist/playground/runtimeModule.js +5 -0
- package/dist/playground/rust.d.ts +44 -13
- package/dist/playground/rust.js +714 -76
- package/dist/playground/rustExecutableGraph.d.ts +85 -0
- package/dist/playground/rustExecutableGraph.js +946 -0
- package/dist/playground/rustWorkerLimits.d.ts +17 -0
- package/dist/playground/rustWorkerLimits.js +34 -0
- package/dist/playground/sandbox.d.ts +16 -10
- package/dist/playground/sharedBuffer.d.ts +6 -0
- package/dist/playground/sharedBuffer.js +12 -0
- package/dist/playground/sqlite.d.ts +38 -0
- package/dist/playground/sqlite.js +550 -0
- package/dist/playground/staticRuntimeModuleVersion.d.ts +1 -0
- package/dist/playground/staticRuntimeModuleVersion.js +2 -0
- package/dist/playground/staticRuntimePreflight.d.ts +13 -0
- package/dist/playground/staticRuntimePreflight.js +231 -0
- package/dist/playground/staticRuntimePreflightExecute.d.ts +8 -0
- package/dist/playground/staticRuntimePreflightExecute.js +66 -0
- package/dist/playground/staticRuntimePreflightProtocol.d.ts +68 -0
- package/dist/playground/staticRuntimePreflightProtocol.js +339 -0
- package/dist/playground/staticStdinRing.d.ts +45 -0
- package/dist/playground/staticStdinRing.js +158 -0
- package/dist/playground/staticWorkerRuntime.d.ts +154 -0
- package/dist/playground/staticWorkerRuntime.js +1917 -0
- package/dist/playground/stdinBuffer.d.ts +9 -7
- package/dist/playground/stdinBuffer.js +9 -18
- package/dist/playground/swift.d.ts +5 -0
- package/dist/playground/swift.js +17 -0
- package/dist/playground/tcl.d.ts +5 -0
- package/dist/playground/tcl.js +62 -0
- package/dist/playground/teavmConfig.d.ts +1 -1
- package/dist/playground/teavmConfig.js +2 -2
- package/dist/playground/tinygo.d.ts +48 -18
- package/dist/playground/tinygo.js +1202 -329
- package/dist/playground/tinygoExecutableGraph.d.ts +44 -0
- package/dist/playground/tinygoExecutableGraph.js +449 -0
- package/dist/playground/typescript.d.ts +55 -0
- package/dist/playground/typescript.js +924 -0
- package/dist/playground/wasm.d.ts +43 -0
- package/dist/playground/wasm.js +608 -0
- package/dist/playground/wasmAwkVersion.d.ts +59 -0
- package/dist/playground/wasmAwkVersion.js +31 -0
- package/dist/playground/wasmBashVersion.d.ts +63 -0
- package/dist/playground/wasmBashVersion.js +36 -0
- package/dist/playground/wasmBqnVersion.d.ts +24 -0
- package/dist/playground/wasmBqnVersion.js +24 -0
- package/dist/playground/wasmC3Version.d.ts +20 -0
- package/dist/playground/wasmC3Version.js +21 -0
- package/dist/playground/wasmClojureScriptVersion.d.ts +21 -0
- package/dist/playground/wasmClojureScriptVersion.js +21 -0
- package/dist/playground/wasmDIntegrity.d.ts +15 -0
- package/dist/playground/wasmDIntegrity.js +15 -0
- package/dist/playground/wasmDVersion.d.ts +1 -0
- package/dist/playground/wasmDVersion.js +1 -0
- package/dist/playground/wasmDebugVersion.d.ts +6 -0
- package/dist/playground/wasmDebugVersion.js +6 -0
- package/dist/playground/wasmDotnetVersion.d.ts +1 -0
- package/dist/playground/wasmDotnetVersion.js +1 -0
- package/dist/playground/wasmElixirVersion.d.ts +21 -1
- package/dist/playground/wasmElixirVersion.js +21 -1
- package/dist/playground/wasmForthVersion.d.ts +18 -0
- package/dist/playground/wasmForthVersion.js +18 -0
- package/dist/playground/wasmFortranExecutionAssets.d.ts +15 -0
- package/dist/playground/wasmFortranExecutionAssets.js +15 -0
- package/dist/playground/wasmFortranVersion.d.ts +1 -0
- package/dist/playground/wasmFortranVersion.js +1 -0
- package/dist/playground/wasmGleamVersion.d.ts +5 -0
- package/dist/playground/wasmGleamVersion.js +5 -0
- package/dist/playground/wasmGoVersion.d.ts +1 -1
- package/dist/playground/wasmGoVersion.js +1 -1
- package/dist/playground/wasmHaskellVersion.d.ts +1 -0
- package/dist/playground/wasmHaskellVersion.js +1 -0
- package/dist/playground/wasmJVersion.d.ts +24 -0
- package/dist/playground/wasmJVersion.js +24 -0
- package/dist/playground/wasmJanetVersion.d.ts +53 -0
- package/dist/playground/wasmJanetVersion.js +30 -0
- package/dist/playground/wasmJuliaVersion.d.ts +71 -0
- package/dist/playground/wasmJuliaVersion.js +39 -0
- package/dist/playground/wasmLfortranVersion.d.ts +28 -0
- package/dist/playground/wasmLfortranVersion.js +29 -0
- package/dist/playground/wasmLispVersion.d.ts +1 -0
- package/dist/playground/wasmLispVersion.js +1 -0
- package/dist/playground/wasmLuaVersion.d.ts +1 -0
- package/dist/playground/wasmLuaVersion.js +1 -0
- package/dist/playground/wasmNimVersion.d.ts +125 -0
- package/dist/playground/wasmNimVersion.js +66 -0
- package/dist/playground/wasmObjectiveCVersion.d.ts +27 -0
- package/dist/playground/wasmObjectiveCVersion.js +27 -0
- package/dist/playground/wasmOcamlVersion.d.ts +12 -1
- package/dist/playground/wasmOcamlVersion.js +12 -1
- package/dist/playground/wasmOctaveVersion.d.ts +1 -0
- package/dist/playground/wasmOctaveVersion.js +1 -0
- package/dist/playground/wasmPascalVersion.d.ts +61 -0
- package/dist/playground/wasmPascalVersion.js +34 -0
- package/dist/playground/wasmPerlVersion.d.ts +71 -0
- package/dist/playground/wasmPerlVersion.js +39 -0
- package/dist/playground/wasmPrologVersion.d.ts +31 -0
- package/dist/playground/wasmPrologVersion.js +31 -0
- package/dist/playground/wasmRVersion.d.ts +1 -0
- package/dist/playground/wasmRVersion.js +1 -0
- package/dist/playground/wasmRustVersion.d.ts +1306 -1
- package/dist/playground/wasmRustVersion.js +1458 -1
- package/dist/playground/wasmSwiftVersion.d.ts +1 -0
- package/dist/playground/wasmSwiftVersion.js +1 -0
- package/dist/playground/wasmTclVersion.d.ts +85 -0
- package/dist/playground/wasmTclVersion.js +46 -0
- package/dist/playground/wasmTinyGoVersion.d.ts +98 -1
- package/dist/playground/wasmTinyGoVersion.js +107 -1
- package/dist/playground/wasmTypeScriptVersion.d.ts +5 -0
- package/dist/playground/wasmTypeScriptVersion.js +5 -0
- package/dist/playground/wasmWatVersion.d.ts +1 -0
- package/dist/playground/wasmWatVersion.js +1 -0
- package/dist/playground/wasmZigVersion.d.ts +13 -0
- package/dist/playground/wasmZigVersion.js +13 -0
- package/dist/playground/wat.d.ts +44 -0
- package/dist/playground/wat.js +622 -0
- package/dist/playground/worker/assemblyscript.js +339 -0
- package/dist/playground/worker/assets.d.ts +7 -0
- package/dist/playground/worker/assets.js +288 -39
- package/dist/playground/worker/bash.js +338 -0
- package/dist/playground/worker/bashNestedBootstrap.d.ts +6 -0
- package/dist/playground/worker/bashNestedBootstrap.js +59 -0
- package/dist/playground/worker/bashRuntime.d.ts +89 -0
- package/dist/playground/worker/bashRuntime.js +982 -0
- package/dist/playground/worker/clang.js +92 -13
- package/dist/playground/worker/cobol.js +107 -0
- package/dist/playground/worker/d.js +199 -0
- package/dist/playground/worker/dotnet.js +141 -0
- package/dist/playground/worker/duckdb.d.ts +1 -0
- package/dist/playground/worker/duckdb.js +136 -0
- package/dist/playground/worker/elixir.js +307 -41
- package/dist/playground/worker/fortran.d.ts +1 -0
- package/dist/playground/worker/fortran.js +295 -0
- package/dist/playground/worker/go.js +246 -40
- package/dist/playground/worker/haskell.d.ts +7 -0
- package/dist/playground/worker/haskell.js +465 -0
- package/dist/playground/worker/java.js +59 -20
- package/dist/playground/worker/lisp.d.ts +1 -0
- package/dist/playground/worker/lisp.js +195 -0
- package/dist/playground/worker/lua.d.ts +1 -0
- package/dist/playground/worker/lua.js +163 -0
- package/dist/playground/worker/objectivec.d.ts +1 -0
- package/dist/playground/worker/objectivec.js +10 -0
- package/dist/playground/worker/ocaml.js +206 -58
- package/dist/playground/worker/php.d.ts +1 -0
- package/dist/playground/worker/php.js +261 -0
- package/dist/playground/worker/python.js +201 -44
- package/dist/playground/worker/r.d.ts +1 -0
- package/dist/playground/worker/r.js +192 -0
- package/dist/playground/worker/ruby.d.ts +1 -0
- package/dist/playground/worker/ruby.js +248 -0
- package/dist/playground/worker/runtimeAssetFetch.d.ts +15 -0
- package/dist/playground/worker/runtimeAssetFetch.js +375 -0
- package/dist/playground/worker/rust.js +546 -20
- package/dist/playground/worker/sqlite.d.ts +1 -0
- package/dist/playground/worker/sqlite.js +112 -0
- package/dist/playground/worker/staticRuntimePreflight.d.ts +1 -0
- package/dist/playground/worker/staticRuntimePreflight.js +56 -0
- package/dist/playground/worker/tinygo.js +34 -9
- package/dist/playground/worker/typescript.d.ts +1 -0
- package/dist/playground/worker/typescript.js +251 -0
- package/dist/playground/worker/wasm.d.ts +1 -0
- package/dist/playground/worker/wasm.js +273 -0
- package/dist/playground/worker/wat.d.ts +1 -0
- package/dist/playground/worker/wat.js +188 -0
- package/dist/playground/worker/zig.d.ts +8 -0
- package/dist/playground/worker/zig.js +578 -0
- package/dist/playground/workerProgress.d.ts +15 -0
- package/dist/playground/workerProgress.js +72 -0
- package/dist/playground/workerSession.d.ts +28 -0
- package/dist/playground/workerSession.js +164 -0
- package/dist/playground/zig.d.ts +46 -0
- package/dist/playground/zig.js +690 -0
- package/dist/playground/zigAssets.d.ts +6 -0
- package/dist/playground/zigAssets.js +49 -0
- package/package.json +234 -105
- package/dist/clang/app.d.ts +0 -75
- package/dist/clang/app.js +0 -744
- package/dist/clang/apply.d.ts +0 -2
- package/dist/clang/apply.js +0 -11
- package/dist/clang/color.d.ts +0 -3
- package/dist/clang/color.js +0 -3
- package/dist/clang/encode.d.ts +0 -4
- package/dist/clang/encode.js +0 -20
- package/dist/clang/error.d.ts +0 -14
- package/dist/clang/error.js +0 -27
- package/dist/clang/gccCompat.d.ts +0 -15
- package/dist/clang/gccCompat.js +0 -767
- package/dist/clang/index.d.ts +0 -85
- package/dist/clang/index.js +0 -1077
- package/dist/clang/memory/index.d.ts +0 -4
- package/dist/clang/memory/index.js +0 -4
- package/dist/clang/memory/memFs.d.ts +0 -35
- package/dist/clang/memory/memFs.js +0 -132
- package/dist/clang/memory/memory.d.ts +0 -22
- package/dist/clang/memory/memory.js +0 -73
- package/dist/clang/memory/tar.d.ts +0 -2
- package/dist/clang/memory/tar.js +0 -59
- package/dist/clang/url.d.ts +0 -4
- package/dist/clang/url.js +0 -5
- package/dist/clang/wasm.d.ts +0 -4
- package/dist/clang/wasm.js +0 -50
- package/dist/clangd/config.d.ts +0 -18
- package/dist/clangd/config.js +0 -14
- package/dist/clangd/jsonStream.d.ts +0 -9
- package/dist/clangd/jsonStream.js +0 -48
- package/dist/clangd/session.d.ts +0 -18
- package/dist/clangd/session.js +0 -112
- package/dist/clangd/worker.js +0 -131
- package/dist/debug/controller.svelte.d.ts +0 -43
- package/dist/debug/controller.svelte.js +0 -268
- package/dist/debug/editor/index.d.ts +0 -2
- package/dist/debug/editor/index.js +0 -1
- package/dist/debug/editor/monaco.d.ts +0 -26
- package/dist/debug/editor/monaco.js +0 -128
- package/dist/debug/expression.d.ts +0 -26
- package/dist/debug/expression.js +0 -547
- package/dist/debug/index.d.ts +0 -8
- package/dist/debug/index.js +0 -5
- package/dist/debug/language/cpp.d.ts +0 -2
- package/dist/debug/language/cpp.js +0 -7
- package/dist/debug/language/index.d.ts +0 -3
- package/dist/debug/language/index.js +0 -2
- package/dist/debug/language/python.d.ts +0 -2
- package/dist/debug/language/python.js +0 -14
- package/dist/debug/language/types.d.ts +0 -6
- package/dist/debug/locals.d.ts +0 -2
- package/dist/debug/locals.js +0 -8
- package/dist/lsp/cpp/server.d.ts +0 -2
- package/dist/lsp/cpp/server.js +0 -68
- package/dist/lsp/index.d.ts +0 -5
- package/dist/lsp/index.js +0 -4
- package/dist/lsp/python/main.worker.js +0 -92
- package/dist/lsp/python/package/arcturus_python_lsp/__init__.py +0 -3
- package/dist/lsp/python/package/arcturus_python_lsp/server.py +0 -462
- package/dist/lsp/python/server.d.ts +0 -2
- package/dist/lsp/python/server.js +0 -54
- package/dist/lsp/registry.d.ts +0 -2
- package/dist/lsp/registry.js +0 -12
- package/dist/lsp/runtime.d.ts +0 -5
- package/dist/lsp/runtime.js +0 -31
- package/dist/lsp/types.d.ts +0 -17
- package/dist/terminal/Terminal.svelte +0 -422
- package/dist/terminal/Terminal.svelte.d.ts +0 -26
- package/dist/terminal/index.d.ts +0 -7
- package/dist/terminal/index.js +0 -5
- package/dist/terminal/plugin/index.d.ts +0 -9
- package/dist/terminal/plugin/index.js +0 -19
- package/dist/terminal/theme.d.ts +0 -49
- package/dist/terminal/theme.js +0 -49
- package/dist/terminal/types.d.ts +0 -18
- package/dist/utils/vscodeJsonrpcBrowser.d.ts +0 -5
- package/dist/utils/vscodeJsonrpcBrowser.js +0 -4
- /package/dist/{clangd/worker.d.ts → playground/worker/assemblyscript.d.ts} +0 -0
- /package/dist/{debug/language/types.js → playground/worker/bash.d.ts} +0 -0
- /package/dist/{lsp/python/main.worker.d.ts → playground/worker/cobol.d.ts} +0 -0
- /package/dist/{lsp/types.js → playground/worker/d.d.ts} +0 -0
- /package/dist/{terminal/types.js → playground/worker/dotnet.d.ts} +0 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import { WASI } from '@bjorn3/browser_wasi_shim';
|
|
2
|
+
import { waitForBufferedStdin } from '../stdinBuffer';
|
|
3
|
+
import { snapshotFortranExecutionAssetReceipts } from '../fortranAssets';
|
|
4
|
+
import { configureWorkerRuntimeAssets, handleWorkerAssetMessage } from './assets';
|
|
5
|
+
import { fetchRuntimeAssetBytes, resolveRuntimeAssetUrl } from './runtimeAssetFetch';
|
|
6
|
+
import { BrowserClangRuntime, createBrowserWasiHost, executeBrowserClangArtifact, loadRuntimeManifest, resolveRuntimeManifestUrl } from '@wasm-idle/llvm-core/clang';
|
|
7
|
+
import { verifyRuntimeAssetIntegrity } from '@wasm-idle/core';
|
|
8
|
+
self.document = {
|
|
9
|
+
querySelectorAll() {
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
const textDecoder = new TextDecoder('utf-8', { fatal: true });
|
|
14
|
+
const F2C_COMPAT_SOURCE = `#include <stdarg.h>
|
|
15
|
+
#include <stdio.h>
|
|
16
|
+
|
|
17
|
+
typedef void (*sighandler_t)(int);
|
|
18
|
+
|
|
19
|
+
int fiprintf(FILE *stream, const char *format, ...) {
|
|
20
|
+
va_list ap;
|
|
21
|
+
va_start(ap, format);
|
|
22
|
+
int result = vfprintf(stream, format, ap);
|
|
23
|
+
va_end(ap);
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
int siprintf(char *str, const char *format, ...) {
|
|
28
|
+
va_list ap;
|
|
29
|
+
va_start(ap, format);
|
|
30
|
+
int result = vsprintf(str, format, ap);
|
|
31
|
+
va_end(ap);
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
int __small_sprintf(char *str, const char *format, ...) {
|
|
36
|
+
va_list ap;
|
|
37
|
+
va_start(ap, format);
|
|
38
|
+
int result = vsprintf(str, format, ap);
|
|
39
|
+
va_end(ap);
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
sighandler_t signal(int signum, sighandler_t handler) {
|
|
44
|
+
(void)signum;
|
|
45
|
+
return handler;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
FILE *tmpfile(void) {
|
|
49
|
+
return NULL;
|
|
50
|
+
}
|
|
51
|
+
`;
|
|
52
|
+
let stdinBufferFortran = null;
|
|
53
|
+
let clang = null;
|
|
54
|
+
let f2cModule = null;
|
|
55
|
+
let hasInitialStdinFortran = false;
|
|
56
|
+
let initialStdinFortran = null;
|
|
57
|
+
let initialStdinConsumedFortran = false;
|
|
58
|
+
const normalizeWorkspacePath = (value) => value
|
|
59
|
+
.replaceAll('\\', '/')
|
|
60
|
+
.split('/')
|
|
61
|
+
.filter((part) => part && part !== '.' && part !== '..')
|
|
62
|
+
.join('/');
|
|
63
|
+
const basename = (value) => value.split('/').pop() || value;
|
|
64
|
+
const stemOf = (value) => basename(value).replace(/\.[^.]+$/, '') || 'main';
|
|
65
|
+
const ensureTrailingNewline = (source) => (source.endsWith('\n') ? source : `${source}\n`);
|
|
66
|
+
const resolveInputPath = (activePath) => {
|
|
67
|
+
const normalized = normalizeWorkspacePath(activePath || '');
|
|
68
|
+
if (!normalized)
|
|
69
|
+
return 'main.f';
|
|
70
|
+
return /\.[A-Za-z0-9_-]+$/.test(normalized) ? normalized : `${normalized}.f`;
|
|
71
|
+
};
|
|
72
|
+
async function fetchVerifiedBytes(url, asset, receipt) {
|
|
73
|
+
const bytes = await fetchRuntimeAssetBytes({
|
|
74
|
+
url,
|
|
75
|
+
label: asset,
|
|
76
|
+
maxAssetBytes: receipt.bytes
|
|
77
|
+
});
|
|
78
|
+
await verifyRuntimeAssetIntegrity({
|
|
79
|
+
asset,
|
|
80
|
+
bytes,
|
|
81
|
+
expected: receipt,
|
|
82
|
+
runtimeId: 'FORTRAN'
|
|
83
|
+
});
|
|
84
|
+
return bytes;
|
|
85
|
+
}
|
|
86
|
+
async function fetchVerifiedText(url, asset, receipt) {
|
|
87
|
+
return textDecoder.decode(await fetchVerifiedBytes(url, asset, receipt));
|
|
88
|
+
}
|
|
89
|
+
async function loadFortranRuntime(clangAssets, fortranAssets, log) {
|
|
90
|
+
const receipts = snapshotFortranExecutionAssetReceipts(fortranAssets.integrity);
|
|
91
|
+
if (!Number.isSafeInteger(fortranAssets.maxAssetBytes) || fortranAssets.maxAssetBytes <= 0) {
|
|
92
|
+
throw new TypeError('Fortran maxAssetBytes must be a positive safe integer');
|
|
93
|
+
}
|
|
94
|
+
for (const [asset, url] of [
|
|
95
|
+
['f2c.wasm', fortranAssets.f2cWasmUrl],
|
|
96
|
+
['libf2c.a', fortranAssets.libf2cUrl],
|
|
97
|
+
['f2c.h', fortranAssets.f2cHeaderUrl]
|
|
98
|
+
]) {
|
|
99
|
+
resolveRuntimeAssetUrl(url, asset);
|
|
100
|
+
if (receipts[asset].bytes > fortranAssets.maxAssetBytes) {
|
|
101
|
+
throw new Error(`Fortran execution asset ${asset} exceeds the ${fortranAssets.maxAssetBytes} byte limit`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const f2cWasmBytes = await fetchVerifiedBytes(fortranAssets.f2cWasmUrl, 'f2c.wasm', receipts['f2c.wasm']);
|
|
105
|
+
const libf2cBytes = await fetchVerifiedBytes(fortranAssets.libf2cUrl, 'libf2c.a', receipts['libf2c.a']);
|
|
106
|
+
const f2cHeader = await fetchVerifiedText(fortranAssets.f2cHeaderUrl, 'f2c.h', receipts['f2c.h']);
|
|
107
|
+
const nextF2cModule = await WebAssembly.compile(f2cWasmBytes);
|
|
108
|
+
configureWorkerRuntimeAssets(clangAssets || null);
|
|
109
|
+
const clangBaseUrl = clangAssets?.baseUrl || '';
|
|
110
|
+
const manifest = await loadRuntimeManifest(resolveRuntimeManifestUrl(clangBaseUrl), fetch, undefined, fortranAssets.maxAssetBytes);
|
|
111
|
+
const nextClang = new BrowserClangRuntime({
|
|
112
|
+
stdout: (output) => postMessage({ output }),
|
|
113
|
+
stdin: () => '',
|
|
114
|
+
progress: (value) => postMessage({ progress: value }),
|
|
115
|
+
log,
|
|
116
|
+
maxAssetBytes: fortranAssets.maxAssetBytes,
|
|
117
|
+
runtimeBaseUrl: clangBaseUrl,
|
|
118
|
+
manifest
|
|
119
|
+
});
|
|
120
|
+
await nextClang.ready;
|
|
121
|
+
nextClang.memfs.addFile('f2c.h', f2cHeader);
|
|
122
|
+
nextClang.memfs.addFile('libf2c.a', libf2cBytes);
|
|
123
|
+
clang = nextClang;
|
|
124
|
+
f2cModule = nextF2cModule;
|
|
125
|
+
}
|
|
126
|
+
function readProgramStdin() {
|
|
127
|
+
if (hasInitialStdinFortran) {
|
|
128
|
+
if (initialStdinConsumedFortran)
|
|
129
|
+
return null;
|
|
130
|
+
initialStdinConsumedFortran = true;
|
|
131
|
+
return initialStdinFortran ?? '';
|
|
132
|
+
}
|
|
133
|
+
return waitForBufferedStdin(stdinBufferFortran, () => postMessage({ buffer: true }));
|
|
134
|
+
}
|
|
135
|
+
function workspaceFilesForF2c(code, inputPath, workspaceFiles = []) {
|
|
136
|
+
const fileMap = new Map();
|
|
137
|
+
for (const file of workspaceFiles) {
|
|
138
|
+
const safePath = normalizeWorkspacePath(file.path);
|
|
139
|
+
if (safePath)
|
|
140
|
+
fileMap.set(safePath, file.content);
|
|
141
|
+
}
|
|
142
|
+
fileMap.set(inputPath, ensureTrailingNewline(code));
|
|
143
|
+
return Array.from(fileMap, ([path, contents]) => ({ path, contents }));
|
|
144
|
+
}
|
|
145
|
+
function readHostFileBytes(host, path) {
|
|
146
|
+
const segments = normalizeWorkspacePath(path).split('/').filter(Boolean);
|
|
147
|
+
let node = host.rootDirectory;
|
|
148
|
+
for (const segment of segments) {
|
|
149
|
+
node = node?.contents?.get(segment);
|
|
150
|
+
if (!node)
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
const data = node?.data;
|
|
154
|
+
if (data instanceof Uint8Array)
|
|
155
|
+
return new Uint8Array(data);
|
|
156
|
+
if (data instanceof ArrayBuffer)
|
|
157
|
+
return new Uint8Array(data);
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
function findFirstGeneratedCFile(directory, prefix = '') {
|
|
161
|
+
for (const [name, node] of directory.contents || []) {
|
|
162
|
+
const nextPath = prefix ? `${prefix}/${name}` : name;
|
|
163
|
+
if (node?.contents) {
|
|
164
|
+
const nested = findFirstGeneratedCFile(node, nextPath);
|
|
165
|
+
if (nested)
|
|
166
|
+
return nested;
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
if (nextPath.endsWith('.c') && node?.data instanceof Uint8Array) {
|
|
170
|
+
return new Uint8Array(node.data);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
async function translateFortranToC(code, activePath, workspaceFiles) {
|
|
176
|
+
if (!f2cModule)
|
|
177
|
+
throw new Error('Fortran runtime is not loaded.');
|
|
178
|
+
const inputPath = resolveInputPath(activePath);
|
|
179
|
+
const outputPath = `${stemOf(inputPath)}.c`;
|
|
180
|
+
const stdoutChunks = [];
|
|
181
|
+
const stderrChunks = [];
|
|
182
|
+
const host = createBrowserWasiHost({
|
|
183
|
+
args: [inputPath],
|
|
184
|
+
env: { TMPDIR: '/tmp' },
|
|
185
|
+
files: workspaceFilesForF2c(code, inputPath, workspaceFiles),
|
|
186
|
+
programName: 'f2c.wasm',
|
|
187
|
+
stdout: (chunk) => stdoutChunks.push(chunk),
|
|
188
|
+
stderr: (chunk) => stderrChunks.push(chunk)
|
|
189
|
+
});
|
|
190
|
+
const wasiInstance = new WASI(host.args, host.envEntries, host.fds, { debug: false });
|
|
191
|
+
const instance = (await WebAssembly.instantiate(f2cModule, {
|
|
192
|
+
wasi_snapshot_preview1: wasiInstance.wasiImport,
|
|
193
|
+
wasi_unstable: wasiInstance.wasiImport
|
|
194
|
+
}));
|
|
195
|
+
const exitCode = wasiInstance.start(instance);
|
|
196
|
+
const stdout = stdoutChunks.join('');
|
|
197
|
+
const stderr = stderrChunks.join('');
|
|
198
|
+
if (exitCode) {
|
|
199
|
+
throw new Error(`f2c exited with ${exitCode}${stderr ? `\n${stderr}` : ''}`);
|
|
200
|
+
}
|
|
201
|
+
const generated = readHostFileBytes(host, outputPath) || findFirstGeneratedCFile(host.rootDirectory);
|
|
202
|
+
if (!generated) {
|
|
203
|
+
throw new Error(`f2c did not produce ${outputPath}${stderr || stdout ? `\n${stderr}${stdout}` : ''}`);
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
cPath: outputPath,
|
|
207
|
+
cSource: textDecoder.decode(generated)
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
async function compileAndLinkFortran(cPath, cSource, compileArgs = []) {
|
|
211
|
+
if (!clang)
|
|
212
|
+
throw new Error('Fortran clang backend is not loaded.');
|
|
213
|
+
const mainObj = `${stemOf(cPath)}.o`;
|
|
214
|
+
const compatObj = 'f2c_compat.o';
|
|
215
|
+
const wasmPath = `${stemOf(cPath)}.wasm`;
|
|
216
|
+
await clang.compile({
|
|
217
|
+
input: cPath,
|
|
218
|
+
code: cSource,
|
|
219
|
+
obj: mainObj,
|
|
220
|
+
language: 'C',
|
|
221
|
+
compileArgs: ['-I.', '-w', ...compileArgs]
|
|
222
|
+
});
|
|
223
|
+
await clang.compile({
|
|
224
|
+
input: 'f2c_compat.c',
|
|
225
|
+
code: F2C_COMPAT_SOURCE,
|
|
226
|
+
obj: compatObj,
|
|
227
|
+
language: 'C',
|
|
228
|
+
compileArgs: ['-w']
|
|
229
|
+
});
|
|
230
|
+
const stackSize = 1024 * 1024;
|
|
231
|
+
const libdir = 'lib/wasm32-wasi';
|
|
232
|
+
const compilerRuntimeLibDir = clang.compilerConfig?.compilerRuntimeLibDir || 'lib/clang/8.0.1/lib/wasi';
|
|
233
|
+
const lld = await clang.getModule(clang.assetUrls.lld);
|
|
234
|
+
await clang.run(lld, clang.log, 'wasm-ld', '--export-dynamic', '-z', `stack-size=${stackSize}`, `-L${libdir}/noeh`, `-L${libdir}`, `${libdir}/crt1.o`, mainObj, compatObj, 'libf2c.a', '-lc', '-lm', `-L${compilerRuntimeLibDir}`, '-lclang_rt.builtins-wasm32', '-o', wasmPath);
|
|
235
|
+
const bytes = Uint8Array.from(clang.memfs.getFileContents(wasmPath));
|
|
236
|
+
const wasm = await WebAssembly.compile(bytes);
|
|
237
|
+
return {
|
|
238
|
+
bytes,
|
|
239
|
+
wasm,
|
|
240
|
+
target: 'wasm32-wasi',
|
|
241
|
+
format: 'wasi-core-wasm',
|
|
242
|
+
fileName: wasmPath,
|
|
243
|
+
language: 'C'
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
self.onmessage = async (event) => {
|
|
247
|
+
if (handleWorkerAssetMessage(event.data))
|
|
248
|
+
return;
|
|
249
|
+
const { code, buffer, load, log, prepare, compileArgs, programArgs, activePath, workspaceFiles, stdin, clangAssets, fortranAssets } = event.data;
|
|
250
|
+
if (load) {
|
|
251
|
+
try {
|
|
252
|
+
await loadFortranRuntime(clangAssets, fortranAssets, log);
|
|
253
|
+
postMessage({ load: true });
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
postMessage({ error: error.message });
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
else if (typeof log === 'boolean' && !code) {
|
|
260
|
+
if (clang)
|
|
261
|
+
clang.log = log;
|
|
262
|
+
if (typeof code === 'string')
|
|
263
|
+
postMessage({ results: true });
|
|
264
|
+
}
|
|
265
|
+
else if (code) {
|
|
266
|
+
if (!clang) {
|
|
267
|
+
postMessage({ error: 'Fortran runtime is not loaded.' });
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
clang.log = log;
|
|
271
|
+
stdinBufferFortran = new Int32Array(buffer);
|
|
272
|
+
hasInitialStdinFortran = typeof stdin === 'string';
|
|
273
|
+
initialStdinFortran = hasInitialStdinFortran ? stdin : null;
|
|
274
|
+
initialStdinConsumedFortran = false;
|
|
275
|
+
try {
|
|
276
|
+
const translated = await translateFortranToC(code, activePath, workspaceFiles || []);
|
|
277
|
+
const artifact = await compileAndLinkFortran(translated.cPath, translated.cSource, compileArgs || []);
|
|
278
|
+
if (!prepare) {
|
|
279
|
+
const result = await executeBrowserClangArtifact(artifact, {
|
|
280
|
+
args: programArgs || [],
|
|
281
|
+
stdin: readProgramStdin,
|
|
282
|
+
stdout: (output) => postMessage({ output }),
|
|
283
|
+
stderr: (output) => postMessage({ output })
|
|
284
|
+
});
|
|
285
|
+
if (result.exitCode) {
|
|
286
|
+
throw new Error(`Fortran program exited with ${result.exitCode}`);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
postMessage({ results: true });
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
postMessage({ error: error.message });
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
};
|
|
@@ -1,23 +1,36 @@
|
|
|
1
1
|
import { waitForBufferedStdin } from '../stdinBuffer';
|
|
2
|
+
import { isSharedBufferBackedView } from '../sharedBuffer';
|
|
3
|
+
import { instrumentGoDebugSource } from '../goDebugInstrumentation';
|
|
2
4
|
self.document = {
|
|
3
5
|
querySelectorAll() {
|
|
4
6
|
return [];
|
|
5
7
|
}
|
|
6
8
|
};
|
|
7
9
|
let stdinBufferGo = null;
|
|
10
|
+
let debugBufferGo = null;
|
|
8
11
|
let compilerUrl = '';
|
|
9
|
-
let
|
|
12
|
+
let manifestUrl = '';
|
|
13
|
+
let loadedCompilerKey = '';
|
|
14
|
+
let compilerLimits;
|
|
10
15
|
let compilerPromise = null;
|
|
11
16
|
let compiledArtifact = null;
|
|
12
17
|
let compiledCacheKey = '';
|
|
13
|
-
async function loadCompiler(url) {
|
|
18
|
+
async function loadCompiler(url, runtimeManifestUrl, limits) {
|
|
14
19
|
if (!url) {
|
|
15
20
|
throw new Error('Go runtime is not configured. Set PUBLIC_WASM_GO_COMPILER_URL or runtimeAssets.go.compilerUrl.');
|
|
16
21
|
}
|
|
17
|
-
|
|
22
|
+
const compilerKey = [
|
|
23
|
+
url,
|
|
24
|
+
runtimeManifestUrl,
|
|
25
|
+
limits?.assetTimeoutMs ?? '',
|
|
26
|
+
limits?.compileTimeoutMs ?? '',
|
|
27
|
+
limits?.maxAssetBytes ?? '',
|
|
28
|
+
limits?.maxWasmMemoryBytes ?? ''
|
|
29
|
+
].join('\n');
|
|
30
|
+
if (loadedCompilerKey === compilerKey && compilerPromise) {
|
|
18
31
|
return await compilerPromise;
|
|
19
32
|
}
|
|
20
|
-
|
|
33
|
+
loadedCompilerKey = compilerKey;
|
|
21
34
|
compiledArtifact = null;
|
|
22
35
|
compiledCacheKey = '';
|
|
23
36
|
compilerPromise = (async () => {
|
|
@@ -34,7 +47,14 @@ async function loadCompiler(url) {
|
|
|
34
47
|
throw new Error('wasm-go module must export executeBrowserGoArtifact');
|
|
35
48
|
}
|
|
36
49
|
return {
|
|
37
|
-
compiler: await factory(
|
|
50
|
+
compiler: await factory({
|
|
51
|
+
...(runtimeManifestUrl ? { runtimeManifestUrl } : {}),
|
|
52
|
+
assetTimeoutMs: limits?.assetTimeoutMs,
|
|
53
|
+
compileTimeoutMs: limits?.compileTimeoutMs,
|
|
54
|
+
linkTimeoutMs: limits?.compileTimeoutMs,
|
|
55
|
+
maxAssetBytes: limits?.maxAssetBytes,
|
|
56
|
+
maxWasmMemoryBytes: limits?.maxWasmMemoryBytes
|
|
57
|
+
}),
|
|
38
58
|
executeBrowserGoArtifact: module.executeBrowserGoArtifact
|
|
39
59
|
};
|
|
40
60
|
})();
|
|
@@ -53,30 +73,180 @@ function normalizeDiagnostic(diagnostic) {
|
|
|
53
73
|
message: String(diagnostic?.message || '')
|
|
54
74
|
};
|
|
55
75
|
}
|
|
76
|
+
function normalizedBreakpointSet(values) {
|
|
77
|
+
return new Set([...(Array.isArray(values) ? values : [])]
|
|
78
|
+
.map((value) => Number(value))
|
|
79
|
+
.filter((value) => Number.isInteger(value) && value > 0));
|
|
80
|
+
}
|
|
81
|
+
function refreshGoDebugBreakpoints(state, control) {
|
|
82
|
+
const version = Atomics.load(control, 2);
|
|
83
|
+
if (state.breakpointVersion === version)
|
|
84
|
+
return;
|
|
85
|
+
state.breakpointVersion = version;
|
|
86
|
+
const count = Math.max(0, Math.min(Atomics.load(control, 3), control.length - 4));
|
|
87
|
+
const next = new Set();
|
|
88
|
+
for (let index = 0; index < count; index += 1) {
|
|
89
|
+
const line = Atomics.load(control, 4 + index);
|
|
90
|
+
if (Number.isInteger(line) && line > 0)
|
|
91
|
+
next.add(line);
|
|
92
|
+
}
|
|
93
|
+
state.breakpoints = next;
|
|
94
|
+
}
|
|
95
|
+
function parseGoDebugStack(stackJson, fallbackLine) {
|
|
96
|
+
try {
|
|
97
|
+
const stack = JSON.parse(stackJson);
|
|
98
|
+
if (Array.isArray(stack)) {
|
|
99
|
+
return stack
|
|
100
|
+
.map((frame) => ({
|
|
101
|
+
functionName: String(frame?.functionName || 'main'),
|
|
102
|
+
line: Math.max(1, Number(frame?.line || fallbackLine))
|
|
103
|
+
}))
|
|
104
|
+
.filter((frame) => frame.line > 0);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// Keep running even if user code corrupts the hook argument.
|
|
109
|
+
}
|
|
110
|
+
return [{ functionName: 'main', line: fallbackLine }];
|
|
111
|
+
}
|
|
112
|
+
function waitForGoDebugCommand(state, control, depth, line) {
|
|
113
|
+
let sequence = Atomics.load(control, 0);
|
|
114
|
+
while (true) {
|
|
115
|
+
Atomics.wait(control, 0, sequence, 100);
|
|
116
|
+
const command = Atomics.exchange(control, 1, 0);
|
|
117
|
+
if (!command) {
|
|
118
|
+
sequence = Atomics.load(control, 0);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
state.resumeSkip = `${depth}:${line}`;
|
|
122
|
+
state.stepMode = null;
|
|
123
|
+
state.nextDepth = null;
|
|
124
|
+
state.nextLine = null;
|
|
125
|
+
state.stepOutDepth = null;
|
|
126
|
+
if (command === 2) {
|
|
127
|
+
state.stepMode = 'step';
|
|
128
|
+
}
|
|
129
|
+
else if (command === 3) {
|
|
130
|
+
state.stepMode = 'next';
|
|
131
|
+
state.nextDepth = depth;
|
|
132
|
+
state.nextLine = line;
|
|
133
|
+
}
|
|
134
|
+
else if (command === 4) {
|
|
135
|
+
state.stepMode = 'out';
|
|
136
|
+
state.stepOutDepth = Math.max(0, depth - 1);
|
|
137
|
+
}
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function createGoDebugHost(options) {
|
|
142
|
+
const state = {
|
|
143
|
+
breakpointVersion: Atomics.load(options.control, 2),
|
|
144
|
+
breakpoints: normalizedBreakpointSet(options.breakpoints),
|
|
145
|
+
pauseOnEntry: options.pauseOnEntry,
|
|
146
|
+
stepMode: null,
|
|
147
|
+
resumeSkip: null,
|
|
148
|
+
nextDepth: null,
|
|
149
|
+
nextLine: null,
|
|
150
|
+
stepOutDepth: null
|
|
151
|
+
};
|
|
152
|
+
const previousHook = globalThis.__wasmIdleGoDebugLine;
|
|
153
|
+
globalThis.__wasmIdleGoDebugLine = (rawLine, rawStackJson) => {
|
|
154
|
+
const line = Math.max(1, Number(rawLine || 1));
|
|
155
|
+
refreshGoDebugBreakpoints(state, options.control);
|
|
156
|
+
const callStack = parseGoDebugStack(String(rawStackJson || '[]'), line);
|
|
157
|
+
const depth = Math.max(1, callStack.length);
|
|
158
|
+
const skipKey = `${depth}:${line}`;
|
|
159
|
+
if (state.resumeSkip === skipKey)
|
|
160
|
+
return;
|
|
161
|
+
if (state.resumeSkip)
|
|
162
|
+
state.resumeSkip = null;
|
|
163
|
+
let reason = null;
|
|
164
|
+
if (state.pauseOnEntry) {
|
|
165
|
+
reason = 'entry';
|
|
166
|
+
}
|
|
167
|
+
else if (state.breakpoints.has(line)) {
|
|
168
|
+
reason = 'breakpoint';
|
|
169
|
+
}
|
|
170
|
+
else if (state.stepMode === 'step') {
|
|
171
|
+
reason = 'step';
|
|
172
|
+
}
|
|
173
|
+
else if (state.stepMode === 'next' &&
|
|
174
|
+
state.nextDepth !== null &&
|
|
175
|
+
depth <= state.nextDepth &&
|
|
176
|
+
line !== state.nextLine) {
|
|
177
|
+
reason = 'nextLine';
|
|
178
|
+
}
|
|
179
|
+
else if (state.stepMode === 'out' &&
|
|
180
|
+
state.stepOutDepth !== null &&
|
|
181
|
+
depth <= state.stepOutDepth) {
|
|
182
|
+
reason = 'stepOut';
|
|
183
|
+
}
|
|
184
|
+
if (!reason)
|
|
185
|
+
return;
|
|
186
|
+
state.pauseOnEntry = false;
|
|
187
|
+
state.stepMode = null;
|
|
188
|
+
state.nextDepth = null;
|
|
189
|
+
state.nextLine = null;
|
|
190
|
+
state.stepOutDepth = null;
|
|
191
|
+
postMessage({
|
|
192
|
+
debugEvent: {
|
|
193
|
+
type: 'pause',
|
|
194
|
+
line,
|
|
195
|
+
reason,
|
|
196
|
+
locals: [],
|
|
197
|
+
callStack
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
waitForGoDebugCommand(state, options.control, depth, line);
|
|
201
|
+
};
|
|
202
|
+
return () => {
|
|
203
|
+
if (previousHook === undefined) {
|
|
204
|
+
delete globalThis.__wasmIdleGoDebugLine;
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
globalThis.__wasmIdleGoDebugLine = previousHook;
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
}
|
|
56
211
|
self.onmessage = async (event) => {
|
|
57
|
-
const { load, compilerUrl: nextCompilerUrl, buffer, code, prepare, args = [], target = 'wasip1/wasm', log } = event.data;
|
|
212
|
+
const { load, compilerUrl: nextCompilerUrl, manifestUrl: nextManifestUrl, runtimeLimits, buffer, debugBuffer, code, prepare, args = [], stdin, target = 'wasip1/wasm', log, debug = false, breakpoints = [], pauseOnEntry = false } = event.data;
|
|
58
213
|
try {
|
|
59
214
|
if (load) {
|
|
60
215
|
compilerUrl = nextCompilerUrl;
|
|
216
|
+
manifestUrl = nextManifestUrl;
|
|
217
|
+
compilerLimits = runtimeLimits;
|
|
61
218
|
if (log) {
|
|
62
219
|
console.log(`[wasm-idle:go-worker] load compilerUrl=${compilerUrl}`);
|
|
63
220
|
}
|
|
64
|
-
await loadCompiler(compilerUrl);
|
|
221
|
+
await loadCompiler(compilerUrl, manifestUrl, compilerLimits);
|
|
65
222
|
postMessage({ load: true });
|
|
66
223
|
return;
|
|
67
224
|
}
|
|
68
225
|
stdinBufferGo = new Int32Array(buffer);
|
|
69
|
-
|
|
70
|
-
|
|
226
|
+
debugBufferGo = debugBuffer ? new Int32Array(debugBuffer) : null;
|
|
227
|
+
if (debug && (!debugBufferGo || !isSharedBufferBackedView(debugBufferGo))) {
|
|
228
|
+
postMessage({ error: 'Go debugging requires SharedArrayBuffer.' });
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
const runtime = await loadCompiler(compilerUrl, manifestUrl, compilerLimits);
|
|
232
|
+
const effectiveTarget = debug ? 'js/wasm' : target;
|
|
233
|
+
const compileCode = debug ? instrumentGoDebugSource(code) : code;
|
|
234
|
+
const compileCacheKey = `${effectiveTarget}\n${compileCode}`;
|
|
71
235
|
if (!compiledArtifact || compiledCacheKey !== compileCacheKey) {
|
|
236
|
+
postMessage({ phase: 'compile' });
|
|
72
237
|
if (log) {
|
|
73
|
-
console.log(`[wasm-idle:go-worker] compile start prepare=${String(prepare)} target=${
|
|
238
|
+
console.log(`[wasm-idle:go-worker] compile start prepare=${String(prepare)} target=${effectiveTarget} bytes=${compileCode.length}`);
|
|
74
239
|
}
|
|
75
240
|
const result = await runtime.compiler.compile({
|
|
76
|
-
code,
|
|
77
|
-
target,
|
|
241
|
+
code: compileCode,
|
|
242
|
+
target: effectiveTarget,
|
|
78
243
|
prepare,
|
|
79
244
|
log,
|
|
245
|
+
assetTimeoutMs: runtimeLimits?.assetTimeoutMs,
|
|
246
|
+
compileTimeoutMs: runtimeLimits?.compileTimeoutMs,
|
|
247
|
+
linkTimeoutMs: runtimeLimits?.compileTimeoutMs,
|
|
248
|
+
maxAssetBytes: runtimeLimits?.maxAssetBytes,
|
|
249
|
+
maxWasmMemoryBytes: runtimeLimits?.maxWasmMemoryBytes,
|
|
80
250
|
onProgress(progress) {
|
|
81
251
|
postMessage({ progress });
|
|
82
252
|
}
|
|
@@ -91,7 +261,9 @@ self.onmessage = async (event) => {
|
|
|
91
261
|
postMessage({ output: result.stdout });
|
|
92
262
|
if (!result.success) {
|
|
93
263
|
throw new Error(result.stderr ||
|
|
94
|
-
result.diagnostics
|
|
264
|
+
result.diagnostics
|
|
265
|
+
?.map((diagnostic) => diagnostic.message)
|
|
266
|
+
.join('\n') ||
|
|
95
267
|
'Go compilation failed');
|
|
96
268
|
}
|
|
97
269
|
if (result.stderr)
|
|
@@ -115,37 +287,71 @@ self.onmessage = async (event) => {
|
|
|
115
287
|
if (log) {
|
|
116
288
|
console.log(`[wasm-idle:go-worker] runtime start target=${compiledArtifact.target} format=${compiledArtifact.format}`);
|
|
117
289
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
290
|
+
postMessage({ phase: 'execute' });
|
|
291
|
+
const restoreGoDebugHost = debug && debugBufferGo
|
|
292
|
+
? createGoDebugHost({
|
|
293
|
+
control: debugBufferGo,
|
|
294
|
+
breakpoints,
|
|
295
|
+
pauseOnEntry: !!pauseOnEntry
|
|
296
|
+
})
|
|
297
|
+
: null;
|
|
298
|
+
const hasInitialStdin = typeof stdin === 'string';
|
|
299
|
+
let initialStdin = hasInitialStdin ? stdin : null;
|
|
300
|
+
let execution = null;
|
|
301
|
+
try {
|
|
302
|
+
execution = await runtime.executeBrowserGoArtifact(compiledArtifact, {
|
|
303
|
+
args,
|
|
304
|
+
runtimeManifestUrl: manifestUrl,
|
|
305
|
+
assetTimeoutMs: runtimeLimits?.assetTimeoutMs,
|
|
306
|
+
runTimeoutMs: runtimeLimits?.runTimeoutMs,
|
|
307
|
+
maxAssetBytes: runtimeLimits?.maxAssetBytes,
|
|
308
|
+
maxWasmMemoryBytes: runtimeLimits?.maxWasmMemoryBytes,
|
|
309
|
+
env: {
|
|
310
|
+
USER: 'jungol'
|
|
311
|
+
},
|
|
312
|
+
stdin: () => {
|
|
313
|
+
if (hasInitialStdin) {
|
|
314
|
+
const chunk = initialStdin;
|
|
315
|
+
initialStdin = null;
|
|
316
|
+
if (log) {
|
|
317
|
+
console.log(chunk == null
|
|
318
|
+
? '[wasm-idle:go-stdin] fd_read(bytes=0, eof=true)'
|
|
319
|
+
: `[wasm-idle:go-stdin] fd_fill(bytes=${new TextEncoder().encode(chunk).byteLength}, text=${JSON.stringify(chunk)})`);
|
|
320
|
+
}
|
|
321
|
+
return chunk;
|
|
322
|
+
}
|
|
323
|
+
const chunk = waitForBufferedStdin(stdinBufferGo, () => postMessage({ buffer: true }));
|
|
324
|
+
if (chunk == null) {
|
|
325
|
+
if (log) {
|
|
326
|
+
console.log('[wasm-idle:go-stdin] fd_read(bytes=0, eof=true)');
|
|
327
|
+
}
|
|
328
|
+
return null;
|
|
329
|
+
}
|
|
126
330
|
if (log) {
|
|
127
|
-
console.log(
|
|
331
|
+
console.log(`[wasm-idle:go-stdin] fd_fill(bytes=${new TextEncoder().encode(chunk).byteLength}, text=${JSON.stringify(chunk)})`);
|
|
332
|
+
}
|
|
333
|
+
return chunk;
|
|
334
|
+
},
|
|
335
|
+
stdout: (output) => {
|
|
336
|
+
if (output) {
|
|
337
|
+
postMessage({ output });
|
|
338
|
+
}
|
|
339
|
+
},
|
|
340
|
+
stderr: (output) => {
|
|
341
|
+
if (output) {
|
|
342
|
+
postMessage({ output });
|
|
128
343
|
}
|
|
129
|
-
return null;
|
|
130
|
-
}
|
|
131
|
-
if (log) {
|
|
132
|
-
console.log(`[wasm-idle:go-stdin] fd_fill(bytes=${new TextEncoder().encode(chunk).byteLength}, text=${JSON.stringify(chunk)})`);
|
|
133
|
-
}
|
|
134
|
-
return chunk;
|
|
135
|
-
},
|
|
136
|
-
stdout: (output) => {
|
|
137
|
-
if (output) {
|
|
138
|
-
postMessage({ output });
|
|
139
|
-
}
|
|
140
|
-
},
|
|
141
|
-
stderr: (output) => {
|
|
142
|
-
if (output) {
|
|
143
|
-
postMessage({ output });
|
|
144
344
|
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
finally {
|
|
348
|
+
restoreGoDebugHost?.();
|
|
349
|
+
}
|
|
147
350
|
if (log) {
|
|
148
|
-
console.log(`[wasm-idle:go-worker] wasi run complete exitCode=${String(execution
|
|
351
|
+
console.log(`[wasm-idle:go-worker] wasi run complete exitCode=${String(execution?.exitCode)}`);
|
|
352
|
+
}
|
|
353
|
+
if (!execution) {
|
|
354
|
+
throw new Error('Go program did not return an execution result');
|
|
149
355
|
}
|
|
150
356
|
if (execution.exitCode !== 0) {
|
|
151
357
|
throw new Error(execution.stderr
|