-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
Copy pathloopinversion.js
79 lines (67 loc) · 5.57 KB
/
loopinversion.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
// All loop inversions require two loops and variable assignments inside
// Eval cases
// one var assignment in the inner block
eval("\"use strict\"; function f1(){for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { var a = r; } } }");
eval("function f2(){for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { var a = r; } } }");
eval("\"use strict\"; function f1a(){var a; for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { a = r; } } }");
eval("function f2a(){var a; for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { a = r; } } }");
// actual use of the function with the inverted loop, before function declaration
eval("\"use strict\"; f3(); function f3(){for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { var a = r; } } }");
eval("f4(); function f4(){for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { var a = r; } } }");
eval("\"use strict\"; f3a(); function f3a(){var a; for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { a = r; } } }");
eval("f4a(); function f4a(){var a; for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { a = r; } } }");
// actual use of the function with the inverted loop, after function declaration
eval("\"use strict\"; function f5(){for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { var a = r; } } }; f5();");
eval("function f6(){for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { var a = r; } } }; f6();");
eval("\"use strict\"; function f5a(){var a; for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { a = r; } } }; f5a();");
eval("function f6a(){var a; for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { a = r; } } }; f6a();");
// two var assignments in the inner block
eval("\"use strict\"; function f7(){for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { var a = r; var b = r; } } }");
eval("function f8(){for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { var a = r; var b = r; } } }");
eval("\"use strict\"; function f7a(){var a; var b; for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { a = r; b = r; } } }");
eval("function f8a(){var a; var b; for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { a = r; b = r; } } }");
// actual use of the function with the inverted loop, before function declaration
eval("\"use strict\"; f9(); function f9(){for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { var a = r; var b = r; } } }");
eval("f10(); function f10(){for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { var a = r; var b = r; } } }");
eval("\"use strict\"; f9a(); function f9a(){var a; var b; for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { a = r; b = r; } } }");
eval("f10a(); function f10a(){var a; var b; for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { a = r; b = r; } } }");
// actual use of the function with the inverted loop, after function declaration
eval("\"use strict\"; function f11(){for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { var a = r; var b = r; } } }; f11();");
eval("function f12(){for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { var a = r; var b = r; } } }; f12();");
eval("\"use strict\"; function f11a(){var a; var b; for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { a = r; b = r; } } }; f11a();");
eval("function f12a(){var a; var b; for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { a = r; b = r; } } }; f12a();");
//Non eval cases
function g1(){"use strict"; for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { var a = r; } } }; g1();
function g2(){for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { var a = r; } } }; g2();
function g1a(){"use strict"; var a; for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { var a = r; } } }; g1a();
function g2a(){var a; for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { a = r; } } }; g2a();
function g3(){"use strict"; for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { var a = r; var b = r;} } }; g3();
function g4(){for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { var a = r; var b = r;} } }; g4();
function g3a(){"use strict"; var a; var b; for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { a = r; b = r; } } }; g3a();
function g4a(){var a; var b; for (var h = 0; h < 1; ++h) { for (var r = 0; r < 1; ++r) { a = r; b = r; } } }; g4a();
function g5()
{
var c = 3;
function foo() {
for (var j = 0; j < 1; ++j) {
for (var i = 0; i < 1; ++i) {
1;
c = 2;
1;
}
};
};
foo();
WScript.Echo(c);
};
g5();
// Tests that loop inversion does not crash when the outer loop does not have
// a condition. In order to not stay in an infinite loop, these functions return
// immediately. The bytecode will still be generated.
function g6(p){if(!p) return; var a = 0; for (var h = 0;; ++h){ for (var r = 0; r < 1; ++r){ a = r; }}};g6(0);
function g6a(p){"use strict"; if(!p) return; var a = 0; for (var h = 0;; ++h){ for (var r = 0; r < 1; ++r){ a = r; }}};g6a(0);
WScript.Echo("pass");