diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
commit | 36d22d82aa202bb199967e9512281e9a53db42c9 (patch) | |
tree | 105e8c98ddea1c1e4784a60a5a6410fa416be2de /js/src/jit-test/tests/warp/number-tostring-with-base.js | |
parent | Initial commit. (diff) | |
download | firefox-esr-upstream.tar.xz firefox-esr-upstream.zip |
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'js/src/jit-test/tests/warp/number-tostring-with-base.js')
-rw-r--r-- | js/src/jit-test/tests/warp/number-tostring-with-base.js | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/warp/number-tostring-with-base.js b/js/src/jit-test/tests/warp/number-tostring-with-base.js new file mode 100644 index 0000000000..47842bec3f --- /dev/null +++ b/js/src/jit-test/tests/warp/number-tostring-with-base.js @@ -0,0 +1,89 @@ +function testConstantBaseFastPathTemplate(xs) { + assertEq(xs.length, $BASE * $BASE); + for (let j = 0; j < 200;) { + // The fast path can be used for all integers below |base * base|. + for (let i = 0; i < $BASE * $BASE; ++i, ++j) { + assertEq(i.toString($BASE), xs[i]); + } + } +} + +// Test when Number.prototype.toString is called with a constant base argument +// and the fast path for static strings can be used. +for (let base = 2; base <= 36; ++base) { + let fn = Function(`return ${testConstantBaseFastPathTemplate}`.replaceAll("$BASE", base))(); + let xs = Array.from({length: base * base}, (_, i) => i.toString(base)); + for (let i = 0; i < 2; ++i) { + fn(xs); + } +} + +function testConstantBaseTemplate(xs) { + assertEq(xs.length, $BASE * $BASE * 2); + for (let j = 0; j < 200;) { + // The fast path can only be used for integers below |base * base|. + for (let i = 0; i < $BASE * $BASE * 2; ++i, ++j) { + assertEq(i.toString($BASE), xs[i]); + } + } +} + +// Test when Number.prototype.toString is called with a constant base argument +// and the fast path for static strings can't always be used. +for (let base = 2; base <= 36; ++base) { + let fn = Function(`return ${testConstantBaseTemplate}`.replaceAll("$BASE", base))(); + let xs = Array.from({length: base * base * 2}, (_, i) => i.toString(base)); + for (let i = 0; i < 2; ++i) { + fn(xs); + } +} + +function testVariableBaseFastPathTemplate(xs, ys) { + assertEq(ys.length, 2); + assertEq(ys[0], ys[1]); + let base = ys[0]; + + assertEq(xs.length, base * base); + + for (let j = 0; j < 200;) { + // The fast path can be used for all integers below |base * base|. + for (let i = 0; i < base * base; ++i, ++j) { + assertEq(i.toString(ys[i & 1]), xs[i]); + } + } +} + +// Test when Number.prototype.toString is called with a non-constant base argument +// and the fast path for static strings can be used. +for (let base = 2; base <= 36; ++base) { + let fn = Function(`return ${testVariableBaseFastPathTemplate}`)(); + let xs = Array.from({length: base * base}, (_, i) => i.toString(base)); + for (let i = 0; i < 2; ++i) { + fn(xs, [base, base]); + } +} + +function testVariableBaseTemplate(xs, ys) { + assertEq(ys.length, 2); + assertEq(ys[0], ys[1]); + let base = ys[0]; + + assertEq(xs.length, base * base * 2); + + for (let j = 0; j < 200;) { + // The fast path can only be used for integers below |base * base|. + for (let i = 0; i < base * base * 2; ++i, ++j) { + assertEq(i.toString(ys[i & 1]), xs[i]); + } + } +} + +// Test when Number.prototype.toString is called with a non-constant base argument +// and the fast path for static strings can't always be used. +for (let base = 2; base <= 36; ++base) { + let fn = Function(`return ${testVariableBaseTemplate}`)(); + let xs = Array.from({length: base * base * 2}, (_, i) => i.toString(base)); + for (let i = 0; i < 2; ++i) { + fn(xs, [base, base]); + } +} |