| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- // Test TDZ behavior when writing to let declared in switch and closure-captured.
- function test0() {
- switch (x) {
- case 1:
- let inner;
- inner = 2;
- function f() { if (inner !== 2) WScript.Echo('fail'); }
- f();
- break;
- case 2:
- case 0:
- try {
- inner = 1;
- }
- catch (e) {
- break;
- }
- WScript.Echo('fail');
- }
- }
- var x = 0;
- test0();
- x = 1;
- test0();
- function test1() {
- switch (x) {
- case 1:
- let inner;
- inner = 2;
- function f() { if (eval('inner') !== 2) WScript.Echo('fail'); }
- f();
- break;
- case 2:
- case 0:
- try {
- inner = 1;
- }
- catch (e) {
- break;
- }
- WScript.Echo('fail');
- }
- }
- var x = 0;
- test1();
- x = 1;
- test1();
- // GitHub issue #505: Use before declaration emitted to early and
- // prevented Emit visitation of AST subtrees
- function test2() {
- var calledg = false;
- function g() { calledg = true; }
- function f() {
- var k = 1;
- d = g();
- let d;
- }
- try {
- f();
- } catch (e) {
- if (!calledg) {
- WScript.Echo('test2 failed to call g() in f()');
- }
- return;
- }
- WScript.Echo('test2 failed to throw TDZ error in f()');
- }
- test2();
- function test3() {
- // this used to assert before #505 was fixed; arguments expression
- // was not visited by Emit() and did not get a location for its sym
- // properly assigned
- function f()
- {
- var m = 1;
- (() => {
- m = k1 = arguments;
- let k1 = 10;
- })();
- };
- try {
- f();
- } catch (e) {
- return;
- }
- WScript.Echo('fail');
- }
- test3();
- function test4() {
- // this case come from jsfunfuzz and is the smallest I could
- // get the repro to be
- var window = function() { return this; };
- {
- var z = w, u3056 = this, w;
- }
- if (w !== undefined) {
- WScript.Echo('test4 failed, w not undefined first time');
- }
- function f() {
- var window = function() { return this; };
- //eval('');
- try {
- u3056( "" ) = z = new Object();
- } catch(e) {
- if (e.message !== 'Use before declaration') {
- WScript.Echo('test4 failed, threw unexpected error: ' + e.message);
- }
- };
- class u3056 {static b(){ var x = z; }}(window).bind;
- };
- f();
- if (w !== undefined) {
- WScript.Echo('test4 failed, w not undefined second time');
- }
- }
- test4();
- WScript.Echo('pass');
|