From 8deca854f5d4bd50c67a6f989d2a381eb9379753 Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Tue, 7 Apr 2026 11:23:33 -0700 Subject: [PATCH] Remove DETERMINISTIC setting I'm not sure there are any users of this settings, but in case there are I have left the `src/deterministic.js` file in place which can be used via `--pre-js` instead. Fixes: #26647 --- ChangeLog.md | 4 ++++ .../docs/tools_reference/settings_reference.rst | 17 +---------------- src/deterministic.js | 1 - src/lib/libcore.js | 12 ++++++------ src/lib/libwasi.js | 6 ------ src/parseTools.mjs | 12 ------------ src/postamble.js | 4 ---- src/settings.js | 10 ---------- test/test_other.py | 2 +- tools/settings.py | 1 + 10 files changed, 13 insertions(+), 56 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 2e1d037f5970f..2c34d2e86db2b 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -20,6 +20,10 @@ See docs/process.md for more on how version tagging works. 5.0.6 (in development) ---------------------- +- The `-sDETERMINISTIC` setting was removed. This setting just injected + `src/deterministic.js` as a `--pre-js`. For now, this file remains part of + emscripten. If you are a user of this feature please let us know otherwise + this may be deleted in a future release. - The minimum version of node supported by the generated code was bumped from v12.22.0 to v18.3.0. (#26604) - The DETERMINISIC settings was marked as deprecated (#26653) diff --git a/site/source/docs/tools_reference/settings_reference.rst b/site/source/docs/tools_reference/settings_reference.rst index b9962d866639c..484982f730df1 100644 --- a/site/source/docs/tools_reference/settings_reference.rst +++ b/site/source/docs/tools_reference/settings_reference.rst @@ -1775,22 +1775,6 @@ testing. See test_chunked_synchronous_xhr in runner.py and library.js. Default value: false -.. _deterministic: - -DETERMINISTIC -============= - -If 1, we force Date.now(), Math.random, etc. to return deterministic results. -This also tries to make execution deterministic across machines and -environments, for example, not doing anything different based on the -browser's language setting (which would mean you can get different results -in different browsers, or in the browser and in node). -Good for comparing builds for debugging purposes (and nothing else). - -.. note:: This setting is deprecated - -Default value: false - .. _modularize: MODULARIZE @@ -3514,3 +3498,4 @@ for backwards compatibility with older versions: - ``NODEJS_CATCH_REJECTION``: No longer supported (Valid values: [0]) - ``POLYFILL_OLD_MATH_FUNCTIONS``: No longer supported (Valid values: [0]) - ``RELOCATABLE``: No longer supported (Valid values: [0]) + - ``DETERMINISTIC``: No longer supported (Valid values: [0]) diff --git a/src/deterministic.js b/src/deterministic.js index 9c4b3ca5bd74f..4eef50459d111 100644 --- a/src/deterministic.js +++ b/src/deterministic.js @@ -20,7 +20,6 @@ Date.now = deterministicNow; // Note: this approach does not work on certain versions of Node.js // Specifically it seems like its not possible to override performance.now on // node v16 through v18. -// See getPerformanceNow in parseTools.mjs for how we deal with this. if (globalThis.performance) performance.now = deterministicNow; // for consistency between different builds than between runs of the same build diff --git a/src/lib/libcore.js b/src/lib/libcore.js index ee9cfcedef751..3857db9bd84fb 100644 --- a/src/lib/libcore.js +++ b/src/lib/libcore.js @@ -1355,13 +1355,13 @@ addToLibrary({ emscripten_date_now: () => Date.now(), - emscripten_performance_now: () => {{{ getPerformanceNow() }}}(), + emscripten_performance_now: () => performance.now(), #if PTHREADS && !AUDIO_WORKLET // Pthreads need their clocks synchronized to the execution of the main // thread, so, when using them, make sure to adjust all timings to the // respective time origins. - emscripten_get_now: () => performance.timeOrigin + {{{ getPerformanceNow() }}}(), + emscripten_get_now: () => performance.timeOrigin + performance.now(), #else #if AUDIO_WORKLET // https://github.com/WebAudio/web-audio-api/issues/2413 emscripten_get_now: `; @@ -1369,11 +1369,11 @@ addToLibrary({ // (https://github.com/WebAudio/web-audio-api/issues/2527), so if building // with // Audio Worklets enabled, do a dynamic check for its presence. - if (globalThis.performance && {{{ getPerformanceNow() }}}) { + if (globalThis.performance && performance.now) { #if PTHREADS - _emscripten_get_now = () => performance.timeOrigin + {{{ getPerformanceNow() }}}(); + _emscripten_get_now = () => performance.timeOrigin + performance.now(); #else - _emscripten_get_now = () => {{{ getPerformanceNow() }}}(); + _emscripten_get_now = () => performance.now(); #endif } else { _emscripten_get_now = Date.now; @@ -1383,7 +1383,7 @@ addToLibrary({ // Modern environment where performance.now() is supported: // N.B. a shorter form "_emscripten_get_now = performance.now;" is // unfortunately not allowed even in current browsers (e.g. FF Nightly 75). - emscripten_get_now: () => {{{ getPerformanceNow() }}}(), + emscripten_get_now: () => performance.now(), #endif #endif diff --git a/src/lib/libwasi.js b/src/lib/libwasi.js index ca3a218553d99..4f38c1b5965a1 100644 --- a/src/lib/libwasi.js +++ b/src/lib/libwasi.js @@ -49,13 +49,7 @@ var WasiLibrary = { $getEnvStrings: () => { if (!getEnvStrings.strings) { // Default values. -#if DETERMINISTIC - // Deterministic language detection, ignore the browser's language. - var lang = 'C.UTF-8'; -#else - // Browser language detection #8751 var lang = (globalThis.navigator?.language ?? 'C').replace('-', '_') + '.UTF-8'; -#endif var env = { #if !PURE_WASI 'USER': 'web_user', diff --git a/src/parseTools.mjs b/src/parseTools.mjs index 544d7bd808250..2b79bf12a31bf 100644 --- a/src/parseTools.mjs +++ b/src/parseTools.mjs @@ -1105,17 +1105,6 @@ function formattedMinNodeVersion() { return `v${major}.${minor}.${rev}`; } -function getPerformanceNow() { - // This is needed to support Node.js v16 - v18 where `performance.now` - // cannot be overridden in the normal way. - // TODO(sbc): remove this once we drop support for these versions. - if (DETERMINISTIC && ENVIRONMENT_MAY_BE_NODE) { - return 'deterministicNow'; - } else { - return 'performance.now'; - } -} - function ENVIRONMENT_IS_MAIN_THREAD() { return `(!${ENVIRONMENT_IS_WORKER_THREAD()})`; } @@ -1231,7 +1220,6 @@ addToCompileTimeContext({ getHeapForType, getHeapOffset, getNativeTypeSize, - getPerformanceNow, getUnsharedTextDecoderView, hasExportedSymbol, isSymbolNeeded, diff --git a/src/postamble.js b/src/postamble.js index 78a5aaae1ad18..4596489dc9620 100644 --- a/src/postamble.js +++ b/src/postamble.js @@ -10,10 +10,6 @@ #include "source_map_support.js" #endif -#if DETERMINISTIC -#include "deterministic.js" -#endif - #if ASSERTIONS var calledRun; #endif diff --git a/src/settings.js b/src/settings.js index fdb3a4ad1864e..37068c9ee4419 100644 --- a/src/settings.js +++ b/src/settings.js @@ -1206,16 +1206,6 @@ var ERROR_ON_UNDEFINED_SYMBOLS = true; // [link] var SMALL_XHR_CHUNKS = false; -// If 1, we force Date.now(), Math.random, etc. to return deterministic results. -// This also tries to make execution deterministic across machines and -// environments, for example, not doing anything different based on the -// browser's language setting (which would mean you can get different results -// in different browsers, or in the browser and in node). -// Good for comparing builds for debugging purposes (and nothing else). -// [link] -// [deprecated] -var DETERMINISTIC = false; - // By default we emit all code in a straightforward way into the output // .js file. That means that if you load that in a script tag in a web // page, it will use the global scope. With ``MODULARIZE`` set, we instead emit diff --git a/test/test_other.py b/test/test_other.py index 780c164773f3a..af901b535ac1e 100644 --- a/test/test_other.py +++ b/test/test_other.py @@ -12061,7 +12061,7 @@ def test_deterministic(self): printf("JS random: %d\n", EM_ASM_INT({ return Math.random() })); } ''') - self.run_process([EMCC, 'src.c', '-sDETERMINISTIC', '-Wno-deprecated'] + self.get_cflags()) + self.run_process([EMCC, 'src.c', '--pre-js', path_from_root('src/deterministic.js')] + self.get_cflags()) one = self.run_js('a.out.js') # ensure even if the time resolution is 1 second, that if we see the real # time we'll see a difference diff --git a/tools/settings.py b/tools/settings.py index b82206bcc9d44..d353d4c31f4c5 100644 --- a/tools/settings.py +++ b/tools/settings.py @@ -253,6 +253,7 @@ ['NODEJS_CATCH_REJECTION', [0], 'No longer supported'], ['POLYFILL_OLD_MATH_FUNCTIONS', [0], 'No longer supported'], ['RELOCATABLE', [0], 'No longer supported'], + ['DETERMINISTIC', [0], 'No longer supported'], ] user_settings: dict[str, str] = {}