diff options
Diffstat (limited to 'js/src/tests/non262/PrivateName/lexical-presence.js')
-rw-r--r-- | js/src/tests/non262/PrivateName/lexical-presence.js | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/js/src/tests/non262/PrivateName/lexical-presence.js b/js/src/tests/non262/PrivateName/lexical-presence.js new file mode 100644 index 0000000000..4ec5c310c4 --- /dev/null +++ b/js/src/tests/non262/PrivateName/lexical-presence.js @@ -0,0 +1,55 @@ +// |reftest| shell-option(--enable-private-fields) skip-if(!xulRuntime.shell) -- requires shell-options + +// Verify that private fields are enabled. +class A { + #x; +}; + +function assertThrowsSyntaxError(str) { + assertThrowsInstanceOf(() => eval(str), SyntaxError); // Direct Eval + assertThrowsInstanceOf(() => (1, eval)(str), SyntaxError); // Indirect Eval + assertThrowsInstanceOf(() => Function(str), SyntaxError); // Function +} + +assertThrowsSyntaxError(` + class B { + g() { + return this.#x; + } + }; +`); + +assertThrowsSyntaxError(` +with (new class A { #x; }) { + class B { + #y; + constructor() { return this.#x; } + } + } +`); + +// Make sure we don't create a generic binding for #x. +with(new class { + #x = 12; +}) { + assertEq('#x' in this, false); +} + +// Try to fetch a non-existing field using different +// compilation contexts +function assertNonExisting(fetchCode) { + source = `var X = class { + b() { + ${fetchCode} + } + } + var a = new X; + a.b()` + assertThrowsInstanceOf(() => eval(source), SyntaxError); +} + +assertNonExisting(`return eval("this.#x")"`); +assertNonExisting(`return (1,eval)("this.#x")`); +assertNonExisting(`var f = Function("this.#x"); return f();`); + +if (typeof reportCompare === 'function') reportCompare(0, 0);
\ No newline at end of file |