diff --git a/docs/workflow/debugging/mono/wasm-debugging.md b/docs/workflow/debugging/mono/wasm-debugging.md index c358330005a..48c9de5d0d4 100644 --- a/docs/workflow/debugging/mono/wasm-debugging.md +++ b/docs/workflow/debugging/mono/wasm-debugging.md @@ -83,14 +83,10 @@ and change the This will hopefully cause the failure to happen reliably. There is another random number generator in `upstream/emscripten/src/deterministic.js` -which needs the same treatment: -``` -var randomBuffer3 = new Uint8Array(2); -crypto.getRandomValues(randomBuffer3); +which needs the same treatment. -var MAGIC = (randomBuffer3 [0] << 8) | randomBuffer3 [1]; -console.log ("SEED2: " + MAGIC); -``` +Running `make patch-deterministic` in `src/mono/wasm` will patch the +emscripten installation in `src/mono/wasm/emsdk` with these changes. # Debugging signature mismatch errors diff --git a/src/mono/wasm/Makefile b/src/mono/wasm/Makefile index 10a54691804..494c7fe365e 100644 --- a/src/mono/wasm/Makefile +++ b/src/mono/wasm/Makefile @@ -140,3 +140,6 @@ build-dbg-proxy: $(DOTNET) build $(TOP)/src/mono/wasm/debugger/BrowserDebugHost $(MSBUILD_ARGS) build-dbg-testsuite: $(DOTNET) build $(TOP)/src/mono/wasm/debugger/DebuggerTestSuite $(MSBUILD_ARGS) + +patch-deterministic: + cd emsdk/upstream/emscripten/ && patch -p1 < ../../../runtime/deterministic.diff diff --git a/src/mono/wasm/runtime/deterministic.diff b/src/mono/wasm/runtime/deterministic.diff new file mode 100644 index 00000000000..1535d837314 --- /dev/null +++ b/src/mono/wasm/runtime/deterministic.diff @@ -0,0 +1,41 @@ +diff --git a/src/deterministic.js b/src/deterministic.js +index 0b894b4ac..05f50abba 100644 +--- a/src/deterministic.js ++++ b/src/deterministic.js +@@ -4,7 +4,13 @@ + * SPDX-License-Identifier: MIT + */ + +-var MAGIC = 0; ++var randomBuffer3 = new Uint8Array(2); ++crypto.getRandomValues(randomBuffer3); ++ ++var MAGIC = (randomBuffer3 [0] << 8) | randomBuffer3 [1]; ++console.log ("SEED2: " + MAGIC); ++ ++//var MAGIC = 0; + Math.random = () => { + MAGIC = Math.pow(MAGIC + 1.8912, 3) % 1; + return MAGIC; +diff --git a/src/library.js b/src/library.js +index 603f94dbf..698e9fe29 100644 +--- a/src/library.js ++++ b/src/library.js +@@ -2196,6 +2196,17 @@ mergeInto(LibraryManager.library, { + // TODO: consider allowing the API to get a parameter for the number of + // bytes. + $getRandomDevice: function() { ++ var randomBuffer2 = new Uint8Array(2); ++ crypto.getRandomValues(randomBuffer2); ++ ++ if (FS.seed2 == null) ++ FS.seed2 = (randomBuffer2 [0] << 8) | randomBuffer2 [1]; ++ console.log('SEED: ' + FS.seed2); ++ return function() { ++ FS.seed2 = FS.seed2 * 16807 % 2147483647; ++ return FS.seed2; ++ }; ++ + if (typeof crypto == 'object' && typeof crypto['getRandomValues'] == 'function') { + // for modern web browsers + var randomBuffer = new Uint8Array(1);