Compare commits
1167 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6982a0554c | ||
|
|
fa3250199a | ||
|
|
06b9894c19 | ||
|
|
9f9db504d7 | ||
|
|
82ae95c334 | ||
|
|
9a5e2052c4 | ||
|
|
b1410be443 | ||
|
|
12985d86c2 | ||
|
|
49bfc6b555 | ||
|
|
d1c6bb8c7c | ||
|
|
5c169615a8 | ||
|
|
73d77f4f64 | ||
|
|
ccf0e2ef4f | ||
|
|
20ca0f5906 | ||
|
|
b29d435bb5 | ||
|
|
90585e29c2 | ||
|
|
d8fc281915 | ||
|
|
188c39e8d5 | ||
|
|
5429234138 | ||
|
|
b9f72a4a81 | ||
|
|
fc6ebd04a5 | ||
|
|
7e00a12741 | ||
|
|
10b3752b1e | ||
|
|
fe51a91395 | ||
|
|
951d87ca94 | ||
|
|
798fc21530 | ||
|
|
a75a046abb | ||
|
|
38f2b4579f | ||
|
|
56e2a369d0 | ||
|
|
0daa199fa8 | ||
|
|
73e98dcda4 | ||
|
|
36bca6934d | ||
|
|
ace5811691 | ||
|
|
ba7bad0dbd | ||
|
|
b8b2ac5230 | ||
|
|
ea2359381b | ||
|
|
52de64cf16 | ||
|
|
455790202a | ||
|
|
f40f5eb228 | ||
|
|
604caa09e7 | ||
|
|
29a71d3aae | ||
|
|
39a907bde3 | ||
|
|
70474310f3 | ||
|
|
b5f0f4f3a1 | ||
|
|
2905fd625a | ||
|
|
4facd94029 | ||
|
|
4b5993ff15 | ||
|
|
2351a672ea | ||
|
|
4a528c469c | ||
|
|
82d1ef0242 | ||
|
|
7fdd2082a6 | ||
|
|
e529f54e90 | ||
|
|
d626e9bf19 | ||
|
|
a2a9459684 | ||
|
|
a3dfeea144 | ||
|
|
d316fb139d | ||
|
|
83d8aa8b12 | ||
|
|
4f1c12b6fd | ||
|
|
d8e0e34354 | ||
|
|
0c4f315c02 | ||
|
|
0809699bdc | ||
|
|
2088e1c19d | ||
|
|
bf1d47180c | ||
|
|
0cfbd79aa1 | ||
|
|
d66d86f20b | ||
|
|
905325d3e2 | ||
|
|
dea0cc0662 | ||
|
|
d69d8007d6 | ||
|
|
c0b8f2a16d | ||
|
|
cb0257dbbf | ||
|
|
9637f51b68 | ||
|
|
3026bd8975 | ||
|
|
78a44d5ab0 | ||
|
|
7e13c0db40 | ||
|
|
e6a2e9e4d0 | ||
|
|
e773f03927 | ||
|
|
b16380d669 | ||
|
|
334b07a3db | ||
|
|
3cc1527f00 | ||
|
|
525a61fb55 | ||
|
|
c3a002ff97 | ||
|
|
fad6766a90 | ||
|
|
aa664dea0a | ||
|
|
102f994b9d | ||
|
|
2a4c68be4f | ||
|
|
541e6011af | ||
|
|
6fa3fbeae8 | ||
|
|
4eb4cb656c | ||
|
|
193612ac67 | ||
|
|
95cfce68ea | ||
|
|
ec4202590d | ||
|
|
5e2cd07d6f | ||
|
|
06166df999 | ||
|
|
e2dc9cf091 | ||
|
|
069df27bf1 | ||
|
|
3e7873217c | ||
|
|
e21bab7ce6 | ||
|
|
ac9a168fba | ||
|
|
81b64549ce | ||
|
|
082e004b87 | ||
|
|
983e69128b | ||
|
|
b335912e86 | ||
|
|
cc07f3b806 | ||
|
|
07e4b64f3a | ||
|
|
d3ce2bc9e7 | ||
|
|
cff3bf4914 | ||
|
|
79cfac77bd | ||
|
|
224c14d49d | ||
|
|
7857354d85 | ||
|
|
b4aef753e7 | ||
|
|
424173d311 | ||
|
|
ec7cd1dcf7 | ||
|
|
7def684730 | ||
|
|
10f961c27b | ||
|
|
b483678ca7 | ||
|
|
cbbe6fad60 | ||
|
|
f96929c031 | ||
|
|
2b6657e967 | ||
|
|
7c0c92943f | ||
|
|
62a66dfff4 | ||
|
|
2cab348341 | ||
|
|
460218a3f8 | ||
|
|
e49416e4aa | ||
|
|
d4d7d99b70 | ||
|
|
6a696d0a7b | ||
|
|
1c9e13f47d | ||
|
|
b757450cd8 | ||
|
|
23ec484806 | ||
|
|
f1e1bb419a | ||
|
|
6a0af85c8b | ||
|
|
09269be974 | ||
|
|
bf832cde16 | ||
|
|
2972d58dbb | ||
|
|
2e22d38a02 | ||
|
|
ce27bcd69a | ||
|
|
9336cc8247 | ||
|
|
9809567dfc | ||
|
|
1ee8be8d91 | ||
|
|
8430c2f9f8 | ||
|
|
659c8a7632 | ||
|
|
3564b4f20d | ||
|
|
3505a3604a | ||
|
|
9b1bc6c014 | ||
|
|
9f23185f2b | ||
|
|
b82feb9302 | ||
|
|
7f2a591c7e | ||
|
|
afbcebddf6 | ||
|
|
484e484571 | ||
|
|
6f3f21233f | ||
|
|
a6873a3859 | ||
|
|
7a6d452b54 | ||
|
|
9b58b54e2d | ||
|
|
c598a12af9 | ||
|
|
cfe3a98ce5 | ||
|
|
14778e049b | ||
|
|
446fb0198b | ||
|
|
7d3cddf9d6 | ||
|
|
6dead95eb3 | ||
|
|
cc931b3ad8 | ||
|
|
d838b4b52e | ||
|
|
2f3bddbaca | ||
|
|
673b071637 | ||
|
|
da82fa59a7 | ||
|
|
333792352e | ||
|
|
e2ec270b04 | ||
|
|
ed7a0a454e | ||
|
|
d819559a01 | ||
|
|
8ca49155a8 | ||
|
|
b95e3338d9 | ||
|
|
e40a0ee9c6 | ||
|
|
cb62bd98d3 | ||
|
|
f30790b11b | ||
|
|
5205dbcbf4 | ||
|
|
3ff625de7e | ||
|
|
4832bc5d88 | ||
|
|
7f342cb3e3 | ||
|
|
05e7d34ed4 | ||
|
|
86607156e3 | ||
|
|
0fe259e9c5 | ||
|
|
8701a99a15 | ||
|
|
1476c78b53 | ||
|
|
cb6a92892f | ||
|
|
f1556cb945 | ||
|
|
efffb81735 | ||
|
|
202f90ef8f | ||
|
|
c07ea17c01 | ||
|
|
edb4e3bd52 | ||
|
|
4113609dd4 | ||
|
|
7ac7b0872f | ||
|
|
86ae5881b7 | ||
|
|
fac003c64f | ||
|
|
2273655c17 | ||
|
|
01057cf76d | ||
|
|
032f096b7f | ||
|
|
4b334edf49 | ||
|
|
8ddcbc39e6 | ||
|
|
0b0eac1d5d | ||
|
|
b29fc8b27c | ||
|
|
5de369fa67 | ||
|
|
7918a50d52 | ||
|
|
21794c9b8d | ||
|
|
6c686ce593 | ||
|
|
db902af4c6 | ||
|
|
7d6907cb99 | ||
|
|
092d9affb8 | ||
|
|
8f681b1d17 | ||
|
|
90313875f7 | ||
|
|
3f18a61532 | ||
|
|
02a6ce07eb | ||
|
|
738fd52bc4 | ||
|
|
d18979bb23 | ||
|
|
8266993c6e | ||
|
|
9a137e8613 | ||
|
|
ef618332ea | ||
|
|
7f418978c9 | ||
|
|
04cc395c35 | ||
|
|
e008dc1bde | ||
|
|
ddf96cfda2 | ||
|
|
ebfd5c5c74 | ||
|
|
f2ad542679 | ||
|
|
c43118be4f | ||
|
|
93f3b2b114 | ||
|
|
bf000beae7 | ||
|
|
0e16d92786 | ||
|
|
2441827408 | ||
|
|
0aff037a35 | ||
|
|
74a2f53683 | ||
|
|
e20935c3f2 | ||
|
|
3e34f62a1c | ||
|
|
d21cb84696 | ||
|
|
3dd495ecdd | ||
|
|
b9f3ddfb30 | ||
|
|
77332a0315 | ||
|
|
85c56adbd1 | ||
|
|
8da3754e51 | ||
|
|
9a6b11f8e6 | ||
|
|
7ac6fdcc99 | ||
|
|
f6610baaa8 | ||
|
|
09b320e8a5 | ||
|
|
5a1e99d713 | ||
|
|
b762f2d6f4 | ||
|
|
172079a47f | ||
|
|
c58d3936a3 | ||
|
|
18302bf8e9 | ||
|
|
bc5047c1e7 | ||
|
|
206a54a746 | ||
|
|
32def5ebf5 | ||
|
|
ecc9f6b770 | ||
|
|
b37a68c84f | ||
|
|
c141ae6f8d | ||
|
|
97c464dbf5 | ||
|
|
3b28b915eb | ||
|
|
eb001dc1d9 | ||
|
|
aa9bdf416e | ||
|
|
8987780db6 | ||
|
|
30cfea2e7a | ||
|
|
f4e2fb9864 | ||
|
|
b80062c490 | ||
|
|
667fc4d08b | ||
|
|
6142117cdd | ||
|
|
ae28a24c7f | ||
|
|
ebe761cad0 | ||
|
|
fa7a7c5c5a | ||
|
|
557636f3b7 | ||
|
|
49fbe9c5ac | ||
|
|
2ac5086831 | ||
|
|
c6cfa04d10 | ||
|
|
346fa12e0e | ||
|
|
cda27b0970 | ||
|
|
3c74047368 | ||
|
|
94525d859f | ||
|
|
1127a2caf3 | ||
|
|
246d9d4e83 | ||
|
|
4c0b0177b6 | ||
|
|
38bfb73f06 | ||
|
|
bbedbf4ea0 | ||
|
|
2cfb5aa7da | ||
|
|
6c45101870 | ||
|
|
2c2fd89e34 | ||
|
|
f46281e2b7 | ||
|
|
25a18883f5 | ||
|
|
5b4b07e9a7 | ||
|
|
a8aa28a7a6 | ||
|
|
fe5a68f9d5 | ||
|
|
71e61153b1 | ||
|
|
c8b6f4733d | ||
|
|
a48f87abf2 | ||
|
|
2fd927a7cc | ||
|
|
8428326ea1 | ||
|
|
31f8209193 | ||
|
|
9b0f86f5a1 | ||
|
|
ee082ace1b | ||
|
|
ae67a49850 | ||
|
|
4178289c38 | ||
|
|
74ae16f9f8 | ||
|
|
1968203d83 | ||
|
|
86ea38a259 | ||
|
|
8a713e449f | ||
|
|
24aa07855b | ||
|
|
5fd723f143 | ||
|
|
516eaef50c | ||
|
|
4ae1fb3ed8 | ||
|
|
011123223b | ||
|
|
96439ca246 | ||
|
|
c927cea632 | ||
|
|
9f4b98f8e4 | ||
|
|
0f2ef3367c | ||
|
|
7e5b5cac97 | ||
|
|
c1346e06b7 | ||
|
|
0d2fe8e3ef | ||
|
|
f2b9c11e2a | ||
|
|
fe647b083e | ||
|
|
dfe4f6c6de | ||
|
|
a09c8ad666 | ||
|
|
ec598c351b | ||
|
|
eba0f93bc0 | ||
|
|
99800d4aa9 | ||
|
|
70d56c951a | ||
|
|
b810e2f8da | ||
|
|
1abe14296e | ||
|
|
6920e898d1 | ||
|
|
dd71639264 | ||
|
|
2dcc552ce0 | ||
|
|
55387e8fd0 | ||
|
|
7e3e9da860 | ||
|
|
00f509405b | ||
|
|
aceb0af36b | ||
|
|
4f0953f7e9 | ||
|
|
182a47bfb1 | ||
|
|
cd27f4ec38 | ||
|
|
8158b1bdcf | ||
|
|
aacf3edc68 | ||
|
|
8b89072190 | ||
|
|
395a17ccda | ||
|
|
3f355866cf | ||
|
|
71d52f147d | ||
|
|
eb7adaa6fc | ||
|
|
e5cf7972ea | ||
|
|
f81ff10a9b | ||
|
|
16d40915b4 | ||
|
|
e7c21e87e3 | ||
|
|
c4c2ef44d0 | ||
|
|
a845897758 | ||
|
|
32ea2c5530 | ||
|
|
bc61deeca9 | ||
|
|
6a5e74b44e | ||
|
|
54446341ee | ||
|
|
4e12a6f740 | ||
|
|
b35dfc2599 | ||
|
|
9e1da9235e | ||
|
|
a5ffe2c23f | ||
|
|
9282e7b0c6 | ||
|
|
5229cb2b1b | ||
|
|
458e3e15f0 | ||
|
|
c615a1e80a | ||
|
|
10a938cb79 | ||
|
|
4956ad311b | ||
|
|
145874e504 | ||
|
|
bd7be07c38 | ||
|
|
71ee91e716 | ||
|
|
4f70d2e28c | ||
|
|
4b6ca5e742 | ||
|
|
9306da3c58 | ||
|
|
1ac25fc032 | ||
|
|
5f046c724b | ||
|
|
af0262b7e5 | ||
|
|
6b3aeff1d8 | ||
|
|
20e4f8277f | ||
|
|
f3a487a368 | ||
|
|
2dde41615a | ||
|
|
8b69a3d18e | ||
|
|
d40950b741 | ||
|
|
7659ea1d2e | ||
|
|
bdeadffbf5 | ||
|
|
5e6f26445f | ||
|
|
f0a99125ee | ||
|
|
1e4de2e6d3 | ||
|
|
8b4dcd8f3e | ||
|
|
285401ced8 | ||
|
|
9db4c42380 | ||
|
|
94e5e00c03 | ||
|
|
dc6bcaa18e | ||
|
|
d58b184835 | ||
|
|
b3a57ff019 | ||
|
|
3d5bc08185 | ||
|
|
0692435f01 | ||
|
|
f67a6b0e43 | ||
|
|
343ea326c2 | ||
|
|
1c150c632f | ||
|
|
0a0f4f5591 | ||
|
|
931daa85bf | ||
|
|
00e4f7b3c1 | ||
|
|
11e63bc335 | ||
|
|
33405bb24b | ||
|
|
57dc4fb32f | ||
|
|
b85a358deb | ||
|
|
43697958f3 | ||
|
|
3f961bbba0 | ||
|
|
0a1e523cd5 | ||
|
|
4231f7323e | ||
|
|
da2de350c3 | ||
|
|
41beae4dd7 | ||
|
|
82db9188ac | ||
|
|
3dc9e140e4 | ||
|
|
fed0096556 | ||
|
|
2bdc8802dd | ||
|
|
5ef7cb372a | ||
|
|
4ad7b1dae4 | ||
|
|
9186859cb7 | ||
|
|
47c0713747 | ||
|
|
293c566d6c | ||
|
|
9c306406f1 | ||
|
|
9db0695b10 | ||
|
|
f2af093402 | ||
|
|
b9ad53d1ab | ||
|
|
b0eab71470 | ||
|
|
3493a182b2 | ||
|
|
27c5284d3d | ||
|
|
540220b91b | ||
|
|
84634da4b5 | ||
|
|
1743621889 | ||
|
|
f330ab743a | ||
|
|
4377e932ca | ||
|
|
bac14ba881 | ||
|
|
ec095ed647 | ||
|
|
17e73121fa | ||
|
|
f71e8fd948 | ||
|
|
3e62faa64f | ||
|
|
e9645e017f | ||
|
|
55b5f2a8aa | ||
|
|
4e0a22e5c8 | ||
|
|
1aa38051fb | ||
|
|
e62b879b48 | ||
|
|
c6c9f4f5a8 | ||
|
|
fec14379f6 | ||
|
|
79131cd647 | ||
|
|
c3f14a1481 | ||
|
|
7b13159cda | ||
|
|
95094b9c22 | ||
|
|
1ff8e9dd38 | ||
|
|
78309a293d | ||
|
|
695e182d59 | ||
|
|
dc33facfcb | ||
|
|
c70fb60384 | ||
|
|
793d61499b | ||
|
|
a277fe168d | ||
|
|
7d3b941e6e | ||
|
|
e95052a423 | ||
|
|
e667f0acb8 | ||
|
|
69ac794bc8 | ||
|
|
efdb65913b | ||
|
|
a1dedeb3ce | ||
|
|
d3c4a8e9e7 | ||
|
|
7e164aba8f | ||
|
|
22aedef849 | ||
|
|
58fae7dc07 | ||
|
|
5bf8d7e949 | ||
|
|
1df9d06f4a | ||
|
|
3408fc9d32 | ||
|
|
eae26756f1 | ||
|
|
43add9416b | ||
|
|
efcf167e5e | ||
|
|
6ed90913ca | ||
|
|
569c21e952 | ||
|
|
87c3a2c0ce | ||
|
|
baef8bf050 | ||
|
|
0813c5316f | ||
|
|
c88139492d | ||
|
|
cb45886512 | ||
|
|
050474ab44 | ||
|
|
f6c805ae1d | ||
|
|
9464d3c20f | ||
|
|
f18abd1b9c | ||
|
|
3be06ad085 | ||
|
|
265008c948 | ||
|
|
ff526be61d | ||
|
|
e005099fb1 | ||
|
|
504a436e9d | ||
|
|
3ca902258c | ||
|
|
fd0951231c | ||
|
|
9e29b6dad2 | ||
|
|
c391576d52 | ||
|
|
ac73c5d421 | ||
|
|
547f41beba | ||
|
|
daaefc17b9 | ||
|
|
1d407e761e | ||
|
|
2b44f4ae30 | ||
|
|
e51c3541da | ||
|
|
3bf194684b | ||
|
|
aae7d49d0c | ||
|
|
0459af2ecc | ||
|
|
04f2344efc | ||
|
|
bad9d5cf88 | ||
|
|
a0f5f862df | ||
|
|
41996be86f | ||
|
|
5fd8244a2e | ||
|
|
c14e280585 | ||
|
|
bc3fa78e8c | ||
|
|
8c7c107765 | ||
|
|
3dd328dce3 | ||
|
|
014f428153 | ||
|
|
a3b2eb75bd | ||
|
|
da295de82b | ||
|
|
4f8ca4626e | ||
|
|
e54748365c | ||
|
|
2d99d06601 | ||
|
|
98cf95e5b5 | ||
|
|
7313465cba | ||
|
|
2c7ee956fd | ||
|
|
ecf3563c45 | ||
|
|
dee5a27516 | ||
|
|
5a25d24b56 | ||
|
|
bffdc8dca8 | ||
|
|
69b5663653 | ||
|
|
ea9289771b | ||
|
|
2cb55b2ad0 | ||
|
|
bbb5f2a89c | ||
|
|
76d19b60ad | ||
|
|
9e62628171 | ||
|
|
9bf72cf758 | ||
|
|
64d74432f6 | ||
|
|
45ce369480 | ||
|
|
ca32a09032 | ||
|
|
6f954aa3d0 | ||
|
|
f05d4f7af3 | ||
|
|
88e7a542cd | ||
|
|
4dcff038cb | ||
|
|
b4b9305db0 | ||
|
|
28cfb65c47 | ||
|
|
0f4f01b66c | ||
|
|
5d9f1da3ab | ||
|
|
d1aa09c5c7 | ||
|
|
6d5f341999 | ||
|
|
4ffb6fce76 | ||
|
|
71a8d0d236 | ||
|
|
1a498db2d3 | ||
|
|
44dfa5a318 | ||
|
|
251ff1d1af | ||
|
|
ec443e422c | ||
|
|
32deb365d5 | ||
|
|
2244743545 | ||
|
|
04b8964505 | ||
|
|
d6fbc365e2 | ||
|
|
9a978843f5 | ||
|
|
0479ff0c54 | ||
|
|
cf72fe552f | ||
|
|
a1532eb076 | ||
|
|
c2a1bceb77 | ||
|
|
e3c9c22c75 | ||
|
|
0f4cd73dcc | ||
|
|
281e882d27 | ||
|
|
cc6aa3e5ac | ||
|
|
e869779a98 | ||
|
|
06cdb74279 | ||
|
|
ff289b90a9 | ||
|
|
9b6bc67c33 | ||
|
|
4b90dc1fdb | ||
|
|
951770fc68 | ||
|
|
48b3fe9952 | ||
|
|
a400741868 | ||
|
|
59a4e56bc8 | ||
|
|
1f1fccc45d | ||
|
|
b7f6b73f4e | ||
|
|
9469c03ac9 | ||
|
|
d57527697f | ||
|
|
f7ca4f2297 | ||
|
|
c076e7b60d | ||
|
|
4a55bb0be5 | ||
|
|
28ecea50a6 | ||
|
|
9a311705f5 | ||
|
|
ee3fe0f4cd | ||
|
|
87f6e1b091 | ||
|
|
c934fc8142 | ||
|
|
257ddc3bdb | ||
|
|
1ddc05725d | ||
|
|
e6b76a4879 | ||
|
|
a0c3836ba0 | ||
|
|
f8a71b56fd | ||
|
|
11e9bdc427 | ||
|
|
a84564d1a8 | ||
|
|
c595b84032 | ||
|
|
7cb1adf455 | ||
|
|
7bea38a05d | ||
|
|
0f910ee25c | ||
|
|
beb9659778 | ||
|
|
f1a833a7aa | ||
|
|
2e41cd6394 | ||
|
|
09f77c7d4d | ||
|
|
fef0bf9ee0 | ||
|
|
ae740b933f | ||
|
|
ec7f37f314 | ||
|
|
eb48a035e7 | ||
|
|
6ab3224c0d | ||
|
|
c909ffb715 | ||
|
|
f71f4905b0 | ||
|
|
fb177a6312 | ||
|
|
65da9acce6 | ||
|
|
67d0237f73 | ||
|
|
984a21704e | ||
|
|
aa3f647656 | ||
|
|
c526da59a1 | ||
|
|
581630e0a7 | ||
|
|
f5952933a0 | ||
|
|
f001e4cb9d | ||
|
|
57ce5bd9e0 | ||
|
|
861a79ac9f | ||
|
|
00996afd2c | ||
|
|
e76fb354eb | ||
|
|
3276740779 | ||
|
|
5509e51098 | ||
|
|
94f84727ce | ||
|
|
8a4f86528f | ||
|
|
adb0e882e9 | ||
|
|
f83d370f57 | ||
|
|
b19aa58cff | ||
|
|
0a65de89b9 | ||
|
|
6e86ee950d | ||
|
|
8ca2401ebe | ||
|
|
491f16c766 | ||
|
|
a30092e20f | ||
|
|
b1abe92e1a | ||
|
|
b454ce667e | ||
|
|
32283a0def | ||
|
|
ac51d4c5a0 | ||
|
|
0432a7abb9 | ||
|
|
f3a1694a41 | ||
|
|
2e0dc97003 | ||
|
|
701035621d | ||
|
|
79334dda10 | ||
|
|
e918748d88 | ||
|
|
6b2f34769a | ||
|
|
48ffbef51d | ||
|
|
c0f3feae9f | ||
|
|
a00040dd93 | ||
|
|
ee95c1b38b | ||
|
|
4bceb85cbf | ||
|
|
30a75049f5 | ||
|
|
a3cc3a9b87 | ||
|
|
96f8befdd7 | ||
|
|
cd58635dcc | ||
|
|
274331d0ea | ||
|
|
0489d6de64 | ||
|
|
fb092839c2 | ||
|
|
b7c112eefe | ||
|
|
b2b8a0d386 | ||
|
|
ac40301813 | ||
|
|
3563d8c09e | ||
|
|
5ae04b3545 | ||
|
|
a80b228d8b | ||
|
|
cf4bf4ceb1 | ||
|
|
8223b2e0db | ||
|
|
381bd3836e | ||
|
|
919d5e3482 | ||
|
|
e3a3db73ae | ||
|
|
d9344f30b8 | ||
|
|
be80f7e706 | ||
|
|
cf45e2f79b | ||
|
|
8354758f30 | ||
|
|
9e6b128374 | ||
|
|
93cdb194f4 | ||
|
|
b633706ce4 | ||
|
|
e9920f7ca1 | ||
|
|
7e465d4a01 | ||
|
|
aa80ee349d | ||
|
|
80e81765cf | ||
|
|
711f88dcb4 | ||
|
|
344d11d591 | ||
|
|
c7cdcf06a6 | ||
|
|
3ee55748d4 | ||
|
|
dedbeeff15 | ||
|
|
bd6dee52ab | ||
|
|
144052ca49 | ||
|
|
65c848cc6f | ||
|
|
8a8a94a596 | ||
|
|
8153b7bd8a | ||
|
|
d787d70127 | ||
|
|
3ac2421932 | ||
|
|
a9fc9ddc33 | ||
|
|
a5d62a3fc6 | ||
|
|
067e5a5762 | ||
|
|
33b5f31984 | ||
|
|
35a849dc48 | ||
|
|
b70591be1a | ||
|
|
b33e7f88e6 | ||
|
|
1f0333e9f1 | ||
|
|
eb98a7f2f3 | ||
|
|
78d1bb92d4 | ||
|
|
ea9ab9fb0e | ||
|
|
ce54c9ccee | ||
|
|
07accd2fbb | ||
|
|
18059cc94f | ||
|
|
b5e0e8c203 | ||
|
|
e5cb9275df | ||
|
|
17b81350d4 | ||
|
|
4d63d4f5b3 | ||
|
|
70d72ad806 | ||
|
|
fe9227a41b | ||
|
|
b49e142a26 | ||
|
|
ee3b39b909 | ||
|
|
9699ffb1af | ||
|
|
fdc9b9413b | ||
|
|
40ceddb48a | ||
|
|
7aa69117e1 | ||
|
|
bff7ad67bb | ||
|
|
c2334baa48 | ||
|
|
fb2b6c7c6f | ||
|
|
f5cbe19b75 | ||
|
|
b34fa11a13 | ||
|
|
320984c5f5 | ||
|
|
4365a51237 | ||
|
|
858e6c78a4 | ||
|
|
0b0296eb2a | ||
|
|
872270b149 | ||
|
|
b1c593a041 | ||
|
|
13be50a4a9 | ||
|
|
16cd5d57a5 | ||
|
|
834f9f3924 | ||
|
|
cf0951f726 | ||
|
|
852f78491a | ||
|
|
229e42cdee | ||
|
|
4e49302916 | ||
|
|
1e51586996 | ||
|
|
d48a3080ac | ||
|
|
26fbeece1c | ||
|
|
8898b8a0fe | ||
|
|
ec64acd2c8 | ||
|
|
ac0b61ed6e | ||
|
|
c06a50f338 | ||
|
|
09f9ae2de9 | ||
|
|
7e6331bb39 | ||
|
|
e275148998 | ||
|
|
974247c8c0 | ||
|
|
a0f4fd390a | ||
|
|
b8b133d91a | ||
|
|
c525a2b190 | ||
|
|
6ffbecb72b | ||
|
|
f0ff6189be | ||
|
|
6b3c49e458 | ||
|
|
f584ca8d07 | ||
|
|
ae4db00991 | ||
|
|
100307ab31 | ||
|
|
148047fbbf | ||
|
|
d11dca3cf9 | ||
|
|
e5badb9541 | ||
|
|
fa668a28b4 | ||
|
|
686a496b1c | ||
|
|
11676f9d72 | ||
|
|
dd31d12a91 | ||
|
|
eb55d8a9bb | ||
|
|
81f1df14d7 | ||
|
|
7f8d72d9d3 | ||
|
|
1eaa211e09 | ||
|
|
0610c020b1 | ||
|
|
0d7d4918eb | ||
|
|
48284844a4 | ||
|
|
ec2e5fa3a2 | ||
|
|
da17766ddd | ||
|
|
0913db8c84 | ||
|
|
5c7705fcad | ||
|
|
f6372483a0 | ||
|
|
98f330658f | ||
|
|
a7b3b0d3a5 | ||
|
|
0a35acbbe7 | ||
|
|
2a9989dd18 | ||
|
|
79b98a9fe8 | ||
|
|
057de570e6 | ||
|
|
557b3e412f | ||
|
|
8d74f34373 | ||
|
|
266ddd9639 | ||
|
|
e51c6ba380 | ||
|
|
6389e52305 | ||
|
|
e05510f3bc | ||
|
|
fc9804b909 | ||
|
|
4761d07e0b | ||
|
|
0111497fc9 | ||
|
|
7d8dea3b26 | ||
|
|
25fc02743a | ||
|
|
0bd8053524 | ||
|
|
1a78bbcd23 | ||
|
|
8430123e9d | ||
|
|
614db97cca | ||
|
|
d854523783 | ||
|
|
781f26eda1 | ||
|
|
37f4395cc0 | ||
|
|
de619ae5a6 | ||
|
|
86859f6d7e | ||
|
|
dcdcfe4d39 | ||
|
|
72306b9885 | ||
|
|
38756b1f26 | ||
|
|
85a09fc3b6 | ||
|
|
307b88d6cc | ||
|
|
fb049d3a81 | ||
|
|
67cca43358 | ||
|
|
642273c290 | ||
|
|
e8b23c7798 | ||
|
|
9edbe93df5 | ||
|
|
af37ecafe1 | ||
|
|
41a9329409 | ||
|
|
7eb52d2837 | ||
|
|
eb63fece2f | ||
|
|
2d8af8947e | ||
|
|
2650182f47 | ||
|
|
572b97b0bb | ||
|
|
698705a820 | ||
|
|
debc525fa1 | ||
|
|
5576e2737a | ||
|
|
b40d5de69c | ||
|
|
b7ef7840f3 | ||
|
|
85924bb32e | ||
|
|
a97690fc72 | ||
|
|
02c638209e | ||
|
|
030611b729 | ||
|
|
335b72df03 | ||
|
|
3a7d53f3cf | ||
|
|
9676167aac | ||
|
|
1840a0b282 | ||
|
|
ace8aaa0f4 | ||
|
|
0c003c92a8 | ||
|
|
85fbf86d7b | ||
|
|
aa82027a17 | ||
|
|
55c592dd43 | ||
|
|
fc1abd1c11 | ||
|
|
e645ba84cf | ||
|
|
6c99816855 | ||
|
|
2149bfb707 | ||
|
|
d7971ba0e4 | ||
|
|
5c4cfaa0a7 | ||
|
|
bb9c9707aa | ||
|
|
6c8e001fee | ||
|
|
9c53c7ada7 | ||
|
|
f99b7b630d | ||
|
|
ea31da2455 | ||
|
|
4d7746baf3 | ||
|
|
31d5825a86 | ||
|
|
8287ef6781 | ||
|
|
5cb5305cf3 | ||
|
|
00ad57e393 | ||
|
|
09d5707a8a | ||
|
|
1e390269d4 | ||
|
|
bc49dfd27a | ||
|
|
27eedbc302 | ||
|
|
5f464b41e2 | ||
|
|
bcc1318d4b | ||
|
|
a0e03c9df4 | ||
|
|
6641dcafb6 | ||
|
|
d2945744f2 | ||
|
|
35bc716625 | ||
|
|
f39fd3d583 | ||
|
|
65887d9a56 | ||
|
|
e9224ab444 | ||
|
|
4d9a085687 | ||
|
|
4fe630431c | ||
|
|
c55dd5ed74 | ||
|
|
e4fa4b109a | ||
|
|
4b4528ee05 | ||
|
|
187a0caf9d | ||
|
|
b5a7a231f7 | ||
|
|
3907a5e3b2 | ||
|
|
b434b75b36 | ||
|
|
c70d176f35 | ||
|
|
9317237372 | ||
|
|
98434258d0 | ||
|
|
45ddb9caeb | ||
|
|
9bcf702a6e | ||
|
|
f68de86a17 | ||
|
|
c3c7587796 | ||
|
|
07bb7262d0 | ||
|
|
21befe583f | ||
|
|
a9d4a6291b | ||
|
|
ee6c9fabb7 | ||
|
|
102d1b9137 | ||
|
|
294861ba96 | ||
|
|
11b0efdf84 | ||
|
|
5486b68850 | ||
|
|
bdd8e34f63 | ||
|
|
6547437725 | ||
|
|
9662228f6a | ||
|
|
31a9b05c96 | ||
|
|
63b01fe8f9 | ||
|
|
7a4ed9d200 | ||
|
|
d5c651a5e5 | ||
|
|
cdba43cfa4 | ||
|
|
a123e232b9 | ||
|
|
601780acc1 | ||
|
|
7c3fee9e31 | ||
|
|
929de2b0de | ||
|
|
12e6ad326c | ||
|
|
00c8d1d241 | ||
|
|
af2472d85e | ||
|
|
3eb9101918 | ||
|
|
0a38a688f9 | ||
|
|
f4c2ea37bf | ||
|
|
915f907186 | ||
|
|
799509e145 | ||
|
|
b5a7197ae5 | ||
|
|
1b703349cf | ||
|
|
4a7179ff91 | ||
|
|
f97da4294a | ||
|
|
918c17bd88 | ||
|
|
8b71c6559b | ||
|
|
26641f3fb2 | ||
|
|
ebe118dc79 | ||
|
|
70e5b6f15b | ||
|
|
57e0fafd5c | ||
|
|
8439c8ba98 | ||
|
|
5c4e470d43 | ||
|
|
6605d15783 | ||
|
|
ac8db977b9 | ||
|
|
88b77ddaa9 | ||
|
|
fe4e9f9d97 | ||
|
|
8c6af09ae0 | ||
|
|
6f3e35bb3f | ||
|
|
174404c0f3 | ||
|
|
60c4030a4d | ||
|
|
ac810dc07a | ||
|
|
0cabedc526 | ||
|
|
5cd26c005b | ||
|
|
bd99b00413 | ||
|
|
9e2f9f7910 | ||
|
|
e87c77ed41 | ||
|
|
774bda13cd | ||
|
|
15b5f70338 | ||
|
|
7f48d5b33c | ||
|
|
b6968b6bd2 | ||
|
|
08b80302eb | ||
|
|
645626ebe8 | ||
|
|
d895c09c70 | ||
|
|
08623aa6a7 | ||
|
|
c898a26117 | ||
|
|
619adb0308 | ||
|
|
7691bebea5 | ||
|
|
3c4346728e | ||
|
|
18d37ac761 | ||
|
|
63d35f8f6d | ||
|
|
7dbe961b2d | ||
|
|
94c4daaf9e | ||
|
|
37ee9de902 | ||
|
|
83db98ad3b | ||
|
|
bd0ae6569f | ||
|
|
841a661071 | ||
|
|
7491d07666 | ||
|
|
335e349314 | ||
|
|
2a88d07b3a | ||
|
|
a887cde9f2 | ||
|
|
b5623b19d4 | ||
|
|
6b2861e086 | ||
|
|
d5138f7467 | ||
|
|
eac67b2816 | ||
|
|
ce10072824 | ||
|
|
dff54a6552 | ||
|
|
1940fb682c | ||
|
|
17eef5a3c2 | ||
|
|
9f1f21b810 | ||
|
|
a8e67d157e | ||
|
|
e870c7db45 | ||
|
|
6500f8c52c | ||
|
|
4d2f7d83af | ||
|
|
99945fcd04 | ||
|
|
0d952ae43d | ||
|
|
593677d2ff | ||
|
|
c69294c449 | ||
|
|
2a06c7758e | ||
|
|
7ee1ec91a2 | ||
|
|
233fb62bd8 | ||
|
|
6637c267a5 | ||
|
|
99233c44cc | ||
|
|
33528002b4 | ||
|
|
20542a37a8 | ||
|
|
5fd12451f9 | ||
|
|
ba939ccd6c | ||
|
|
3a5f354846 | ||
|
|
fcde6109b0 | ||
|
|
e3bd223dac | ||
|
|
6c8db6eae1 | ||
|
|
3ff0b9e0c9 | ||
|
|
464a942a95 | ||
|
|
d7a4a4a462 | ||
|
|
759b3f7d6d | ||
|
|
958b6c2e57 | ||
|
|
ab15d676d7 | ||
|
|
66761d7ecf | ||
|
|
3afad58a93 | ||
|
|
170e8b519e | ||
|
|
f8684f418a | ||
|
|
881bda7f59 | ||
|
|
9854deb626 | ||
|
|
d6814050dd | ||
|
|
252fc65558 | ||
|
|
8108c7ffaf | ||
|
|
ba9936a572 | ||
|
|
905b601178 | ||
|
|
63fb2d5a44 | ||
|
|
85a5fc0aeb | ||
|
|
4fba3e0b80 | ||
|
|
9d398d999c | ||
|
|
f47b2b52a5 | ||
|
|
fedb6191a1 | ||
|
|
5bf617ebde | ||
|
|
0b82e1cd5b | ||
|
|
9aef34a816 | ||
|
|
0ac6918a41 | ||
|
|
65ee5af78c | ||
|
|
c6fa291571 | ||
|
|
bce4307e9e | ||
|
|
96ad94ab41 | ||
|
|
a5b60217ce | ||
|
|
44fd6694eb | ||
|
|
e48db3a8b6 | ||
|
|
e637bdaf4e | ||
|
|
d558abbdb7 | ||
|
|
4aed0830e5 | ||
|
|
d2dda34b2a | ||
|
|
c3a10c135e | ||
|
|
92e4340732 | ||
|
|
7b22f2031f | ||
|
|
3b14582d6b | ||
|
|
274e1b3dc7 | ||
|
|
de58b0289d | ||
|
|
efea52a4f4 | ||
|
|
763bd36b60 | ||
|
|
0552dbd93c | ||
|
|
18c63ff3d8 | ||
|
|
e04ef56243 | ||
|
|
5d60484553 | ||
|
|
3c846e6f7b | ||
|
|
2850dc69fd | ||
|
|
94205c3a37 | ||
|
|
2ada34b229 | ||
|
|
db396da734 | ||
|
|
0262b4244c | ||
|
|
73ca767d06 | ||
|
|
3ec11c781b | ||
|
|
a79ff060d0 | ||
|
|
43991f8d2f | ||
|
|
6b82069e1a | ||
|
|
276b9a31cd | ||
|
|
5801fa39e9 | ||
|
|
f0ab1b02e6 | ||
|
|
36c28e02fd | ||
|
|
e1c3861832 | ||
|
|
ecfd881ac6 | ||
|
|
81b7335267 | ||
|
|
bb010c2253 | ||
|
|
03b6121194 | ||
|
|
3ef092332b | ||
|
|
540c19792f | ||
|
|
80d1c8206b | ||
|
|
d36faffeca | ||
|
|
7c8c9b94bc | ||
|
|
f5eeed7665 | ||
|
|
80cfd063e2 | ||
|
|
aa45f6586e | ||
|
|
0c80d21e01 | ||
|
|
375c88245a | ||
|
|
ea3430102c | ||
|
|
9de7199b88 | ||
|
|
ae07714927 | ||
|
|
0e41a3fad4 | ||
|
|
61e850ceb5 | ||
|
|
992b6b9fcc | ||
|
|
7b71344051 | ||
|
|
605362f89d | ||
|
|
fbbaa42ee5 | ||
|
|
099992ecae | ||
|
|
d78ae20e64 | ||
|
|
5c02d65ddb | ||
|
|
d36067cd35 | ||
|
|
f1b2134dd1 | ||
|
|
74cda80d3b | ||
|
|
9a3a848cc8 | ||
|
|
a1a4c2ada7 | ||
|
|
189dbf02b6 | ||
|
|
42ecd42ac0 | ||
|
|
a10f6a96d7 | ||
|
|
0d232a1422 | ||
|
|
285bffd2c6 | ||
|
|
61c233a08e | ||
|
|
d2d716483a | ||
|
|
f16033aafd | ||
|
|
ae5366a31d | ||
|
|
6b23cbc852 | ||
|
|
7f9bc9e863 | ||
|
|
13219cebcb | ||
|
|
93a6e5780e | ||
|
|
fe55e0d93d | ||
|
|
e1f0747e4c | ||
|
|
e37b67d013 | ||
|
|
ad18689d92 | ||
|
|
0f80b1058d | ||
|
|
0d48af3f36 | ||
|
|
4613644cce | ||
|
|
718e475613 | ||
|
|
aa5dd15352 | ||
|
|
5bff65c132 | ||
|
|
24bc09b79b | ||
|
|
37c17d5541 | ||
|
|
120948fa48 | ||
|
|
66e6f0c3cb | ||
|
|
f7447efa8c | ||
|
|
f4d36a58c2 | ||
|
|
6d1c3e1aec | ||
|
|
73cc0505f5 | ||
|
|
c75f5a1fd8 | ||
|
|
39d8880f2c | ||
|
|
5538ec7bd8 | ||
|
|
f101d6429b | ||
|
|
fe06fc85d3 | ||
|
|
f36a1eaa8b | ||
|
|
a64bdda9ae | ||
|
|
01d19b4b52 | ||
|
|
f0c1a01bc2 | ||
|
|
7be680d3f8 | ||
|
|
57dab1e1db | ||
|
|
21b3c890a1 | ||
|
|
fb0ec720a4 | ||
|
|
7971ed33d1 | ||
|
|
885835a655 | ||
|
|
4c64554808 | ||
|
|
548beeb6b1 | ||
|
|
e3066f9577 | ||
|
|
e391367488 | ||
|
|
18ddf2f7b5 | ||
|
|
f8ee5a0785 | ||
|
|
b467a3c877 | ||
|
|
f2d48e9019 | ||
|
|
5e314bf3e9 | ||
|
|
05ba26c7c8 | ||
|
|
87b72364a4 | ||
|
|
0e3ff1f970 | ||
|
|
ec3e74d7f4 | ||
|
|
62bda71c85 | ||
|
|
83e0939088 | ||
|
|
9798d96e37 | ||
|
|
6006dd933d | ||
|
|
ac2caf1088 | ||
|
|
8511e80f48 | ||
|
|
91bc3f1f92 | ||
|
|
8463b48f90 | ||
|
|
e3342a3cf6 | ||
|
|
524a8a42a4 | ||
|
|
7bf59b5bcd | ||
|
|
025f3e9596 | ||
|
|
8258edd8a5 | ||
|
|
8669ca219b | ||
|
|
71652690b6 | ||
|
|
37693d2812 | ||
|
|
8fbe200012 | ||
|
|
1a34a13e33 | ||
|
|
ef772b0049 | ||
|
|
6fcabbde08 | ||
|
|
14f290f8ab | ||
|
|
e2e09d5754 | ||
|
|
448a8d3845 | ||
|
|
514936beb8 | ||
|
|
f5c09d0bbf | ||
|
|
014f655c5f | ||
|
|
bf30dc3038 | ||
|
|
ef2ef07cbd | ||
|
|
1a4440080d | ||
|
|
ac0086a745 | ||
|
|
2494daaf68 | ||
|
|
9b404f9de6 | ||
|
|
5344b7dab8 | ||
|
|
0007a53b9c | ||
|
|
1dd05f44eb | ||
|
|
f6203bd5a8 | ||
|
|
03cf94ebe8 |
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
*.js text eol=lf
|
||||||
29
.github/ISSUE_TEMPLATE.md
vendored
Normal file
29
.github/ISSUE_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
**Bug report or feature request?**
|
||||||
|
|
||||||
|
<!-- Note: sub-optimal but correct code is not a bug -->
|
||||||
|
|
||||||
|
**ES5 or ES6+ input?**
|
||||||
|
|
||||||
|
<!-- Note: for ES6 see: https://github.com/mishoo/UglifyJS2/tree/harmony#harmony -->
|
||||||
|
|
||||||
|
**Uglify version (`uglifyjs -V`)**
|
||||||
|
|
||||||
|
**JavaScript input**
|
||||||
|
|
||||||
|
<!--
|
||||||
|
A complete parsable JS program exhibiting the issue with
|
||||||
|
UglifyJS alone - without third party tools or libraries.
|
||||||
|
Ideally the input should be as small as possible.
|
||||||
|
Post a link to a gist if necessary.
|
||||||
|
|
||||||
|
Issues without a reproducible test case will be closed.
|
||||||
|
-->
|
||||||
|
|
||||||
|
**The `uglifyjs` CLI command executed or `minify()` options used.**
|
||||||
|
|
||||||
|
**JavaScript output or error produced.**
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Note: `uglify-js` only supports ES5.
|
||||||
|
Those wishing to minify ES6 should use `uglify-es`.
|
||||||
|
-->
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,2 +1,3 @@
|
|||||||
|
/node_modules/
|
||||||
|
/npm-debug.log
|
||||||
tmp/
|
tmp/
|
||||||
node_modules/
|
|
||||||
|
|||||||
14
.travis.yml
14
.travis.yml
@@ -1,6 +1,14 @@
|
|||||||
language: node_js
|
language: node_js
|
||||||
node_js:
|
node_js:
|
||||||
- "0.4"
|
|
||||||
- "0.8"
|
|
||||||
- "0.10"
|
- "0.10"
|
||||||
- "0.11"
|
- "0.12"
|
||||||
|
- "4"
|
||||||
|
- "6"
|
||||||
|
- "8"
|
||||||
|
env:
|
||||||
|
- UGLIFYJS_TEST_ALL=1
|
||||||
|
matrix:
|
||||||
|
fast_finish: true
|
||||||
|
sudo: false
|
||||||
|
cache:
|
||||||
|
directories: tmp
|
||||||
|
|||||||
61
CONTRIBUTING.md
Normal file
61
CONTRIBUTING.md
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
Contributing
|
||||||
|
============
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
Every new feature and API change should be accompanied by a README additon.
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
All features and bugs should have tests that verify the fix. You can run all
|
||||||
|
tests using `npm test`.
|
||||||
|
|
||||||
|
The most common type of test are tests that verify input and output of the
|
||||||
|
Uglify transforms. These tests exist in `test/compress`. New tests can be added
|
||||||
|
either to an existing file or in a new file `issue-xxx.js`.
|
||||||
|
|
||||||
|
Tests that cannot be expressed as a simple AST can be found in `test/mocha`.
|
||||||
|
|
||||||
|
## Code style
|
||||||
|
|
||||||
|
- File encoding must be `UTF-8`.
|
||||||
|
- `LF` is always used as a line ending.
|
||||||
|
- Statements end with semicolons.
|
||||||
|
- Indentation uses 4 spaces, switch `case` 2 spaces.
|
||||||
|
- Identifiers use `snake_case`.
|
||||||
|
- Strings use double quotes (`"`).
|
||||||
|
- Use a trailing comma for multiline array and object literals to minimize diffs.
|
||||||
|
- The Uglify code only uses ES5, even in the `harmony` branch.
|
||||||
|
- Line length should be at most 80 cols, except when it is easier to read a
|
||||||
|
longer line.
|
||||||
|
- If both sides of a comparison are of the same type, `==` and `!=` are used.
|
||||||
|
- Multiline conditions place `&&` and `||` first on the line.
|
||||||
|
|
||||||
|
**Example feature**
|
||||||
|
|
||||||
|
```js
|
||||||
|
OPT(AST_Debugger, function(self, compressor) {
|
||||||
|
if (compressor.option("drop_debugger"))
|
||||||
|
return make_node(AST_EmptyStatement, self);
|
||||||
|
return self;
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
**Example test case**
|
||||||
|
|
||||||
|
```js
|
||||||
|
drop_debugger: {
|
||||||
|
options = {
|
||||||
|
drop_debugger: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
debugger;
|
||||||
|
if (foo) debugger;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
if (foo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
2
LICENSE
2
LICENSE
@@ -1,6 +1,6 @@
|
|||||||
UglifyJS is released under the BSD license:
|
UglifyJS is released under the BSD license:
|
||||||
|
|
||||||
Copyright 2012-2013 (c) Mihai Bazon <mihai.bazon@gmail.com>
|
Copyright 2012-2018 (c) Mihai Bazon <mihai.bazon@gmail.com>
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
modification, are permitted provided that the following conditions
|
modification, are permitted provided that the following conditions
|
||||||
|
|||||||
20
appveyor.yml
Normal file
20
appveyor.yml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
environment:
|
||||||
|
matrix:
|
||||||
|
- nodejs_version: "0.10"
|
||||||
|
- nodejs_version: "0.12"
|
||||||
|
- nodejs_version: "4"
|
||||||
|
- nodejs_version: "6"
|
||||||
|
- nodejs_version: "8"
|
||||||
|
install:
|
||||||
|
- ps: Install-Product node $env:nodejs_version
|
||||||
|
- set UGLIFYJS_TEST_ALL=1
|
||||||
|
- npm install
|
||||||
|
build: off
|
||||||
|
cache:
|
||||||
|
- tmp
|
||||||
|
matrix:
|
||||||
|
fast_finish: true
|
||||||
|
test_script:
|
||||||
|
- node --version
|
||||||
|
- npm --version
|
||||||
|
- npm test
|
||||||
816
bin/uglifyjs
816
bin/uglifyjs
@@ -3,443 +3,421 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var UglifyJS = require("../tools/node");
|
require("../tools/exit");
|
||||||
var sys = require("util");
|
|
||||||
var optimist = require("optimist");
|
|
||||||
var fs = require("fs");
|
var fs = require("fs");
|
||||||
|
var info = require("../package.json");
|
||||||
var path = require("path");
|
var path = require("path");
|
||||||
var async = require("async");
|
var program = require("commander");
|
||||||
var acorn;
|
var UglifyJS = require("../tools/node");
|
||||||
var ARGS = optimist
|
|
||||||
.usage("$0 input1.js [input2.js ...] [options]\n\
|
|
||||||
Use a single dash to read input from the standard input.\
|
|
||||||
\n\n\
|
|
||||||
NOTE: by default there is no mangling/compression.\n\
|
|
||||||
Without [options] it will simply parse input files and dump the AST\n\
|
|
||||||
with whitespace and comments discarded. To achieve compression and\n\
|
|
||||||
mangling you need to use `-c` and `-m`.\
|
|
||||||
")
|
|
||||||
.describe("source-map", "Specify an output file where to generate source map.")
|
|
||||||
.describe("source-map-root", "The path to the original source to be included in the source map.")
|
|
||||||
.describe("source-map-url", "The path to the source map to be added in //# sourceMappingURL. Defaults to the value passed with --source-map.")
|
|
||||||
.describe("in-source-map", "Input source map, useful if you're compressing JS that was generated from some other original code.")
|
|
||||||
.describe("screw-ie8", "Pass this flag if you don't care about full compliance with Internet Explorer 6-8 quirks (by default UglifyJS will try to be IE-proof).")
|
|
||||||
.describe("expr", "Parse a single expression, rather than a program (for parsing JSON)")
|
|
||||||
.describe("p", "Skip prefix for original filenames that appear in source maps. \
|
|
||||||
For example -p 3 will drop 3 directories from file names and ensure they are relative paths. \
|
|
||||||
You can also specify -p relative, which will make UglifyJS figure out itself the relative paths between original sources, \
|
|
||||||
the source map and the output file.")
|
|
||||||
.describe("o", "Output file (default STDOUT).")
|
|
||||||
.describe("b", "Beautify output/specify output options.")
|
|
||||||
.describe("m", "Mangle names/pass mangler options.")
|
|
||||||
.describe("r", "Reserved names to exclude from mangling.")
|
|
||||||
.describe("c", "Enable compressor/pass compressor options. \
|
|
||||||
Pass options like -c hoist_vars=false,if_return=false. \
|
|
||||||
Use -c with no argument to use the default compression options.")
|
|
||||||
.describe("d", "Global definitions")
|
|
||||||
.describe("e", "Embed everything in a big function, with a configurable parameter/argument list.")
|
|
||||||
|
|
||||||
.describe("comments", "Preserve copyright comments in the output. \
|
var skip_keys = [ "cname", "inlined", "parent_scope", "scope", "uses_eval", "uses_with" ];
|
||||||
By default this works like Google Closure, keeping JSDoc-style comments that contain \"@license\" or \"@preserve\". \
|
var files = {};
|
||||||
You can optionally pass one of the following arguments to this flag:\n\
|
var options = {
|
||||||
- \"all\" to keep all comments\n\
|
compress: false,
|
||||||
- a valid JS regexp (needs to start with a slash) to keep only comments that match.\n\
|
mangle: false
|
||||||
\
|
|
||||||
Note that currently not *all* comments can be kept when compression is on, \
|
|
||||||
because of dead code removal or cascading statements into sequences.")
|
|
||||||
|
|
||||||
.describe("preamble", "Preamble to prepend to the output. You can use this to insert a \
|
|
||||||
comment, for example for licensing information. This will not be \
|
|
||||||
parsed, but the source map will adjust for its presence.")
|
|
||||||
|
|
||||||
.describe("stats", "Display operations run time on STDERR.")
|
|
||||||
.describe("acorn", "Use Acorn for parsing.")
|
|
||||||
.describe("spidermonkey", "Assume input files are SpiderMonkey AST format (as JSON).")
|
|
||||||
.describe("self", "Build itself (UglifyJS2) as a library (implies --wrap=UglifyJS --export-all)")
|
|
||||||
.describe("wrap", "Embed everything in a big function, making the “exports” and “global” variables available. \
|
|
||||||
You need to pass an argument to this option to specify the name that your module will take when included in, say, a browser.")
|
|
||||||
.describe("export-all", "Only used when --wrap, this tells UglifyJS to add code to automatically export all globals.")
|
|
||||||
.describe("lint", "Display some scope warnings")
|
|
||||||
.describe("v", "Verbose")
|
|
||||||
.describe("V", "Print version number and exit.")
|
|
||||||
.describe("noerr", "Don't throw an error for unknown options in -c, -b or -m.")
|
|
||||||
|
|
||||||
.alias("p", "prefix")
|
|
||||||
.alias("o", "output")
|
|
||||||
.alias("v", "verbose")
|
|
||||||
.alias("b", "beautify")
|
|
||||||
.alias("m", "mangle")
|
|
||||||
.alias("c", "compress")
|
|
||||||
.alias("d", "define")
|
|
||||||
.alias("r", "reserved")
|
|
||||||
.alias("V", "version")
|
|
||||||
.alias("e", "enclose")
|
|
||||||
|
|
||||||
.string("source-map")
|
|
||||||
.string("source-map-root")
|
|
||||||
.string("source-map-url")
|
|
||||||
.string("b")
|
|
||||||
.string("m")
|
|
||||||
.string("c")
|
|
||||||
.string("d")
|
|
||||||
.string("e")
|
|
||||||
.string("comments")
|
|
||||||
.string("wrap")
|
|
||||||
.string("p")
|
|
||||||
|
|
||||||
.boolean("expr")
|
|
||||||
.boolean("screw-ie8")
|
|
||||||
.boolean("export-all")
|
|
||||||
.boolean("self")
|
|
||||||
.boolean("v")
|
|
||||||
.boolean("stats")
|
|
||||||
.boolean("acorn")
|
|
||||||
.boolean("spidermonkey")
|
|
||||||
.boolean("lint")
|
|
||||||
.boolean("V")
|
|
||||||
.boolean("noerr")
|
|
||||||
|
|
||||||
.wrap(80)
|
|
||||||
|
|
||||||
.argv
|
|
||||||
;
|
|
||||||
|
|
||||||
normalize(ARGS);
|
|
||||||
|
|
||||||
if (ARGS.noerr) {
|
|
||||||
UglifyJS.DefaultsError.croak = function(msg, defs) {
|
|
||||||
sys.error("WARN: " + msg);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ARGS.version || ARGS.V) {
|
|
||||||
var json = require("../package.json");
|
|
||||||
sys.puts(json.name + ' ' + json.version);
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ARGS.ast_help) {
|
|
||||||
var desc = UglifyJS.describe_ast();
|
|
||||||
sys.puts(typeof desc == "string" ? desc : JSON.stringify(desc, null, 2));
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ARGS.h || ARGS.help) {
|
|
||||||
sys.puts(optimist.help());
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ARGS.acorn) {
|
|
||||||
acorn = require("acorn");
|
|
||||||
}
|
|
||||||
|
|
||||||
var COMPRESS = getOptions("c", true);
|
|
||||||
var MANGLE = getOptions("m", true);
|
|
||||||
var BEAUTIFY = getOptions("b", true);
|
|
||||||
|
|
||||||
if (ARGS.d) {
|
|
||||||
if (COMPRESS) COMPRESS.global_defs = getOptions("d");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ARGS.r) {
|
|
||||||
if (MANGLE) MANGLE.except = ARGS.r.replace(/^\s+|\s+$/g).split(/\s*,+\s*/);
|
|
||||||
}
|
|
||||||
|
|
||||||
var OUTPUT_OPTIONS = {
|
|
||||||
beautify: BEAUTIFY ? true : false,
|
|
||||||
preamble: ARGS.preamble || null,
|
|
||||||
};
|
};
|
||||||
|
program.version(info.name + " " + info.version);
|
||||||
if (ARGS.screw_ie8) {
|
program.parseArgv = program.parse;
|
||||||
if (COMPRESS) COMPRESS.screw_ie8 = true;
|
program.parse = undefined;
|
||||||
if (MANGLE) MANGLE.screw_ie8 = true;
|
if (process.argv.indexOf("ast") >= 0) program.helpInformation = UglifyJS.describe_ast;
|
||||||
OUTPUT_OPTIONS.screw_ie8 = true;
|
else if (process.argv.indexOf("options") >= 0) program.helpInformation = function() {
|
||||||
|
var text = [];
|
||||||
|
var options = UglifyJS.default_options();
|
||||||
|
for (var option in options) {
|
||||||
|
text.push("--" + (option == "output" ? "beautify" : option == "sourceMap" ? "source-map" : option) + " options:");
|
||||||
|
text.push(format_object(options[option]));
|
||||||
|
text.push("");
|
||||||
|
}
|
||||||
|
return text.join("\n");
|
||||||
|
};
|
||||||
|
program.option("-p, --parse <options>", "Specify parser options.", parse_js());
|
||||||
|
program.option("-c, --compress [options]", "Enable compressor/specify compressor options.", parse_js());
|
||||||
|
program.option("-m, --mangle [options]", "Mangle names/specify mangler options.", parse_js());
|
||||||
|
program.option("--mangle-props [options]", "Mangle properties/specify mangler options.", parse_js());
|
||||||
|
program.option("-b, --beautify [options]", "Beautify output/specify output options.", parse_js());
|
||||||
|
program.option("-o, --output <file>", "Output file (default STDOUT).");
|
||||||
|
program.option("--comments [filter]", "Preserve copyright comments in the output.");
|
||||||
|
program.option("--config-file <file>", "Read minify() options from JSON file.");
|
||||||
|
program.option("-d, --define <expr>[=value]", "Global definitions.", parse_js("define"));
|
||||||
|
program.option("--ie8", "Support non-standard Internet Explorer 8.");
|
||||||
|
program.option("--keep-fnames", "Do not mangle/drop function names. Useful for code relying on Function.prototype.name.");
|
||||||
|
program.option("--name-cache <file>", "File to hold mangled name mappings.");
|
||||||
|
program.option("--rename", "Force symbol expansion.");
|
||||||
|
program.option("--no-rename", "Disable symbol expansion.");
|
||||||
|
program.option("--self", "Build UglifyJS as a library (implies --wrap UglifyJS)");
|
||||||
|
program.option("--source-map [options]", "Enable source map/specify source map options.", parse_source_map());
|
||||||
|
program.option("--timings", "Display operations run time on STDERR.")
|
||||||
|
program.option("--toplevel", "Compress and/or mangle variables in toplevel scope.");
|
||||||
|
program.option("--verbose", "Print diagnostic messages.");
|
||||||
|
program.option("--warn", "Print warning messages.");
|
||||||
|
program.option("--wrap <name>", "Embed everything as a function with “exports” corresponding to “name” globally.");
|
||||||
|
program.arguments("[files...]").parseArgv(process.argv);
|
||||||
|
if (program.configFile) {
|
||||||
|
options = JSON.parse(read_file(program.configFile));
|
||||||
}
|
}
|
||||||
|
if (!program.output && program.sourceMap && program.sourceMap.url != "inline") {
|
||||||
if (BEAUTIFY)
|
fatal("ERROR: cannot write source map to STDOUT");
|
||||||
UglifyJS.merge(OUTPUT_OPTIONS, BEAUTIFY);
|
|
||||||
|
|
||||||
if (ARGS.comments) {
|
|
||||||
if (/^\//.test(ARGS.comments)) {
|
|
||||||
OUTPUT_OPTIONS.comments = new Function("return(" + ARGS.comments + ")")();
|
|
||||||
} else if (ARGS.comments == "all") {
|
|
||||||
OUTPUT_OPTIONS.comments = true;
|
|
||||||
} else {
|
|
||||||
OUTPUT_OPTIONS.comments = function(node, comment) {
|
|
||||||
var text = comment.value;
|
|
||||||
var type = comment.type;
|
|
||||||
if (type == "comment2") {
|
|
||||||
// multiline comment
|
|
||||||
return /@preserve|@license|@cc_on/i.test(text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
[
|
||||||
var files = ARGS._.slice();
|
"compress",
|
||||||
|
"ie8",
|
||||||
if (ARGS.self) {
|
"mangle",
|
||||||
if (files.length > 0) {
|
"sourceMap",
|
||||||
sys.error("WARN: Ignoring input files since --self was passed");
|
"toplevel",
|
||||||
}
|
"wrap"
|
||||||
files = UglifyJS.FILES;
|
].forEach(function(name) {
|
||||||
if (!ARGS.wrap) ARGS.wrap = "UglifyJS";
|
if (name in program) {
|
||||||
ARGS.export_all = true;
|
options[name] = program[name];
|
||||||
}
|
|
||||||
|
|
||||||
var ORIG_MAP = ARGS.in_source_map;
|
|
||||||
|
|
||||||
if (ORIG_MAP) {
|
|
||||||
ORIG_MAP = JSON.parse(fs.readFileSync(ORIG_MAP));
|
|
||||||
if (files.length == 0) {
|
|
||||||
sys.error("INFO: Using file from the input source map: " + ORIG_MAP.file);
|
|
||||||
files = [ ORIG_MAP.file ];
|
|
||||||
}
|
|
||||||
if (ARGS.source_map_root == null) {
|
|
||||||
ARGS.source_map_root = ORIG_MAP.sourceRoot;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (files.length == 0) {
|
|
||||||
files = [ "-" ];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (files.indexOf("-") >= 0 && ARGS.source_map) {
|
|
||||||
sys.error("ERROR: Source map doesn't work with input from STDIN");
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (files.filter(function(el){ return el == "-" }).length > 1) {
|
|
||||||
sys.error("ERROR: Can read a single file from STDIN (two or more dashes specified)");
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
var STATS = {};
|
|
||||||
var OUTPUT_FILE = ARGS.o;
|
|
||||||
var TOPLEVEL = null;
|
|
||||||
var P_RELATIVE = ARGS.p && ARGS.p == "relative";
|
|
||||||
|
|
||||||
var SOURCE_MAP = ARGS.source_map ? UglifyJS.SourceMap({
|
|
||||||
file: P_RELATIVE ? path.relative(path.dirname(ARGS.source_map), OUTPUT_FILE) : OUTPUT_FILE,
|
|
||||||
root: ARGS.source_map_root,
|
|
||||||
orig: ORIG_MAP,
|
|
||||||
}) : null;
|
|
||||||
|
|
||||||
OUTPUT_OPTIONS.source_map = SOURCE_MAP;
|
|
||||||
|
|
||||||
try {
|
|
||||||
var output = UglifyJS.OutputStream(OUTPUT_OPTIONS);
|
|
||||||
var compressor = COMPRESS && UglifyJS.Compressor(COMPRESS);
|
|
||||||
} catch(ex) {
|
|
||||||
if (ex instanceof UglifyJS.DefaultsError) {
|
|
||||||
sys.error(ex.msg);
|
|
||||||
sys.error("Supported options:");
|
|
||||||
sys.error(sys.inspect(ex.defs));
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async.eachLimit(files, 1, function (file, cb) {
|
|
||||||
read_whole_file(file, function (err, code) {
|
|
||||||
if (err) {
|
|
||||||
sys.error("ERROR: can't read file: " + file);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
if (ARGS.p != null) {
|
|
||||||
if (P_RELATIVE) {
|
|
||||||
file = path.relative(path.dirname(ARGS.source_map), file);
|
|
||||||
} else {
|
|
||||||
var p = parseInt(ARGS.p, 10);
|
|
||||||
if (!isNaN(p)) {
|
|
||||||
file = file.replace(/^\/+/, "").split(/\/+/).slice(ARGS.p).join("/");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
time_it("parse", function(){
|
|
||||||
if (ARGS.spidermonkey) {
|
|
||||||
var program = JSON.parse(code);
|
|
||||||
if (!TOPLEVEL) TOPLEVEL = program;
|
|
||||||
else TOPLEVEL.body = TOPLEVEL.body.concat(program.body);
|
|
||||||
}
|
|
||||||
else if (ARGS.acorn) {
|
|
||||||
TOPLEVEL = acorn.parse(code, {
|
|
||||||
locations : true,
|
|
||||||
sourceFile : file,
|
|
||||||
program : TOPLEVEL
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
try {
|
|
||||||
TOPLEVEL = UglifyJS.parse(code, {
|
|
||||||
filename : file,
|
|
||||||
toplevel : TOPLEVEL,
|
|
||||||
expression : ARGS.expr,
|
|
||||||
});
|
|
||||||
} catch(ex) {
|
|
||||||
if (ex instanceof UglifyJS.JS_Parse_Error) {
|
|
||||||
sys.error("Parse error at " + file + ":" + ex.line + "," + ex.col);
|
|
||||||
sys.error(ex.message);
|
|
||||||
sys.error(ex.stack);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
throw ex;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
});
|
|
||||||
cb();
|
|
||||||
});
|
|
||||||
}, function () {
|
|
||||||
if (ARGS.acorn || ARGS.spidermonkey) time_it("convert_ast", function(){
|
|
||||||
TOPLEVEL = UglifyJS.AST_Node.from_mozilla_ast(TOPLEVEL);
|
|
||||||
});
|
|
||||||
|
|
||||||
if (ARGS.wrap) {
|
|
||||||
TOPLEVEL = TOPLEVEL.wrap_commonjs(ARGS.wrap, ARGS.export_all);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ARGS.enclose) {
|
|
||||||
var arg_parameter_list = ARGS.enclose;
|
|
||||||
if (arg_parameter_list === true) {
|
|
||||||
arg_parameter_list = [];
|
|
||||||
}
|
|
||||||
else if (!(arg_parameter_list instanceof Array)) {
|
|
||||||
arg_parameter_list = [arg_parameter_list];
|
|
||||||
}
|
|
||||||
TOPLEVEL = TOPLEVEL.wrap_enclose(arg_parameter_list);
|
|
||||||
}
|
|
||||||
|
|
||||||
var SCOPE_IS_NEEDED = COMPRESS || MANGLE || ARGS.lint;
|
|
||||||
|
|
||||||
if (SCOPE_IS_NEEDED) {
|
|
||||||
time_it("scope", function(){
|
|
||||||
TOPLEVEL.figure_out_scope({ screw_ie8: ARGS.screw_ie8 });
|
|
||||||
if (ARGS.lint) {
|
|
||||||
TOPLEVEL.scope_warnings();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (COMPRESS) {
|
|
||||||
time_it("squeeze", function(){
|
|
||||||
TOPLEVEL = TOPLEVEL.transform(compressor);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SCOPE_IS_NEEDED) {
|
|
||||||
time_it("scope", function(){
|
|
||||||
TOPLEVEL.figure_out_scope({ screw_ie8: ARGS.screw_ie8 });
|
|
||||||
if (MANGLE) {
|
|
||||||
TOPLEVEL.compute_char_frequency(MANGLE);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (MANGLE) time_it("mangle", function(){
|
|
||||||
TOPLEVEL.mangle_names(MANGLE);
|
|
||||||
});
|
|
||||||
time_it("generate", function(){
|
|
||||||
TOPLEVEL.print(output);
|
|
||||||
});
|
|
||||||
|
|
||||||
output = output.get();
|
|
||||||
|
|
||||||
if (SOURCE_MAP) {
|
|
||||||
fs.writeFileSync(ARGS.source_map, SOURCE_MAP, "utf8");
|
|
||||||
var source_map_url = ARGS.source_map_url || (
|
|
||||||
P_RELATIVE
|
|
||||||
? path.relative(path.dirname(OUTPUT_FILE), ARGS.source_map)
|
|
||||||
: ARGS.source_map
|
|
||||||
);
|
|
||||||
output += "\n//# sourceMappingURL=" + source_map_url;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (OUTPUT_FILE) {
|
|
||||||
fs.writeFileSync(OUTPUT_FILE, output, "utf8");
|
|
||||||
} else {
|
|
||||||
sys.print(output);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ARGS.stats) {
|
|
||||||
sys.error(UglifyJS.string_template("Timing information (compressed {count} files):", {
|
|
||||||
count: files.length
|
|
||||||
}));
|
|
||||||
for (var i in STATS) if (STATS.hasOwnProperty(i)) {
|
|
||||||
sys.error(UglifyJS.string_template("- {name}: {time}s", {
|
|
||||||
name: i,
|
|
||||||
time: (STATS[i] / 1000).toFixed(3)
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
if (program.beautify) {
|
||||||
/* -----[ functions ]----- */
|
options.output = typeof program.beautify == "object" ? program.beautify : {};
|
||||||
|
if (!("beautify" in options.output)) {
|
||||||
function normalize(o) {
|
options.output.beautify = true;
|
||||||
for (var i in o) if (o.hasOwnProperty(i) && /-/.test(i)) {
|
|
||||||
o[i.replace(/-/g, "_")] = o[i];
|
|
||||||
delete o[i];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (program.comments) {
|
||||||
|
if (typeof options.output != "object") options.output = {};
|
||||||
|
options.output.comments = typeof program.comments == "string" ? program.comments : "some";
|
||||||
|
}
|
||||||
|
if (program.define) {
|
||||||
|
if (typeof options.compress != "object") options.compress = {};
|
||||||
|
if (typeof options.compress.global_defs != "object") options.compress.global_defs = {};
|
||||||
|
for (var expr in program.define) {
|
||||||
|
options.compress.global_defs[expr] = program.define[expr];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (program.keepFnames) {
|
||||||
|
options.keep_fnames = true;
|
||||||
|
}
|
||||||
|
if (program.mangleProps) {
|
||||||
|
if (program.mangleProps.domprops) {
|
||||||
|
delete program.mangleProps.domprops;
|
||||||
|
} else {
|
||||||
|
if (typeof program.mangleProps != "object") program.mangleProps = {};
|
||||||
|
if (!Array.isArray(program.mangleProps.reserved)) program.mangleProps.reserved = [];
|
||||||
|
require("../tools/domprops").forEach(function(name) {
|
||||||
|
UglifyJS._push_uniq(program.mangleProps.reserved, name);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (typeof options.mangle != "object") options.mangle = {};
|
||||||
|
options.mangle.properties = program.mangleProps;
|
||||||
|
}
|
||||||
|
if (program.nameCache) {
|
||||||
|
options.nameCache = JSON.parse(read_file(program.nameCache, "{}"));
|
||||||
|
}
|
||||||
|
if (program.output == "ast") {
|
||||||
|
options.output = {
|
||||||
|
ast: true,
|
||||||
|
code: false
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (program.parse) {
|
||||||
|
if (!program.parse.acorn && !program.parse.spidermonkey) {
|
||||||
|
options.parse = program.parse;
|
||||||
|
} else if (program.sourceMap && program.sourceMap.content == "inline") {
|
||||||
|
fatal("ERROR: inline source map only works with built-in parser");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (~program.rawArgs.indexOf("--rename")) {
|
||||||
|
options.rename = true;
|
||||||
|
} else if (!program.rename) {
|
||||||
|
options.rename = false;
|
||||||
|
}
|
||||||
|
var convert_path = function(name) {
|
||||||
|
return name;
|
||||||
|
};
|
||||||
|
if (typeof program.sourceMap == "object" && "base" in program.sourceMap) {
|
||||||
|
convert_path = function() {
|
||||||
|
var base = program.sourceMap.base;
|
||||||
|
delete options.sourceMap.base;
|
||||||
|
return function(name) {
|
||||||
|
return path.relative(base, name);
|
||||||
|
};
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
if (program.verbose) {
|
||||||
|
options.warnings = "verbose";
|
||||||
|
} else if (program.warn) {
|
||||||
|
options.warnings = true;
|
||||||
|
}
|
||||||
|
if (program.self) {
|
||||||
|
if (program.args.length) {
|
||||||
|
print_error("WARN: Ignoring input files since --self was passed");
|
||||||
|
}
|
||||||
|
if (!options.wrap) options.wrap = "UglifyJS";
|
||||||
|
simple_glob(UglifyJS.FILES).forEach(function(name) {
|
||||||
|
files[convert_path(name)] = read_file(name);
|
||||||
|
});
|
||||||
|
run();
|
||||||
|
} else if (program.args.length) {
|
||||||
|
simple_glob(program.args).forEach(function(name) {
|
||||||
|
files[convert_path(name)] = read_file(name);
|
||||||
|
});
|
||||||
|
run();
|
||||||
|
} else {
|
||||||
|
var chunks = [];
|
||||||
|
process.stdin.setEncoding("utf8");
|
||||||
|
process.stdin.on("data", function(chunk) {
|
||||||
|
chunks.push(chunk);
|
||||||
|
}).on("end", function() {
|
||||||
|
files = [ chunks.join("") ];
|
||||||
|
run();
|
||||||
|
});
|
||||||
|
process.stdin.resume();
|
||||||
|
}
|
||||||
|
|
||||||
function getOptions(x, constants) {
|
function convert_ast(fn) {
|
||||||
x = ARGS[x];
|
return UglifyJS.AST_Node.from_mozilla_ast(Object.keys(files).reduce(fn, null));
|
||||||
if (!x) return null;
|
}
|
||||||
var ret = {};
|
|
||||||
if (x !== true) {
|
function run() {
|
||||||
var ast;
|
UglifyJS.AST_Node.warn_function = function(msg) {
|
||||||
try {
|
print_error("WARN: " + msg);
|
||||||
ast = UglifyJS.parse(x, { expression: true });
|
};
|
||||||
} catch(ex) {
|
if (program.timings) options.timings = true;
|
||||||
if (ex instanceof UglifyJS.JS_Parse_Error) {
|
try {
|
||||||
sys.error("Error parsing arguments in: " + x);
|
if (program.parse) {
|
||||||
process.exit(1);
|
if (program.parse.acorn) {
|
||||||
|
files = convert_ast(function(toplevel, name) {
|
||||||
|
return require("acorn").parse(files[name], {
|
||||||
|
locations: true,
|
||||||
|
program: toplevel,
|
||||||
|
sourceFile: name
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} else if (program.parse.spidermonkey) {
|
||||||
|
files = convert_ast(function(toplevel, name) {
|
||||||
|
var obj = JSON.parse(files[name]);
|
||||||
|
if (!toplevel) return obj;
|
||||||
|
toplevel.body = toplevel.body.concat(obj.body);
|
||||||
|
return toplevel;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ast.walk(new UglifyJS.TreeWalker(function(node){
|
} catch (ex) {
|
||||||
if (node instanceof UglifyJS.AST_Seq) return; // descend
|
fatal(ex);
|
||||||
if (node instanceof UglifyJS.AST_Assign) {
|
|
||||||
var name = node.left.print_to_string({ beautify: false }).replace(/-/g, "_");
|
|
||||||
var value = node.right;
|
|
||||||
if (constants)
|
|
||||||
value = new Function("return (" + value.print_to_string() + ")")();
|
|
||||||
ret[name] = value;
|
|
||||||
return true; // no descend
|
|
||||||
}
|
|
||||||
if (node instanceof UglifyJS.AST_Symbol || node instanceof UglifyJS.AST_Binary) {
|
|
||||||
var name = node.print_to_string({ beautify: false }).replace(/-/g, "_");
|
|
||||||
ret[name] = true;
|
|
||||||
return true; // no descend
|
|
||||||
}
|
|
||||||
sys.error(node.TYPE)
|
|
||||||
sys.error("Error parsing arguments in: " + x);
|
|
||||||
process.exit(1);
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
return ret;
|
var result = UglifyJS.minify(files, options);
|
||||||
}
|
if (result.error) {
|
||||||
|
var ex = result.error;
|
||||||
function read_whole_file(filename, cb) {
|
if (ex.name == "SyntaxError") {
|
||||||
if (filename == "-") {
|
print_error("Parse error at " + ex.filename + ":" + ex.line + "," + ex.col);
|
||||||
var chunks = [];
|
var col = ex.col;
|
||||||
process.stdin.setEncoding('utf-8');
|
var lines = files[ex.filename].split(/\r?\n/);
|
||||||
process.stdin.on('data', function (chunk) {
|
var line = lines[ex.line - 1];
|
||||||
chunks.push(chunk);
|
if (!line && !col) {
|
||||||
}).on('end', function () {
|
line = lines[ex.line - 2];
|
||||||
cb(null, chunks.join(""));
|
col = line.length;
|
||||||
});
|
}
|
||||||
process.openStdin();
|
if (line) {
|
||||||
|
var limit = 70;
|
||||||
|
if (col > limit) {
|
||||||
|
line = line.slice(col - limit);
|
||||||
|
col = limit;
|
||||||
|
}
|
||||||
|
print_error(line.slice(0, 80));
|
||||||
|
print_error(line.slice(0, col).replace(/\S/g, " ") + "^");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ex.defs) {
|
||||||
|
print_error("Supported options:");
|
||||||
|
print_error(format_object(ex.defs));
|
||||||
|
}
|
||||||
|
fatal(ex);
|
||||||
|
} else if (program.output == "ast") {
|
||||||
|
if (!options.compress && !options.mangle) {
|
||||||
|
result.ast.figure_out_scope({});
|
||||||
|
}
|
||||||
|
print(JSON.stringify(result.ast, function(key, value) {
|
||||||
|
if (value) switch (key) {
|
||||||
|
case "thedef":
|
||||||
|
return symdef(value);
|
||||||
|
case "enclosed":
|
||||||
|
return value.length ? value.map(symdef) : undefined;
|
||||||
|
case "variables":
|
||||||
|
case "functions":
|
||||||
|
case "globals":
|
||||||
|
return value.size() ? value.map(symdef) : undefined;
|
||||||
|
}
|
||||||
|
if (skip_key(key)) return;
|
||||||
|
if (value instanceof UglifyJS.AST_Token) return;
|
||||||
|
if (value instanceof UglifyJS.Dictionary) return;
|
||||||
|
if (value instanceof UglifyJS.AST_Node) {
|
||||||
|
var result = {
|
||||||
|
_class: "AST_" + value.TYPE
|
||||||
|
};
|
||||||
|
value.CTOR.PROPS.forEach(function(prop) {
|
||||||
|
result[prop] = value[prop];
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}, 2));
|
||||||
|
} else if (program.output == "spidermonkey") {
|
||||||
|
print(JSON.stringify(UglifyJS.minify(result.code, {
|
||||||
|
compress: false,
|
||||||
|
mangle: false,
|
||||||
|
output: {
|
||||||
|
ast: true,
|
||||||
|
code: false
|
||||||
|
}
|
||||||
|
}).ast.to_mozilla_ast(), null, 2));
|
||||||
|
} else if (program.output) {
|
||||||
|
fs.writeFileSync(program.output, result.code);
|
||||||
|
if (result.map) {
|
||||||
|
fs.writeFileSync(program.output + ".map", result.map);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
fs.readFile(filename, "utf-8", cb);
|
print(result.code);
|
||||||
|
}
|
||||||
|
if (program.nameCache) {
|
||||||
|
fs.writeFileSync(program.nameCache, JSON.stringify(options.nameCache));
|
||||||
|
}
|
||||||
|
if (result.timings) for (var phase in result.timings) {
|
||||||
|
print_error("- " + phase + ": " + result.timings[phase].toFixed(3) + "s");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function time_it(name, cont) {
|
function fatal(message) {
|
||||||
var t1 = new Date().getTime();
|
if (message instanceof Error) message = message.stack.replace(/^\S*?Error:/, "ERROR:")
|
||||||
var ret = cont();
|
print_error(message);
|
||||||
if (ARGS.stats) {
|
process.exit(1);
|
||||||
var spent = new Date().getTime() - t1;
|
}
|
||||||
if (STATS[name]) STATS[name] += spent;
|
|
||||||
else STATS[name] = spent;
|
// A file glob function that only supports "*" and "?" wildcards in the basename.
|
||||||
|
// Example: "foo/bar/*baz??.*.js"
|
||||||
|
// Argument `glob` may be a string or an array of strings.
|
||||||
|
// Returns an array of strings. Garbage in, garbage out.
|
||||||
|
function simple_glob(glob) {
|
||||||
|
if (Array.isArray(glob)) {
|
||||||
|
return [].concat.apply([], glob.map(simple_glob));
|
||||||
}
|
}
|
||||||
|
if (glob.match(/\*|\?/)) {
|
||||||
|
var dir = path.dirname(glob);
|
||||||
|
try {
|
||||||
|
var entries = fs.readdirSync(dir);
|
||||||
|
} catch (ex) {}
|
||||||
|
if (entries) {
|
||||||
|
var pattern = "^" + path.basename(glob)
|
||||||
|
.replace(/[.+^$[\]\\(){}]/g, "\\$&")
|
||||||
|
.replace(/\*/g, "[^/\\\\]*")
|
||||||
|
.replace(/\?/g, "[^/\\\\]") + "$";
|
||||||
|
var mod = process.platform === "win32" ? "i" : "";
|
||||||
|
var rx = new RegExp(pattern, mod);
|
||||||
|
var results = entries.filter(function(name) {
|
||||||
|
return rx.test(name);
|
||||||
|
}).map(function(name) {
|
||||||
|
return path.join(dir, name);
|
||||||
|
});
|
||||||
|
if (results.length) return results;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return [ glob ];
|
||||||
|
}
|
||||||
|
|
||||||
|
function read_file(path, default_value) {
|
||||||
|
try {
|
||||||
|
return fs.readFileSync(path, "utf8");
|
||||||
|
} catch (ex) {
|
||||||
|
if (ex.code == "ENOENT" && default_value != null) return default_value;
|
||||||
|
fatal(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function parse_js(flag) {
|
||||||
|
return function(value, options) {
|
||||||
|
options = options || {};
|
||||||
|
try {
|
||||||
|
UglifyJS.minify(value, {
|
||||||
|
parse: {
|
||||||
|
expression: true
|
||||||
|
},
|
||||||
|
compress: false,
|
||||||
|
mangle: false,
|
||||||
|
output: {
|
||||||
|
ast: true,
|
||||||
|
code: false
|
||||||
|
}
|
||||||
|
}).ast.walk(new UglifyJS.TreeWalker(function(node) {
|
||||||
|
if (node instanceof UglifyJS.AST_Assign) {
|
||||||
|
var name = node.left.print_to_string();
|
||||||
|
var value = node.right;
|
||||||
|
if (flag) {
|
||||||
|
options[name] = value;
|
||||||
|
} else if (value instanceof UglifyJS.AST_Array) {
|
||||||
|
options[name] = value.elements.map(to_string);
|
||||||
|
} else {
|
||||||
|
options[name] = to_string(value);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (node instanceof UglifyJS.AST_Symbol || node instanceof UglifyJS.AST_PropAccess) {
|
||||||
|
var name = node.print_to_string();
|
||||||
|
options[name] = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!(node instanceof UglifyJS.AST_Sequence)) throw node;
|
||||||
|
|
||||||
|
function to_string(value) {
|
||||||
|
return value instanceof UglifyJS.AST_Constant ? value.getValue() : value.print_to_string({
|
||||||
|
quote_keys: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
} catch(ex) {
|
||||||
|
if (flag) {
|
||||||
|
fatal("Error parsing arguments for '" + flag + "': " + value);
|
||||||
|
} else {
|
||||||
|
options[value] = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function parse_source_map() {
|
||||||
|
var parse = parse_js();
|
||||||
|
return function(value, options) {
|
||||||
|
var hasContent = options && "content" in options;
|
||||||
|
var settings = parse(value, options);
|
||||||
|
if (!hasContent && settings.content && settings.content != "inline") {
|
||||||
|
print_error("INFO: Using input source map: " + settings.content);
|
||||||
|
settings.content = read_file(settings.content, settings.content);
|
||||||
|
}
|
||||||
|
return settings;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function skip_key(key) {
|
||||||
|
return skip_keys.indexOf(key) >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function symdef(def) {
|
||||||
|
var ret = (1e6 + def.id) + " " + def.name;
|
||||||
|
if (def.mangled_name) ret += " " + def.mangled_name;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function format_object(obj) {
|
||||||
|
var lines = [];
|
||||||
|
var padding = "";
|
||||||
|
Object.keys(obj).map(function(name) {
|
||||||
|
if (padding.length < name.length) padding = Array(name.length + 1).join(" ");
|
||||||
|
return [ name, JSON.stringify(obj[name]) ];
|
||||||
|
}).forEach(function(tokens) {
|
||||||
|
lines.push(" " + tokens[0] + padding.slice(tokens[0].length - 2) + tokens[1]);
|
||||||
|
});
|
||||||
|
return lines.join("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
function print_error(msg) {
|
||||||
|
process.stderr.write(msg);
|
||||||
|
process.stderr.write("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
function print(txt) {
|
||||||
|
process.stdout.write(txt);
|
||||||
|
process.stdout.write("\n");
|
||||||
|
}
|
||||||
|
|||||||
364
lib/ast.js
364
lib/ast.js
@@ -71,7 +71,7 @@ function DEFNODE(type, props, methods, base) {
|
|||||||
if (type) {
|
if (type) {
|
||||||
ctor.prototype.TYPE = ctor.TYPE = type;
|
ctor.prototype.TYPE = ctor.TYPE = type;
|
||||||
}
|
}
|
||||||
if (methods) for (i in methods) if (methods.hasOwnProperty(i)) {
|
if (methods) for (i in methods) if (HOP(methods, i)) {
|
||||||
if (/^\$/.test(i)) {
|
if (/^\$/.test(i)) {
|
||||||
ctor[i.substr(1)] = methods[i];
|
ctor[i.substr(1)] = methods[i];
|
||||||
} else {
|
} else {
|
||||||
@@ -81,16 +81,30 @@ function DEFNODE(type, props, methods, base) {
|
|||||||
ctor.DEFMETHOD = function(name, method) {
|
ctor.DEFMETHOD = function(name, method) {
|
||||||
this.prototype[name] = method;
|
this.prototype[name] = method;
|
||||||
};
|
};
|
||||||
|
if (typeof exports !== "undefined") {
|
||||||
|
exports["AST_" + type] = ctor;
|
||||||
|
}
|
||||||
return ctor;
|
return ctor;
|
||||||
};
|
};
|
||||||
|
|
||||||
var AST_Token = DEFNODE("Token", "type value line col pos endpos nlb comments_before file", {
|
var AST_Token = DEFNODE("Token", "type value line col pos endline endcol endpos nlb comments_before comments_after file raw", {
|
||||||
}, null);
|
}, null);
|
||||||
|
|
||||||
var AST_Node = DEFNODE("Node", "start end", {
|
var AST_Node = DEFNODE("Node", "start end", {
|
||||||
clone: function() {
|
_clone: function(deep) {
|
||||||
|
if (deep) {
|
||||||
|
var self = this.clone();
|
||||||
|
return self.transform(new TreeTransformer(function(node) {
|
||||||
|
if (node !== self) {
|
||||||
|
return node.clone(true);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
return new this.CTOR(this);
|
return new this.CTOR(this);
|
||||||
},
|
},
|
||||||
|
clone: function(deep) {
|
||||||
|
return this._clone(deep);
|
||||||
|
},
|
||||||
$documentation: "Base class of all AST nodes",
|
$documentation: "Base class of all AST nodes",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
start: "[AST_Token] The first token of this node",
|
start: "[AST_Token] The first token of this node",
|
||||||
@@ -120,11 +134,11 @@ var AST_Debugger = DEFNODE("Debugger", null, {
|
|||||||
$documentation: "Represents a debugger statement",
|
$documentation: "Represents a debugger statement",
|
||||||
}, AST_Statement);
|
}, AST_Statement);
|
||||||
|
|
||||||
var AST_Directive = DEFNODE("Directive", "value scope", {
|
var AST_Directive = DEFNODE("Directive", "value quote", {
|
||||||
$documentation: "Represents a directive, like \"use strict\";",
|
$documentation: "Represents a directive, like \"use strict\";",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
value: "[string] The value of this directive as a plain string (it's not an AST_String!)",
|
value: "[string] The value of this directive as a plain string (it's not an AST_String!)",
|
||||||
scope: "[AST_Scope/S] The scope that this directive affects"
|
quote: "[string] the original quote character"
|
||||||
},
|
},
|
||||||
}, AST_Statement);
|
}, AST_Statement);
|
||||||
|
|
||||||
@@ -141,16 +155,17 @@ var AST_SimpleStatement = DEFNODE("SimpleStatement", "body", {
|
|||||||
}, AST_Statement);
|
}, AST_Statement);
|
||||||
|
|
||||||
function walk_body(node, visitor) {
|
function walk_body(node, visitor) {
|
||||||
if (node.body instanceof AST_Statement) {
|
var body = node.body;
|
||||||
node.body._walk(visitor);
|
if (body instanceof AST_Statement) {
|
||||||
|
body._walk(visitor);
|
||||||
|
}
|
||||||
|
else for (var i = 0, len = body.length; i < len; i++) {
|
||||||
|
body[i]._walk(visitor);
|
||||||
}
|
}
|
||||||
else node.body.forEach(function(stat){
|
|
||||||
stat._walk(visitor);
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
var AST_Block = DEFNODE("Block", "body", {
|
var AST_Block = DEFNODE("Block", "body", {
|
||||||
$documentation: "A body of statements (usually bracketed)",
|
$documentation: "A body of statements (usually braced)",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
body: "[AST_Statement*] an array of statements"
|
body: "[AST_Statement*] an array of statements"
|
||||||
},
|
},
|
||||||
@@ -166,21 +181,13 @@ var AST_BlockStatement = DEFNODE("BlockStatement", null, {
|
|||||||
}, AST_Block);
|
}, AST_Block);
|
||||||
|
|
||||||
var AST_EmptyStatement = DEFNODE("EmptyStatement", null, {
|
var AST_EmptyStatement = DEFNODE("EmptyStatement", null, {
|
||||||
$documentation: "The empty statement (empty block or simply a semicolon)",
|
$documentation: "The empty statement (empty block or simply a semicolon)"
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this);
|
|
||||||
}
|
|
||||||
}, AST_Statement);
|
}, AST_Statement);
|
||||||
|
|
||||||
var AST_StatementWithBody = DEFNODE("StatementWithBody", "body", {
|
var AST_StatementWithBody = DEFNODE("StatementWithBody", "body", {
|
||||||
$documentation: "Base class for all statements that contain one nested body: `For`, `ForIn`, `Do`, `While`, `With`",
|
$documentation: "Base class for all statements that contain one nested body: `For`, `ForIn`, `Do`, `While`, `With`",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
body: "[AST_Statement] the body; this should always be present, even if it's an AST_EmptyStatement"
|
body: "[AST_Statement] the body; this should always be present, even if it's an AST_EmptyStatement"
|
||||||
},
|
|
||||||
_walk: function(visitor) {
|
|
||||||
return visitor._visit(this, function(){
|
|
||||||
this.body._walk(visitor);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}, AST_Statement);
|
}, AST_Statement);
|
||||||
|
|
||||||
@@ -194,6 +201,21 @@ var AST_LabeledStatement = DEFNODE("LabeledStatement", "label", {
|
|||||||
this.label._walk(visitor);
|
this.label._walk(visitor);
|
||||||
this.body._walk(visitor);
|
this.body._walk(visitor);
|
||||||
});
|
});
|
||||||
|
},
|
||||||
|
clone: function(deep) {
|
||||||
|
var node = this._clone(deep);
|
||||||
|
if (deep) {
|
||||||
|
var label = node.label;
|
||||||
|
var def = this.label;
|
||||||
|
node.walk(new TreeWalker(function(node) {
|
||||||
|
if (node instanceof AST_LoopControl
|
||||||
|
&& node.label && node.label.thedef === def) {
|
||||||
|
node.label.thedef = label;
|
||||||
|
label.references.push(node);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
return node;
|
||||||
}
|
}
|
||||||
}, AST_StatementWithBody);
|
}, AST_StatementWithBody);
|
||||||
|
|
||||||
@@ -205,21 +227,27 @@ var AST_DWLoop = DEFNODE("DWLoop", "condition", {
|
|||||||
$documentation: "Base class for do/while statements",
|
$documentation: "Base class for do/while statements",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
condition: "[AST_Node] the loop condition. Should not be instanceof AST_Statement"
|
condition: "[AST_Node] the loop condition. Should not be instanceof AST_Statement"
|
||||||
},
|
}
|
||||||
|
}, AST_IterationStatement);
|
||||||
|
|
||||||
|
var AST_Do = DEFNODE("Do", null, {
|
||||||
|
$documentation: "A `do` statement",
|
||||||
|
_walk: function(visitor) {
|
||||||
|
return visitor._visit(this, function(){
|
||||||
|
this.body._walk(visitor);
|
||||||
|
this.condition._walk(visitor);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, AST_DWLoop);
|
||||||
|
|
||||||
|
var AST_While = DEFNODE("While", null, {
|
||||||
|
$documentation: "A `while` statement",
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function(){
|
||||||
this.condition._walk(visitor);
|
this.condition._walk(visitor);
|
||||||
this.body._walk(visitor);
|
this.body._walk(visitor);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, AST_IterationStatement);
|
|
||||||
|
|
||||||
var AST_Do = DEFNODE("Do", null, {
|
|
||||||
$documentation: "A `do` statement",
|
|
||||||
}, AST_DWLoop);
|
|
||||||
|
|
||||||
var AST_While = DEFNODE("While", null, {
|
|
||||||
$documentation: "A `while` statement",
|
|
||||||
}, AST_DWLoop);
|
}, AST_DWLoop);
|
||||||
|
|
||||||
var AST_For = DEFNODE("For", "init condition step", {
|
var AST_For = DEFNODE("For", "init condition step", {
|
||||||
@@ -239,11 +267,10 @@ var AST_For = DEFNODE("For", "init condition step", {
|
|||||||
}
|
}
|
||||||
}, AST_IterationStatement);
|
}, AST_IterationStatement);
|
||||||
|
|
||||||
var AST_ForIn = DEFNODE("ForIn", "init name object", {
|
var AST_ForIn = DEFNODE("ForIn", "init object", {
|
||||||
$documentation: "A `for ... in` statement",
|
$documentation: "A `for ... in` statement",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
init: "[AST_Node] the `for/in` initialization code",
|
init: "[AST_Node] the `for/in` initialization code",
|
||||||
name: "[AST_SymbolRef?] the loop variable, only if `init` is AST_Var",
|
|
||||||
object: "[AST_Node] the object that we're looping through"
|
object: "[AST_Node] the object that we're looping through"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
@@ -270,10 +297,9 @@ var AST_With = DEFNODE("With", "expression", {
|
|||||||
|
|
||||||
/* -----[ scope and functions ]----- */
|
/* -----[ scope and functions ]----- */
|
||||||
|
|
||||||
var AST_Scope = DEFNODE("Scope", "directives variables functions uses_with uses_eval parent_scope enclosed cname", {
|
var AST_Scope = DEFNODE("Scope", "variables functions uses_with uses_eval parent_scope enclosed cname", {
|
||||||
$documentation: "Base class for all statements introducing a lexical scope",
|
$documentation: "Base class for all statements introducing a lexical scope",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
directives: "[string*/S] an array of directives declared in this scope",
|
|
||||||
variables: "[Object/S] a map of name -> SymbolDef for all variables/functions defined in this scope",
|
variables: "[Object/S] a map of name -> SymbolDef for all variables/functions defined in this scope",
|
||||||
functions: "[Object/S] like `variables`, but only lists function declarations",
|
functions: "[Object/S] like `variables`, but only lists function declarations",
|
||||||
uses_with: "[boolean/S] tells whether this scope uses the `with` statement",
|
uses_with: "[boolean/S] tells whether this scope uses the `with` statement",
|
||||||
@@ -282,6 +308,13 @@ var AST_Scope = DEFNODE("Scope", "directives variables functions uses_with uses_
|
|||||||
enclosed: "[SymbolDef*/S] a list of all symbol definitions that are accessed from this scope or any subscopes",
|
enclosed: "[SymbolDef*/S] a list of all symbol definitions that are accessed from this scope or any subscopes",
|
||||||
cname: "[integer/S] current index for mangling variables (used internally by the mangler)",
|
cname: "[integer/S] current index for mangling variables (used internally by the mangler)",
|
||||||
},
|
},
|
||||||
|
clone: function(deep) {
|
||||||
|
var node = this._clone(deep);
|
||||||
|
if (this.variables) node.variables = this.variables.clone();
|
||||||
|
if (this.functions) node.functions = this.functions.clone();
|
||||||
|
if (this.enclosed) node.enclosed = this.enclosed.slice();
|
||||||
|
return node;
|
||||||
|
}
|
||||||
}, AST_Block);
|
}, AST_Block);
|
||||||
|
|
||||||
var AST_Toplevel = DEFNODE("Toplevel", "globals", {
|
var AST_Toplevel = DEFNODE("Toplevel", "globals", {
|
||||||
@@ -289,63 +322,13 @@ var AST_Toplevel = DEFNODE("Toplevel", "globals", {
|
|||||||
$propdoc: {
|
$propdoc: {
|
||||||
globals: "[Object/S] a map of name -> SymbolDef for all undeclared names",
|
globals: "[Object/S] a map of name -> SymbolDef for all undeclared names",
|
||||||
},
|
},
|
||||||
wrap_enclose: function(arg_parameter_pairs) {
|
wrap_commonjs: function(name) {
|
||||||
var self = this;
|
var body = this.body;
|
||||||
var args = [];
|
var wrapped_tl = "(function(exports){'$ORIG';})(typeof " + name + "=='undefined'?(" + name + "={}):" + name + ");";
|
||||||
var parameters = [];
|
|
||||||
|
|
||||||
arg_parameter_pairs.forEach(function(pair) {
|
|
||||||
var split = pair.split(":");
|
|
||||||
|
|
||||||
args.push(split[0]);
|
|
||||||
parameters.push(split[1]);
|
|
||||||
});
|
|
||||||
|
|
||||||
var wrapped_tl = "(function(" + parameters.join(",") + "){ '$ORIG'; })(" + args.join(",") + ")";
|
|
||||||
wrapped_tl = parse(wrapped_tl);
|
wrapped_tl = parse(wrapped_tl);
|
||||||
wrapped_tl = wrapped_tl.transform(new TreeTransformer(function before(node){
|
wrapped_tl = wrapped_tl.transform(new TreeTransformer(function before(node){
|
||||||
if (node instanceof AST_Directive && node.value == "$ORIG") {
|
if (node instanceof AST_Directive && node.value == "$ORIG") {
|
||||||
return MAP.splice(self.body);
|
return MAP.splice(body);
|
||||||
}
|
|
||||||
}));
|
|
||||||
return wrapped_tl;
|
|
||||||
},
|
|
||||||
wrap_commonjs: function(name, export_all) {
|
|
||||||
var self = this;
|
|
||||||
var to_export = [];
|
|
||||||
if (export_all) {
|
|
||||||
self.figure_out_scope();
|
|
||||||
self.walk(new TreeWalker(function(node){
|
|
||||||
if (node instanceof AST_SymbolDeclaration && node.definition().global) {
|
|
||||||
if (!find_if(function(n){ return n.name == node.name }, to_export))
|
|
||||||
to_export.push(node);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
var wrapped_tl = "(function(exports, global){ global['" + name + "'] = exports; '$ORIG'; '$EXPORTS'; }({}, (function(){return this}())))";
|
|
||||||
wrapped_tl = parse(wrapped_tl);
|
|
||||||
wrapped_tl = wrapped_tl.transform(new TreeTransformer(function before(node){
|
|
||||||
if (node instanceof AST_SimpleStatement) {
|
|
||||||
node = node.body;
|
|
||||||
if (node instanceof AST_String) switch (node.getValue()) {
|
|
||||||
case "$ORIG":
|
|
||||||
return MAP.splice(self.body);
|
|
||||||
case "$EXPORTS":
|
|
||||||
var body = [];
|
|
||||||
to_export.forEach(function(sym){
|
|
||||||
body.push(new AST_SimpleStatement({
|
|
||||||
body: new AST_Assign({
|
|
||||||
left: new AST_Sub({
|
|
||||||
expression: new AST_SymbolRef({ name: "exports" }),
|
|
||||||
property: new AST_String({ value: sym.name }),
|
|
||||||
}),
|
|
||||||
operator: "=",
|
|
||||||
right: new AST_SymbolRef(sym),
|
|
||||||
}),
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
return MAP.splice(body);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
return wrapped_tl;
|
return wrapped_tl;
|
||||||
@@ -362,9 +345,10 @@ var AST_Lambda = DEFNODE("Lambda", "name argnames uses_arguments", {
|
|||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function(){
|
||||||
if (this.name) this.name._walk(visitor);
|
if (this.name) this.name._walk(visitor);
|
||||||
this.argnames.forEach(function(arg){
|
var argnames = this.argnames;
|
||||||
arg._walk(visitor);
|
for (var i = 0, len = argnames.length; i < len; i++) {
|
||||||
});
|
argnames[i]._walk(visitor);
|
||||||
|
}
|
||||||
walk_body(this, visitor);
|
walk_body(this, visitor);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -374,11 +358,11 @@ var AST_Accessor = DEFNODE("Accessor", null, {
|
|||||||
$documentation: "A setter/getter function. The `name` property is always null."
|
$documentation: "A setter/getter function. The `name` property is always null."
|
||||||
}, AST_Lambda);
|
}, AST_Lambda);
|
||||||
|
|
||||||
var AST_Function = DEFNODE("Function", null, {
|
var AST_Function = DEFNODE("Function", "inlined", {
|
||||||
$documentation: "A function expression"
|
$documentation: "A function expression"
|
||||||
}, AST_Lambda);
|
}, AST_Lambda);
|
||||||
|
|
||||||
var AST_Defun = DEFNODE("Defun", null, {
|
var AST_Defun = DEFNODE("Defun", "inlined", {
|
||||||
$documentation: "A function definition"
|
$documentation: "A function definition"
|
||||||
}, AST_Lambda);
|
}, AST_Lambda);
|
||||||
|
|
||||||
@@ -515,18 +499,19 @@ var AST_Finally = DEFNODE("Finally", null, {
|
|||||||
$documentation: "A `finally` node; only makes sense as part of a `try` statement"
|
$documentation: "A `finally` node; only makes sense as part of a `try` statement"
|
||||||
}, AST_Block);
|
}, AST_Block);
|
||||||
|
|
||||||
/* -----[ VAR/CONST ]----- */
|
/* -----[ VAR ]----- */
|
||||||
|
|
||||||
var AST_Definitions = DEFNODE("Definitions", "definitions", {
|
var AST_Definitions = DEFNODE("Definitions", "definitions", {
|
||||||
$documentation: "Base class for `var` or `const` nodes (variable declarations/initializations)",
|
$documentation: "Base class for `var` nodes (variable declarations/initializations)",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
definitions: "[AST_VarDef*] array of variable definitions"
|
definitions: "[AST_VarDef*] array of variable definitions"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function(){
|
||||||
this.definitions.forEach(function(def){
|
var definitions = this.definitions;
|
||||||
def._walk(visitor);
|
for (var i = 0, len = definitions.length; i < len; i++) {
|
||||||
});
|
definitions[i]._walk(visitor);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, AST_Statement);
|
}, AST_Statement);
|
||||||
@@ -535,14 +520,10 @@ var AST_Var = DEFNODE("Var", null, {
|
|||||||
$documentation: "A `var` statement"
|
$documentation: "A `var` statement"
|
||||||
}, AST_Definitions);
|
}, AST_Definitions);
|
||||||
|
|
||||||
var AST_Const = DEFNODE("Const", null, {
|
|
||||||
$documentation: "A `const` statement"
|
|
||||||
}, AST_Definitions);
|
|
||||||
|
|
||||||
var AST_VarDef = DEFNODE("VarDef", "name value", {
|
var AST_VarDef = DEFNODE("VarDef", "name value", {
|
||||||
$documentation: "A variable declaration; only appears in a AST_Definitions node",
|
$documentation: "A variable declaration; only appears in a AST_Definitions node",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
name: "[AST_SymbolVar|AST_SymbolConst] name of the variable",
|
name: "[AST_SymbolVar] name of the variable",
|
||||||
value: "[AST_Node?] initializer, or null of there's no initializer"
|
value: "[AST_Node?] initializer, or null of there's no initializer"
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
@@ -563,10 +544,11 @@ var AST_Call = DEFNODE("Call", "expression args", {
|
|||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function(){
|
||||||
|
var args = this.args;
|
||||||
|
for (var i = 0, len = args.length; i < len; i++) {
|
||||||
|
args[i]._walk(visitor);
|
||||||
|
}
|
||||||
this.expression._walk(visitor);
|
this.expression._walk(visitor);
|
||||||
this.args.forEach(function(arg){
|
|
||||||
arg._walk(visitor);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -575,61 +557,16 @@ var AST_New = DEFNODE("New", null, {
|
|||||||
$documentation: "An object instantiation. Derives from a function call since it has exactly the same properties"
|
$documentation: "An object instantiation. Derives from a function call since it has exactly the same properties"
|
||||||
}, AST_Call);
|
}, AST_Call);
|
||||||
|
|
||||||
var AST_Seq = DEFNODE("Seq", "car cdr", {
|
var AST_Sequence = DEFNODE("Sequence", "expressions", {
|
||||||
$documentation: "A sequence expression (two comma-separated expressions)",
|
$documentation: "A sequence expression (comma-separated expressions)",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
car: "[AST_Node] first element in sequence",
|
expressions: "[AST_Node*] array of expressions (at least two)"
|
||||||
cdr: "[AST_Node] second element in sequence"
|
|
||||||
},
|
|
||||||
$cons: function(x, y) {
|
|
||||||
var seq = new AST_Seq(x);
|
|
||||||
seq.car = x;
|
|
||||||
seq.cdr = y;
|
|
||||||
return seq;
|
|
||||||
},
|
|
||||||
$from_array: function(array) {
|
|
||||||
if (array.length == 0) return null;
|
|
||||||
if (array.length == 1) return array[0].clone();
|
|
||||||
var list = null;
|
|
||||||
for (var i = array.length; --i >= 0;) {
|
|
||||||
list = AST_Seq.cons(array[i], list);
|
|
||||||
}
|
|
||||||
var p = list;
|
|
||||||
while (p) {
|
|
||||||
if (p.cdr && !p.cdr.cdr) {
|
|
||||||
p.cdr = p.cdr.car;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
p = p.cdr;
|
|
||||||
}
|
|
||||||
return list;
|
|
||||||
},
|
|
||||||
to_array: function() {
|
|
||||||
var p = this, a = [];
|
|
||||||
while (p) {
|
|
||||||
a.push(p.car);
|
|
||||||
if (p.cdr && !(p.cdr instanceof AST_Seq)) {
|
|
||||||
a.push(p.cdr);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
p = p.cdr;
|
|
||||||
}
|
|
||||||
return a;
|
|
||||||
},
|
|
||||||
add: function(node) {
|
|
||||||
var p = this;
|
|
||||||
while (p) {
|
|
||||||
if (!(p.cdr instanceof AST_Seq)) {
|
|
||||||
var cell = AST_Seq.cons(p.cdr, node);
|
|
||||||
return p.cdr = cell;
|
|
||||||
}
|
|
||||||
p = p.cdr;
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function(){
|
||||||
this.car._walk(visitor);
|
this.expressions.forEach(function(node) {
|
||||||
if (this.cdr) this.cdr._walk(visitor);
|
node._walk(visitor);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -682,7 +619,7 @@ var AST_UnaryPostfix = DEFNODE("UnaryPostfix", null, {
|
|||||||
$documentation: "Unary postfix expression, i.e. `i++`"
|
$documentation: "Unary postfix expression, i.e. `i++`"
|
||||||
}, AST_Unary);
|
}, AST_Unary);
|
||||||
|
|
||||||
var AST_Binary = DEFNODE("Binary", "left operator right", {
|
var AST_Binary = DEFNODE("Binary", "operator left right", {
|
||||||
$documentation: "Binary expression, i.e. `a + b`",
|
$documentation: "Binary expression, i.e. `a + b`",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
left: "[AST_Node] left-hand side expression",
|
left: "[AST_Node] left-hand side expression",
|
||||||
@@ -726,9 +663,10 @@ var AST_Array = DEFNODE("Array", "elements", {
|
|||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function(){
|
||||||
this.elements.forEach(function(el){
|
var elements = this.elements;
|
||||||
el._walk(visitor);
|
for (var i = 0, len = elements.length; i < len; i++) {
|
||||||
});
|
elements[i]._walk(visitor);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -740,9 +678,10 @@ var AST_Object = DEFNODE("Object", "properties", {
|
|||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function(){
|
||||||
this.properties.forEach(function(prop){
|
var properties = this.properties;
|
||||||
prop._walk(visitor);
|
for (var i = 0, len = properties.length; i < len; i++) {
|
||||||
});
|
properties[i]._walk(visitor);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -750,8 +689,8 @@ var AST_Object = DEFNODE("Object", "properties", {
|
|||||||
var AST_ObjectProperty = DEFNODE("ObjectProperty", "key value", {
|
var AST_ObjectProperty = DEFNODE("ObjectProperty", "key value", {
|
||||||
$documentation: "Base class for literal object properties",
|
$documentation: "Base class for literal object properties",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
key: "[string] the property name converted to a string for ObjectKeyVal. For setters and getters this is an arbitrary AST_Node.",
|
key: "[string|AST_SymbolAccessor] property name. For ObjectKeyVal this is a string. For getters and setters this is an AST_SymbolAccessor.",
|
||||||
value: "[AST_Node] property value. For setters and getters this is an AST_Function."
|
value: "[AST_Node] property value. For getters and setters this is an AST_Accessor."
|
||||||
},
|
},
|
||||||
_walk: function(visitor) {
|
_walk: function(visitor) {
|
||||||
return visitor._visit(this, function(){
|
return visitor._visit(this, function(){
|
||||||
@@ -760,8 +699,11 @@ var AST_ObjectProperty = DEFNODE("ObjectProperty", "key value", {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var AST_ObjectKeyVal = DEFNODE("ObjectKeyVal", null, {
|
var AST_ObjectKeyVal = DEFNODE("ObjectKeyVal", "quote", {
|
||||||
$documentation: "A key: value object property",
|
$documentation: "A key: value object property",
|
||||||
|
$propdoc: {
|
||||||
|
quote: "[string] the original quote character"
|
||||||
|
}
|
||||||
}, AST_ObjectProperty);
|
}, AST_ObjectProperty);
|
||||||
|
|
||||||
var AST_ObjectSetter = DEFNODE("ObjectSetter", null, {
|
var AST_ObjectSetter = DEFNODE("ObjectSetter", null, {
|
||||||
@@ -786,20 +728,13 @@ var AST_SymbolAccessor = DEFNODE("SymbolAccessor", null, {
|
|||||||
}, AST_Symbol);
|
}, AST_Symbol);
|
||||||
|
|
||||||
var AST_SymbolDeclaration = DEFNODE("SymbolDeclaration", "init", {
|
var AST_SymbolDeclaration = DEFNODE("SymbolDeclaration", "init", {
|
||||||
$documentation: "A declaration symbol (symbol in var/const, function name or argument, symbol in catch)",
|
$documentation: "A declaration symbol (symbol in var, function name or argument, symbol in catch)",
|
||||||
$propdoc: {
|
|
||||||
init: "[AST_Node*/S] array of initializers for this declaration."
|
|
||||||
}
|
|
||||||
}, AST_Symbol);
|
}, AST_Symbol);
|
||||||
|
|
||||||
var AST_SymbolVar = DEFNODE("SymbolVar", null, {
|
var AST_SymbolVar = DEFNODE("SymbolVar", null, {
|
||||||
$documentation: "Symbol defining a variable",
|
$documentation: "Symbol defining a variable",
|
||||||
}, AST_SymbolDeclaration);
|
}, AST_SymbolDeclaration);
|
||||||
|
|
||||||
var AST_SymbolConst = DEFNODE("SymbolConst", null, {
|
|
||||||
$documentation: "A constant declaration"
|
|
||||||
}, AST_SymbolDeclaration);
|
|
||||||
|
|
||||||
var AST_SymbolFunarg = DEFNODE("SymbolFunarg", null, {
|
var AST_SymbolFunarg = DEFNODE("SymbolFunarg", null, {
|
||||||
$documentation: "Symbol naming a function argument",
|
$documentation: "Symbol naming a function argument",
|
||||||
}, AST_SymbolVar);
|
}, AST_SymbolVar);
|
||||||
@@ -846,17 +781,19 @@ var AST_Constant = DEFNODE("Constant", null, {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var AST_String = DEFNODE("String", "value", {
|
var AST_String = DEFNODE("String", "value quote", {
|
||||||
$documentation: "A string literal",
|
$documentation: "A string literal",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
value: "[string] the contents of this string"
|
value: "[string] the contents of this string",
|
||||||
|
quote: "[string] the original quote character"
|
||||||
}
|
}
|
||||||
}, AST_Constant);
|
}, AST_Constant);
|
||||||
|
|
||||||
var AST_Number = DEFNODE("Number", "value", {
|
var AST_Number = DEFNODE("Number", "value literal", {
|
||||||
$documentation: "A number literal",
|
$documentation: "A number literal",
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
value: "[number] the numeric value"
|
value: "[number] the numeric value",
|
||||||
|
literal: "[string] numeric value as string (optional)"
|
||||||
}
|
}
|
||||||
}, AST_Constant);
|
}, AST_Constant);
|
||||||
|
|
||||||
@@ -915,27 +852,35 @@ var AST_True = DEFNODE("True", null, {
|
|||||||
function TreeWalker(callback) {
|
function TreeWalker(callback) {
|
||||||
this.visit = callback;
|
this.visit = callback;
|
||||||
this.stack = [];
|
this.stack = [];
|
||||||
|
this.directives = Object.create(null);
|
||||||
};
|
};
|
||||||
TreeWalker.prototype = {
|
TreeWalker.prototype = {
|
||||||
_visit: function(node, descend) {
|
_visit: function(node, descend) {
|
||||||
this.stack.push(node);
|
this.push(node);
|
||||||
var ret = this.visit(node, descend ? function(){
|
var ret = this.visit(node, descend ? function(){
|
||||||
descend.call(node);
|
descend.call(node);
|
||||||
} : noop);
|
} : noop);
|
||||||
if (!ret && descend) {
|
if (!ret && descend) {
|
||||||
descend.call(node);
|
descend.call(node);
|
||||||
}
|
}
|
||||||
this.stack.pop();
|
this.pop();
|
||||||
return ret;
|
return ret;
|
||||||
},
|
},
|
||||||
parent: function(n) {
|
parent: function(n) {
|
||||||
return this.stack[this.stack.length - 2 - (n || 0)];
|
return this.stack[this.stack.length - 2 - (n || 0)];
|
||||||
},
|
},
|
||||||
push: function (node) {
|
push: function(node) {
|
||||||
|
if (node instanceof AST_Lambda) {
|
||||||
|
this.directives = Object.create(this.directives);
|
||||||
|
} else if (node instanceof AST_Directive && !this.directives[node.value]) {
|
||||||
|
this.directives[node.value] = node;
|
||||||
|
}
|
||||||
this.stack.push(node);
|
this.stack.push(node);
|
||||||
},
|
},
|
||||||
pop: function() {
|
pop: function() {
|
||||||
return this.stack.pop();
|
if (this.stack.pop() instanceof AST_Lambda) {
|
||||||
|
this.directives = Object.getPrototypeOf(this.directives);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
self: function() {
|
self: function() {
|
||||||
return this.stack[this.stack.length - 1];
|
return this.stack[this.stack.length - 1];
|
||||||
@@ -948,37 +893,48 @@ TreeWalker.prototype = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
has_directive: function(type) {
|
has_directive: function(type) {
|
||||||
return this.find_parent(AST_Scope).has_directive(type);
|
var dir = this.directives[type];
|
||||||
},
|
if (dir) return dir;
|
||||||
in_boolean_context: function() {
|
var node = this.stack[this.stack.length - 1];
|
||||||
var stack = this.stack;
|
if (node instanceof AST_Scope) {
|
||||||
var i = stack.length, self = stack[--i];
|
for (var i = 0; i < node.body.length; ++i) {
|
||||||
while (i > 0) {
|
var st = node.body[i];
|
||||||
var p = stack[--i];
|
if (!(st instanceof AST_Directive)) break;
|
||||||
if ((p instanceof AST_If && p.condition === self) ||
|
if (st.value == type) return st;
|
||||||
(p instanceof AST_Conditional && p.condition === self) ||
|
|
||||||
(p instanceof AST_DWLoop && p.condition === self) ||
|
|
||||||
(p instanceof AST_For && p.condition === self) ||
|
|
||||||
(p instanceof AST_UnaryPrefix && p.operator == "!" && p.expression === self))
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
if (!(p instanceof AST_Binary && (p.operator == "&&" || p.operator == "||")))
|
|
||||||
return false;
|
|
||||||
self = p;
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
loopcontrol_target: function(label) {
|
loopcontrol_target: function(node) {
|
||||||
var stack = this.stack;
|
var stack = this.stack;
|
||||||
if (label) for (var i = stack.length; --i >= 0;) {
|
if (node.label) for (var i = stack.length; --i >= 0;) {
|
||||||
var x = stack[i];
|
var x = stack[i];
|
||||||
if (x instanceof AST_LabeledStatement && x.label.name == label.name) {
|
if (x instanceof AST_LabeledStatement && x.label.name == node.label.name)
|
||||||
return x.body;
|
return x.body;
|
||||||
}
|
|
||||||
} else for (var i = stack.length; --i >= 0;) {
|
} else for (var i = stack.length; --i >= 0;) {
|
||||||
var x = stack[i];
|
var x = stack[i];
|
||||||
if (x instanceof AST_Switch || x instanceof AST_IterationStatement)
|
if (x instanceof AST_IterationStatement
|
||||||
|
|| node instanceof AST_Break && x instanceof AST_Switch)
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
in_boolean_context: function() {
|
||||||
|
var self = this.self();
|
||||||
|
for (var i = 0, p; p = this.parent(i); i++) {
|
||||||
|
if (p instanceof AST_SimpleStatement
|
||||||
|
|| p instanceof AST_Conditional && p.condition === self
|
||||||
|
|| p instanceof AST_DWLoop && p.condition === self
|
||||||
|
|| p instanceof AST_For && p.condition === self
|
||||||
|
|| p instanceof AST_If && p.condition === self
|
||||||
|
|| p instanceof AST_UnaryPrefix && p.operator == "!" && p.expression === self) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (p instanceof AST_Binary && (p.operator == "&&" || p.operator == "||")
|
||||||
|
|| p instanceof AST_Conditional
|
||||||
|
|| p.tail_node() === self) {
|
||||||
|
self = p;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
6470
lib/compress.js
6470
lib/compress.js
File diff suppressed because it is too large
Load Diff
225
lib/minify.js
Normal file
225
lib/minify.js
Normal file
@@ -0,0 +1,225 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
var to_ascii = typeof atob == "undefined" ? function(b64) {
|
||||||
|
return new Buffer(b64, "base64").toString();
|
||||||
|
} : atob;
|
||||||
|
var to_base64 = typeof btoa == "undefined" ? function(str) {
|
||||||
|
return new Buffer(str).toString("base64");
|
||||||
|
} : btoa;
|
||||||
|
|
||||||
|
function read_source_map(code) {
|
||||||
|
var match = /\n\/\/# sourceMappingURL=data:application\/json(;.*?)?;base64,(.*)/.exec(code);
|
||||||
|
if (!match) {
|
||||||
|
AST_Node.warn("inline source map not found");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return to_ascii(match[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
function set_shorthand(name, options, keys) {
|
||||||
|
if (options[name]) {
|
||||||
|
keys.forEach(function(key) {
|
||||||
|
if (options[key]) {
|
||||||
|
if (typeof options[key] != "object") options[key] = {};
|
||||||
|
if (!(name in options[key])) options[key][name] = options[name];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function init_cache(cache) {
|
||||||
|
if (!cache) return;
|
||||||
|
if (!("props" in cache)) {
|
||||||
|
cache.props = new Dictionary();
|
||||||
|
} else if (!(cache.props instanceof Dictionary)) {
|
||||||
|
cache.props = Dictionary.fromObject(cache.props);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function to_json(cache) {
|
||||||
|
return {
|
||||||
|
props: cache.props.toObject()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function minify(files, options) {
|
||||||
|
var warn_function = AST_Node.warn_function;
|
||||||
|
try {
|
||||||
|
options = defaults(options, {
|
||||||
|
compress: {},
|
||||||
|
ie8: false,
|
||||||
|
keep_fnames: false,
|
||||||
|
mangle: {},
|
||||||
|
nameCache: null,
|
||||||
|
output: {},
|
||||||
|
parse: {},
|
||||||
|
rename: undefined,
|
||||||
|
sourceMap: false,
|
||||||
|
timings: false,
|
||||||
|
toplevel: false,
|
||||||
|
warnings: false,
|
||||||
|
wrap: false,
|
||||||
|
}, true);
|
||||||
|
var timings = options.timings && {
|
||||||
|
start: Date.now()
|
||||||
|
};
|
||||||
|
if (options.rename === undefined) {
|
||||||
|
options.rename = options.compress && options.mangle;
|
||||||
|
}
|
||||||
|
set_shorthand("ie8", options, [ "compress", "mangle", "output" ]);
|
||||||
|
set_shorthand("keep_fnames", options, [ "compress", "mangle" ]);
|
||||||
|
set_shorthand("toplevel", options, [ "compress", "mangle" ]);
|
||||||
|
set_shorthand("warnings", options, [ "compress" ]);
|
||||||
|
var quoted_props;
|
||||||
|
if (options.mangle) {
|
||||||
|
options.mangle = defaults(options.mangle, {
|
||||||
|
cache: options.nameCache && (options.nameCache.vars || {}),
|
||||||
|
eval: false,
|
||||||
|
ie8: false,
|
||||||
|
keep_fnames: false,
|
||||||
|
properties: false,
|
||||||
|
reserved: [],
|
||||||
|
toplevel: false,
|
||||||
|
}, true);
|
||||||
|
if (options.mangle.properties) {
|
||||||
|
if (typeof options.mangle.properties != "object") {
|
||||||
|
options.mangle.properties = {};
|
||||||
|
}
|
||||||
|
if (options.mangle.properties.keep_quoted) {
|
||||||
|
quoted_props = options.mangle.properties.reserved;
|
||||||
|
if (!Array.isArray(quoted_props)) quoted_props = [];
|
||||||
|
options.mangle.properties.reserved = quoted_props;
|
||||||
|
}
|
||||||
|
if (options.nameCache && !("cache" in options.mangle.properties)) {
|
||||||
|
options.mangle.properties.cache = options.nameCache.props || {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
init_cache(options.mangle.cache);
|
||||||
|
init_cache(options.mangle.properties.cache);
|
||||||
|
}
|
||||||
|
if (options.sourceMap) {
|
||||||
|
options.sourceMap = defaults(options.sourceMap, {
|
||||||
|
content: null,
|
||||||
|
filename: null,
|
||||||
|
includeSources: false,
|
||||||
|
root: null,
|
||||||
|
url: null,
|
||||||
|
}, true);
|
||||||
|
}
|
||||||
|
var warnings = [];
|
||||||
|
if (options.warnings && !AST_Node.warn_function) {
|
||||||
|
AST_Node.warn_function = function(warning) {
|
||||||
|
warnings.push(warning);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (timings) timings.parse = Date.now();
|
||||||
|
var toplevel;
|
||||||
|
if (files instanceof AST_Toplevel) {
|
||||||
|
toplevel = files;
|
||||||
|
} else {
|
||||||
|
if (typeof files == "string") {
|
||||||
|
files = [ files ];
|
||||||
|
}
|
||||||
|
options.parse = options.parse || {};
|
||||||
|
options.parse.toplevel = null;
|
||||||
|
for (var name in files) if (HOP(files, name)) {
|
||||||
|
options.parse.filename = name;
|
||||||
|
options.parse.toplevel = parse(files[name], options.parse);
|
||||||
|
if (options.sourceMap && options.sourceMap.content == "inline") {
|
||||||
|
if (Object.keys(files).length > 1)
|
||||||
|
throw new Error("inline source map only works with singular input");
|
||||||
|
options.sourceMap.content = read_source_map(files[name]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
toplevel = options.parse.toplevel;
|
||||||
|
}
|
||||||
|
if (quoted_props) {
|
||||||
|
reserve_quoted_keys(toplevel, quoted_props);
|
||||||
|
}
|
||||||
|
if (options.wrap) {
|
||||||
|
toplevel = toplevel.wrap_commonjs(options.wrap);
|
||||||
|
}
|
||||||
|
if (timings) timings.rename = Date.now();
|
||||||
|
if (options.rename) {
|
||||||
|
toplevel.figure_out_scope(options.mangle);
|
||||||
|
toplevel.expand_names(options.mangle);
|
||||||
|
}
|
||||||
|
if (timings) timings.compress = Date.now();
|
||||||
|
if (options.compress) toplevel = new Compressor(options.compress).compress(toplevel);
|
||||||
|
if (timings) timings.scope = Date.now();
|
||||||
|
if (options.mangle) toplevel.figure_out_scope(options.mangle);
|
||||||
|
if (timings) timings.mangle = Date.now();
|
||||||
|
if (options.mangle) {
|
||||||
|
toplevel.compute_char_frequency(options.mangle);
|
||||||
|
toplevel.mangle_names(options.mangle);
|
||||||
|
}
|
||||||
|
if (timings) timings.properties = Date.now();
|
||||||
|
if (options.mangle && options.mangle.properties) {
|
||||||
|
toplevel = mangle_properties(toplevel, options.mangle.properties);
|
||||||
|
}
|
||||||
|
if (timings) timings.output = Date.now();
|
||||||
|
var result = {};
|
||||||
|
if (options.output.ast) {
|
||||||
|
result.ast = toplevel;
|
||||||
|
}
|
||||||
|
if (!HOP(options.output, "code") || options.output.code) {
|
||||||
|
if (options.sourceMap) {
|
||||||
|
if (typeof options.sourceMap.content == "string") {
|
||||||
|
options.sourceMap.content = JSON.parse(options.sourceMap.content);
|
||||||
|
}
|
||||||
|
options.output.source_map = SourceMap({
|
||||||
|
file: options.sourceMap.filename,
|
||||||
|
orig: options.sourceMap.content,
|
||||||
|
root: options.sourceMap.root
|
||||||
|
});
|
||||||
|
if (options.sourceMap.includeSources) {
|
||||||
|
if (files instanceof AST_Toplevel) {
|
||||||
|
throw new Error("original source content unavailable");
|
||||||
|
} else for (var name in files) if (HOP(files, name)) {
|
||||||
|
options.output.source_map.get().setSourceContent(name, files[name]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delete options.output.ast;
|
||||||
|
delete options.output.code;
|
||||||
|
var stream = OutputStream(options.output);
|
||||||
|
toplevel.print(stream);
|
||||||
|
result.code = stream.get();
|
||||||
|
if (options.sourceMap) {
|
||||||
|
result.map = options.output.source_map.toString();
|
||||||
|
if (options.sourceMap.url == "inline") {
|
||||||
|
result.code += "\n//# sourceMappingURL=data:application/json;charset=utf-8;base64," + to_base64(result.map);
|
||||||
|
} else if (options.sourceMap.url) {
|
||||||
|
result.code += "\n//# sourceMappingURL=" + options.sourceMap.url;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (options.nameCache && options.mangle) {
|
||||||
|
if (options.mangle.cache) options.nameCache.vars = to_json(options.mangle.cache);
|
||||||
|
if (options.mangle.properties && options.mangle.properties.cache) {
|
||||||
|
options.nameCache.props = to_json(options.mangle.properties.cache);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (timings) {
|
||||||
|
timings.end = Date.now();
|
||||||
|
result.timings = {
|
||||||
|
parse: 1e-3 * (timings.rename - timings.parse),
|
||||||
|
rename: 1e-3 * (timings.compress - timings.rename),
|
||||||
|
compress: 1e-3 * (timings.scope - timings.compress),
|
||||||
|
scope: 1e-3 * (timings.mangle - timings.scope),
|
||||||
|
mangle: 1e-3 * (timings.properties - timings.mangle),
|
||||||
|
properties: 1e-3 * (timings.output - timings.properties),
|
||||||
|
output: 1e-3 * (timings.end - timings.output),
|
||||||
|
total: 1e-3 * (timings.end - timings.start)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (warnings.length) {
|
||||||
|
result.warnings = warnings;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
} catch (ex) {
|
||||||
|
return { error: ex };
|
||||||
|
} finally {
|
||||||
|
AST_Node.warn_function = warn_function;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -45,54 +45,113 @@
|
|||||||
|
|
||||||
(function(){
|
(function(){
|
||||||
|
|
||||||
|
var normalize_directives = function(body) {
|
||||||
|
var in_directive = true;
|
||||||
|
|
||||||
|
for (var i = 0; i < body.length; i++) {
|
||||||
|
if (in_directive && body[i] instanceof AST_Statement && body[i].body instanceof AST_String) {
|
||||||
|
body[i] = new AST_Directive({
|
||||||
|
start: body[i].start,
|
||||||
|
end: body[i].end,
|
||||||
|
value: body[i].body.value
|
||||||
|
});
|
||||||
|
} else if (in_directive && !(body[i] instanceof AST_Statement && body[i].body instanceof AST_String)) {
|
||||||
|
in_directive = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return body;
|
||||||
|
};
|
||||||
|
|
||||||
var MOZ_TO_ME = {
|
var MOZ_TO_ME = {
|
||||||
TryStatement : function(M) {
|
Program: function(M) {
|
||||||
|
return new AST_Toplevel({
|
||||||
|
start: my_start_token(M),
|
||||||
|
end: my_end_token(M),
|
||||||
|
body: normalize_directives(M.body.map(from_moz))
|
||||||
|
});
|
||||||
|
},
|
||||||
|
FunctionDeclaration: function(M) {
|
||||||
|
return new AST_Defun({
|
||||||
|
start: my_start_token(M),
|
||||||
|
end: my_end_token(M),
|
||||||
|
name: from_moz(M.id),
|
||||||
|
argnames: M.params.map(from_moz),
|
||||||
|
body: normalize_directives(from_moz(M.body).body)
|
||||||
|
});
|
||||||
|
},
|
||||||
|
FunctionExpression: function(M) {
|
||||||
|
return new AST_Function({
|
||||||
|
start: my_start_token(M),
|
||||||
|
end: my_end_token(M),
|
||||||
|
name: from_moz(M.id),
|
||||||
|
argnames: M.params.map(from_moz),
|
||||||
|
body: normalize_directives(from_moz(M.body).body)
|
||||||
|
});
|
||||||
|
},
|
||||||
|
ExpressionStatement: function(M) {
|
||||||
|
return new AST_SimpleStatement({
|
||||||
|
start: my_start_token(M),
|
||||||
|
end: my_end_token(M),
|
||||||
|
body: from_moz(M.expression)
|
||||||
|
});
|
||||||
|
},
|
||||||
|
TryStatement: function(M) {
|
||||||
|
var handlers = M.handlers || [M.handler];
|
||||||
|
if (handlers.length > 1 || M.guardedHandlers && M.guardedHandlers.length) {
|
||||||
|
throw new Error("Multiple catch clauses are not supported.");
|
||||||
|
}
|
||||||
return new AST_Try({
|
return new AST_Try({
|
||||||
start : my_start_token(M),
|
start : my_start_token(M),
|
||||||
end : my_end_token(M),
|
end : my_end_token(M),
|
||||||
body : from_moz(M.block).body,
|
body : from_moz(M.block).body,
|
||||||
bcatch : from_moz(M.handlers[0]),
|
bcatch : from_moz(handlers[0]),
|
||||||
bfinally : M.finalizer ? new AST_Finally(from_moz(M.finalizer)) : null
|
bfinally : M.finalizer ? new AST_Finally(from_moz(M.finalizer)) : null
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
CatchClause : function(M) {
|
Property: function(M) {
|
||||||
return new AST_Catch({
|
var key = M.key;
|
||||||
start : my_start_token(M),
|
var args = {
|
||||||
end : my_end_token(M),
|
start : my_start_token(key),
|
||||||
argname : from_moz(M.param),
|
end : my_end_token(M.value),
|
||||||
body : from_moz(M.body).body
|
key : key.type == "Identifier" ? key.name : key.value,
|
||||||
|
value : from_moz(M.value)
|
||||||
|
};
|
||||||
|
if (M.kind == "init") return new AST_ObjectKeyVal(args);
|
||||||
|
args.key = new AST_SymbolAccessor({
|
||||||
|
name: args.key
|
||||||
|
});
|
||||||
|
args.value = new AST_Accessor(args.value);
|
||||||
|
if (M.kind == "get") return new AST_ObjectGetter(args);
|
||||||
|
if (M.kind == "set") return new AST_ObjectSetter(args);
|
||||||
|
},
|
||||||
|
ArrayExpression: function(M) {
|
||||||
|
return new AST_Array({
|
||||||
|
start : my_start_token(M),
|
||||||
|
end : my_end_token(M),
|
||||||
|
elements : M.elements.map(function(elem){
|
||||||
|
return elem === null ? new AST_Hole() : from_moz(elem);
|
||||||
|
})
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
ObjectExpression : function(M) {
|
ObjectExpression: function(M) {
|
||||||
return new AST_Object({
|
return new AST_Object({
|
||||||
start : my_start_token(M),
|
start : my_start_token(M),
|
||||||
end : my_end_token(M),
|
end : my_end_token(M),
|
||||||
properties : M.properties.map(function(prop){
|
properties : M.properties.map(function(prop){
|
||||||
var key = prop.key;
|
prop.type = "Property";
|
||||||
var name = key.type == "Identifier" ? key.name : key.value;
|
return from_moz(prop)
|
||||||
var args = {
|
|
||||||
start : my_start_token(key),
|
|
||||||
end : my_end_token(prop.value),
|
|
||||||
key : name,
|
|
||||||
value : from_moz(prop.value)
|
|
||||||
};
|
|
||||||
switch (prop.kind) {
|
|
||||||
case "init":
|
|
||||||
return new AST_ObjectKeyVal(args);
|
|
||||||
case "set":
|
|
||||||
args.value.name = from_moz(key);
|
|
||||||
return new AST_ObjectSetter(args);
|
|
||||||
case "get":
|
|
||||||
args.value.name = from_moz(key);
|
|
||||||
return new AST_ObjectGetter(args);
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
SequenceExpression : function(M) {
|
SequenceExpression: function(M) {
|
||||||
return AST_Seq.from_array(M.expressions.map(from_moz));
|
return new AST_Sequence({
|
||||||
|
start : my_start_token(M),
|
||||||
|
end : my_end_token(M),
|
||||||
|
expressions: M.expressions.map(from_moz)
|
||||||
|
});
|
||||||
},
|
},
|
||||||
MemberExpression : function(M) {
|
MemberExpression: function(M) {
|
||||||
return new (M.computed ? AST_Sub : AST_Dot)({
|
return new (M.computed ? AST_Sub : AST_Dot)({
|
||||||
start : my_start_token(M),
|
start : my_start_token(M),
|
||||||
end : my_end_token(M),
|
end : my_end_token(M),
|
||||||
@@ -100,7 +159,7 @@
|
|||||||
expression : from_moz(M.object)
|
expression : from_moz(M.object)
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
SwitchCase : function(M) {
|
SwitchCase: function(M) {
|
||||||
return new (M.test ? AST_Case : AST_Default)({
|
return new (M.test ? AST_Case : AST_Default)({
|
||||||
start : my_start_token(M),
|
start : my_start_token(M),
|
||||||
end : my_end_token(M),
|
end : my_end_token(M),
|
||||||
@@ -108,12 +167,30 @@
|
|||||||
body : M.consequent.map(from_moz)
|
body : M.consequent.map(from_moz)
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
Literal : function(M) {
|
VariableDeclaration: function(M) {
|
||||||
|
return new AST_Var({
|
||||||
|
start : my_start_token(M),
|
||||||
|
end : my_end_token(M),
|
||||||
|
definitions : M.declarations.map(from_moz)
|
||||||
|
});
|
||||||
|
},
|
||||||
|
Literal: function(M) {
|
||||||
var val = M.value, args = {
|
var val = M.value, args = {
|
||||||
start : my_start_token(M),
|
start : my_start_token(M),
|
||||||
end : my_end_token(M)
|
end : my_end_token(M)
|
||||||
};
|
};
|
||||||
if (val === null) return new AST_Null(args);
|
if (val === null) return new AST_Null(args);
|
||||||
|
var rx = M.regex;
|
||||||
|
if (rx && rx.pattern) {
|
||||||
|
// RegExpLiteral as per ESTree AST spec
|
||||||
|
args.value = new RegExp(rx.pattern, rx.flags);
|
||||||
|
args.value.raw_source = rx.pattern;
|
||||||
|
return new AST_RegExp(args);
|
||||||
|
} else if (rx) {
|
||||||
|
// support legacy RegExp
|
||||||
|
args.value = M.regex && M.raw ? M.raw : val;
|
||||||
|
return new AST_RegExp(args);
|
||||||
|
}
|
||||||
switch (typeof val) {
|
switch (typeof val) {
|
||||||
case "string":
|
case "string":
|
||||||
args.value = val;
|
args.value = val;
|
||||||
@@ -123,18 +200,12 @@
|
|||||||
return new AST_Number(args);
|
return new AST_Number(args);
|
||||||
case "boolean":
|
case "boolean":
|
||||||
return new (val ? AST_True : AST_False)(args);
|
return new (val ? AST_True : AST_False)(args);
|
||||||
default:
|
|
||||||
args.value = val;
|
|
||||||
return new AST_RegExp(args);
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
UnaryExpression: From_Moz_Unary,
|
|
||||||
UpdateExpression: From_Moz_Unary,
|
|
||||||
Identifier: function(M) {
|
Identifier: function(M) {
|
||||||
var p = FROM_MOZ_STACK[FROM_MOZ_STACK.length - 2];
|
var p = FROM_MOZ_STACK[FROM_MOZ_STACK.length - 2];
|
||||||
return new (M.name == "this" ? AST_This
|
return new ( p.type == "LabeledStatement" ? AST_Label
|
||||||
: p.type == "LabeledStatement" ? AST_Label
|
: p.type == "VariableDeclarator" && p.id === M ? AST_SymbolVar
|
||||||
: p.type == "VariableDeclarator" && p.id === M ? (p.kind == "const" ? AST_SymbolConst : AST_SymbolVar)
|
|
||||||
: p.type == "FunctionExpression" ? (p.id === M ? AST_SymbolLambda : AST_SymbolFunarg)
|
: p.type == "FunctionExpression" ? (p.id === M ? AST_SymbolLambda : AST_SymbolFunarg)
|
||||||
: p.type == "FunctionDeclaration" ? (p.id === M ? AST_SymbolDefun : AST_SymbolFunarg)
|
: p.type == "FunctionDeclaration" ? (p.id === M ? AST_SymbolDefun : AST_SymbolFunarg)
|
||||||
: p.type == "CatchClause" ? AST_SymbolCatch
|
: p.type == "CatchClause" ? AST_SymbolCatch
|
||||||
@@ -147,7 +218,8 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
function From_Moz_Unary(M) {
|
MOZ_TO_ME.UpdateExpression =
|
||||||
|
MOZ_TO_ME.UnaryExpression = function To_Moz_Unary(M) {
|
||||||
var prefix = "prefix" in M ? M.prefix
|
var prefix = "prefix" in M ? M.prefix
|
||||||
: M.type == "UnaryExpression" ? true : false;
|
: M.type == "UnaryExpression" ? true : false;
|
||||||
return new (prefix ? AST_UnaryPrefix : AST_UnaryPostfix)({
|
return new (prefix ? AST_UnaryPrefix : AST_UnaryPostfix)({
|
||||||
@@ -158,14 +230,8 @@
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
var ME_TO_MOZ = {};
|
|
||||||
|
|
||||||
map("Node", AST_Node);
|
|
||||||
map("Program", AST_Toplevel, "body@body");
|
|
||||||
map("Function", AST_Function, "id>name, params@argnames, body%body");
|
|
||||||
map("EmptyStatement", AST_EmptyStatement);
|
map("EmptyStatement", AST_EmptyStatement);
|
||||||
map("BlockStatement", AST_BlockStatement, "body@body");
|
map("BlockStatement", AST_BlockStatement, "body@body");
|
||||||
map("ExpressionStatement", AST_SimpleStatement, "expression>body");
|
|
||||||
map("IfStatement", AST_If, "test>condition, consequent>body, alternate>alternative");
|
map("IfStatement", AST_If, "test>condition, consequent>body, alternate>alternative");
|
||||||
map("LabeledStatement", AST_LabeledStatement, "label>label, body>body");
|
map("LabeledStatement", AST_LabeledStatement, "label>label, body>body");
|
||||||
map("BreakStatement", AST_Break, "label>label");
|
map("BreakStatement", AST_Break, "label>label");
|
||||||
@@ -179,72 +245,311 @@
|
|||||||
map("ForStatement", AST_For, "init>init, test>condition, update>step, body>body");
|
map("ForStatement", AST_For, "init>init, test>condition, update>step, body>body");
|
||||||
map("ForInStatement", AST_ForIn, "left>init, right>object, body>body");
|
map("ForInStatement", AST_ForIn, "left>init, right>object, body>body");
|
||||||
map("DebuggerStatement", AST_Debugger);
|
map("DebuggerStatement", AST_Debugger);
|
||||||
map("FunctionDeclaration", AST_Defun, "id>name, params@argnames, body%body");
|
|
||||||
map("VariableDeclaration", AST_Var, "declarations@definitions");
|
|
||||||
map("VariableDeclarator", AST_VarDef, "id>name, init>value");
|
map("VariableDeclarator", AST_VarDef, "id>name, init>value");
|
||||||
|
map("CatchClause", AST_Catch, "param>argname, body%body");
|
||||||
|
|
||||||
map("ThisExpression", AST_This);
|
map("ThisExpression", AST_This);
|
||||||
map("ArrayExpression", AST_Array, "elements@elements");
|
|
||||||
map("FunctionExpression", AST_Function, "id>name, params@argnames, body%body");
|
|
||||||
map("BinaryExpression", AST_Binary, "operator=operator, left>left, right>right");
|
map("BinaryExpression", AST_Binary, "operator=operator, left>left, right>right");
|
||||||
map("AssignmentExpression", AST_Assign, "operator=operator, left>left, right>right");
|
|
||||||
map("LogicalExpression", AST_Binary, "operator=operator, left>left, right>right");
|
map("LogicalExpression", AST_Binary, "operator=operator, left>left, right>right");
|
||||||
|
map("AssignmentExpression", AST_Assign, "operator=operator, left>left, right>right");
|
||||||
map("ConditionalExpression", AST_Conditional, "test>condition, consequent>consequent, alternate>alternative");
|
map("ConditionalExpression", AST_Conditional, "test>condition, consequent>consequent, alternate>alternative");
|
||||||
map("NewExpression", AST_New, "callee>expression, arguments@args");
|
map("NewExpression", AST_New, "callee>expression, arguments@args");
|
||||||
map("CallExpression", AST_Call, "callee>expression, arguments@args");
|
map("CallExpression", AST_Call, "callee>expression, arguments@args");
|
||||||
|
|
||||||
|
def_to_moz(AST_Toplevel, function To_Moz_Program(M) {
|
||||||
|
return to_moz_scope("Program", M);
|
||||||
|
});
|
||||||
|
|
||||||
|
def_to_moz(AST_Defun, function To_Moz_FunctionDeclaration(M) {
|
||||||
|
return {
|
||||||
|
type: "FunctionDeclaration",
|
||||||
|
id: to_moz(M.name),
|
||||||
|
params: M.argnames.map(to_moz),
|
||||||
|
body: to_moz_scope("BlockStatement", M)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
def_to_moz(AST_Function, function To_Moz_FunctionExpression(M) {
|
||||||
|
return {
|
||||||
|
type: "FunctionExpression",
|
||||||
|
id: to_moz(M.name),
|
||||||
|
params: M.argnames.map(to_moz),
|
||||||
|
body: to_moz_scope("BlockStatement", M)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
def_to_moz(AST_Directive, function To_Moz_Directive(M) {
|
||||||
|
return {
|
||||||
|
type: "ExpressionStatement",
|
||||||
|
expression: {
|
||||||
|
type: "Literal",
|
||||||
|
value: M.value
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
def_to_moz(AST_SimpleStatement, function To_Moz_ExpressionStatement(M) {
|
||||||
|
return {
|
||||||
|
type: "ExpressionStatement",
|
||||||
|
expression: to_moz(M.body)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
def_to_moz(AST_SwitchBranch, function To_Moz_SwitchCase(M) {
|
||||||
|
return {
|
||||||
|
type: "SwitchCase",
|
||||||
|
test: to_moz(M.expression),
|
||||||
|
consequent: M.body.map(to_moz)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
def_to_moz(AST_Try, function To_Moz_TryStatement(M) {
|
||||||
|
return {
|
||||||
|
type: "TryStatement",
|
||||||
|
block: to_moz_block(M),
|
||||||
|
handler: to_moz(M.bcatch),
|
||||||
|
guardedHandlers: [],
|
||||||
|
finalizer: to_moz(M.bfinally)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
def_to_moz(AST_Catch, function To_Moz_CatchClause(M) {
|
||||||
|
return {
|
||||||
|
type: "CatchClause",
|
||||||
|
param: to_moz(M.argname),
|
||||||
|
guard: null,
|
||||||
|
body: to_moz_block(M)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
def_to_moz(AST_Definitions, function To_Moz_VariableDeclaration(M) {
|
||||||
|
return {
|
||||||
|
type: "VariableDeclaration",
|
||||||
|
kind: "var",
|
||||||
|
declarations: M.definitions.map(to_moz)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
def_to_moz(AST_Sequence, function To_Moz_SequenceExpression(M) {
|
||||||
|
return {
|
||||||
|
type: "SequenceExpression",
|
||||||
|
expressions: M.expressions.map(to_moz)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
def_to_moz(AST_PropAccess, function To_Moz_MemberExpression(M) {
|
||||||
|
var isComputed = M instanceof AST_Sub;
|
||||||
|
return {
|
||||||
|
type: "MemberExpression",
|
||||||
|
object: to_moz(M.expression),
|
||||||
|
computed: isComputed,
|
||||||
|
property: isComputed ? to_moz(M.property) : {type: "Identifier", name: M.property}
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
def_to_moz(AST_Unary, function To_Moz_Unary(M) {
|
||||||
|
return {
|
||||||
|
type: M.operator == "++" || M.operator == "--" ? "UpdateExpression" : "UnaryExpression",
|
||||||
|
operator: M.operator,
|
||||||
|
prefix: M instanceof AST_UnaryPrefix,
|
||||||
|
argument: to_moz(M.expression)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
def_to_moz(AST_Binary, function To_Moz_BinaryExpression(M) {
|
||||||
|
return {
|
||||||
|
type: M.operator == "&&" || M.operator == "||" ? "LogicalExpression" : "BinaryExpression",
|
||||||
|
left: to_moz(M.left),
|
||||||
|
operator: M.operator,
|
||||||
|
right: to_moz(M.right)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
def_to_moz(AST_Array, function To_Moz_ArrayExpression(M) {
|
||||||
|
return {
|
||||||
|
type: "ArrayExpression",
|
||||||
|
elements: M.elements.map(to_moz)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
def_to_moz(AST_Object, function To_Moz_ObjectExpression(M) {
|
||||||
|
return {
|
||||||
|
type: "ObjectExpression",
|
||||||
|
properties: M.properties.map(to_moz)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
def_to_moz(AST_ObjectProperty, function To_Moz_Property(M) {
|
||||||
|
var key = {
|
||||||
|
type: "Literal",
|
||||||
|
value: M.key instanceof AST_SymbolAccessor ? M.key.name : M.key
|
||||||
|
};
|
||||||
|
var kind;
|
||||||
|
if (M instanceof AST_ObjectKeyVal) {
|
||||||
|
kind = "init";
|
||||||
|
} else
|
||||||
|
if (M instanceof AST_ObjectGetter) {
|
||||||
|
kind = "get";
|
||||||
|
} else
|
||||||
|
if (M instanceof AST_ObjectSetter) {
|
||||||
|
kind = "set";
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
type: "Property",
|
||||||
|
kind: kind,
|
||||||
|
key: key,
|
||||||
|
value: to_moz(M.value)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
def_to_moz(AST_Symbol, function To_Moz_Identifier(M) {
|
||||||
|
var def = M.definition();
|
||||||
|
return {
|
||||||
|
type: "Identifier",
|
||||||
|
name: def ? def.mangled_name || def.name : M.name
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
def_to_moz(AST_RegExp, function To_Moz_RegExpLiteral(M) {
|
||||||
|
var flags = M.value.toString().match(/[gimuy]*$/)[0];
|
||||||
|
var value = "/" + M.value.raw_source + "/" + flags;
|
||||||
|
return {
|
||||||
|
type: "Literal",
|
||||||
|
value: value,
|
||||||
|
raw: value,
|
||||||
|
regex: {
|
||||||
|
pattern: M.value.raw_source,
|
||||||
|
flags: flags
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
def_to_moz(AST_Constant, function To_Moz_Literal(M) {
|
||||||
|
var value = M.value;
|
||||||
|
if (typeof value === 'number' && (value < 0 || (value === 0 && 1 / value < 0))) {
|
||||||
|
return {
|
||||||
|
type: "UnaryExpression",
|
||||||
|
operator: "-",
|
||||||
|
prefix: true,
|
||||||
|
argument: {
|
||||||
|
type: "Literal",
|
||||||
|
value: -value,
|
||||||
|
raw: M.start.raw
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
type: "Literal",
|
||||||
|
value: value,
|
||||||
|
raw: M.start.raw
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
def_to_moz(AST_Atom, function To_Moz_Atom(M) {
|
||||||
|
return {
|
||||||
|
type: "Identifier",
|
||||||
|
name: String(M.value)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
AST_Boolean.DEFMETHOD("to_mozilla_ast", AST_Constant.prototype.to_mozilla_ast);
|
||||||
|
AST_Null.DEFMETHOD("to_mozilla_ast", AST_Constant.prototype.to_mozilla_ast);
|
||||||
|
AST_Hole.DEFMETHOD("to_mozilla_ast", function To_Moz_ArrayHole() { return null });
|
||||||
|
|
||||||
|
AST_Block.DEFMETHOD("to_mozilla_ast", AST_BlockStatement.prototype.to_mozilla_ast);
|
||||||
|
AST_Lambda.DEFMETHOD("to_mozilla_ast", AST_Function.prototype.to_mozilla_ast);
|
||||||
|
|
||||||
/* -----[ tools ]----- */
|
/* -----[ tools ]----- */
|
||||||
|
|
||||||
|
function raw_token(moznode) {
|
||||||
|
if (moznode.type == "Literal") {
|
||||||
|
return moznode.raw != null ? moznode.raw : moznode.value + "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function my_start_token(moznode) {
|
function my_start_token(moznode) {
|
||||||
|
var loc = moznode.loc, start = loc && loc.start;
|
||||||
|
var range = moznode.range;
|
||||||
return new AST_Token({
|
return new AST_Token({
|
||||||
file : moznode.loc && moznode.loc.source,
|
file : loc && loc.source,
|
||||||
line : moznode.loc && moznode.loc.start.line,
|
line : start && start.line,
|
||||||
col : moznode.loc && moznode.loc.start.column,
|
col : start && start.column,
|
||||||
pos : moznode.start,
|
pos : range ? range[0] : moznode.start,
|
||||||
endpos : moznode.start
|
endline : start && start.line,
|
||||||
|
endcol : start && start.column,
|
||||||
|
endpos : range ? range[0] : moznode.start,
|
||||||
|
raw : raw_token(moznode),
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
function my_end_token(moznode) {
|
function my_end_token(moznode) {
|
||||||
|
var loc = moznode.loc, end = loc && loc.end;
|
||||||
|
var range = moznode.range;
|
||||||
return new AST_Token({
|
return new AST_Token({
|
||||||
file : moznode.loc && moznode.loc.source,
|
file : loc && loc.source,
|
||||||
line : moznode.loc && moznode.loc.end.line,
|
line : end && end.line,
|
||||||
col : moznode.loc && moznode.loc.end.column,
|
col : end && end.column,
|
||||||
pos : moznode.end,
|
pos : range ? range[1] : moznode.end,
|
||||||
endpos : moznode.end
|
endline : end && end.line,
|
||||||
|
endcol : end && end.column,
|
||||||
|
endpos : range ? range[1] : moznode.end,
|
||||||
|
raw : raw_token(moznode),
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
function map(moztype, mytype, propmap) {
|
function map(moztype, mytype, propmap) {
|
||||||
var moz_to_me = "function From_Moz_" + moztype + "(M){\n";
|
var moz_to_me = "function From_Moz_" + moztype + "(M){\n";
|
||||||
moz_to_me += "return new mytype({\n" +
|
moz_to_me += "return new U2." + mytype.name + "({\n" +
|
||||||
"start: my_start_token(M),\n" +
|
"start: my_start_token(M),\n" +
|
||||||
"end: my_end_token(M)";
|
"end: my_end_token(M)";
|
||||||
|
|
||||||
|
var me_to_moz = "function To_Moz_" + moztype + "(M){\n";
|
||||||
|
me_to_moz += "return {\n" +
|
||||||
|
"type: " + JSON.stringify(moztype);
|
||||||
|
|
||||||
if (propmap) propmap.split(/\s*,\s*/).forEach(function(prop){
|
if (propmap) propmap.split(/\s*,\s*/).forEach(function(prop){
|
||||||
var m = /([a-z0-9$_]+)(=|@|>|%)([a-z0-9$_]+)/i.exec(prop);
|
var m = /([a-z0-9$_]+)(=|@|>|%)([a-z0-9$_]+)/i.exec(prop);
|
||||||
if (!m) throw new Error("Can't understand property map: " + prop);
|
if (!m) throw new Error("Can't understand property map: " + prop);
|
||||||
var moz = "M." + m[1], how = m[2], my = m[3];
|
var moz = m[1], how = m[2], my = m[3];
|
||||||
moz_to_me += ",\n" + my + ": ";
|
moz_to_me += ",\n" + my + ": ";
|
||||||
if (how == "@") {
|
me_to_moz += ",\n" + moz + ": ";
|
||||||
moz_to_me += moz + ".map(from_moz)";
|
switch (how) {
|
||||||
} else if (how == ">") {
|
case "@":
|
||||||
moz_to_me += "from_moz(" + moz + ")";
|
moz_to_me += "M." + moz + ".map(from_moz)";
|
||||||
} else if (how == "=") {
|
me_to_moz += "M." + my + ".map(to_moz)";
|
||||||
moz_to_me += moz;
|
break;
|
||||||
} else if (how == "%") {
|
case ">":
|
||||||
moz_to_me += "from_moz(" + moz + ").body";
|
moz_to_me += "from_moz(M." + moz + ")";
|
||||||
} else throw new Error("Can't understand operator in propmap: " + prop);
|
me_to_moz += "to_moz(M." + my + ")";
|
||||||
|
break;
|
||||||
|
case "=":
|
||||||
|
moz_to_me += "M." + moz;
|
||||||
|
me_to_moz += "M." + my;
|
||||||
|
break;
|
||||||
|
case "%":
|
||||||
|
moz_to_me += "from_moz(M." + moz + ").body";
|
||||||
|
me_to_moz += "to_moz_block(M)";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Error("Can't understand operator in propmap: " + prop);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
moz_to_me += "\n})}";
|
|
||||||
|
|
||||||
// moz_to_me = parse(moz_to_me).print_to_string({ beautify: true });
|
moz_to_me += "\n})\n}";
|
||||||
// console.log(moz_to_me);
|
me_to_moz += "\n}\n}";
|
||||||
|
|
||||||
moz_to_me = new Function("mytype", "my_start_token", "my_end_token", "from_moz", "return(" + moz_to_me + ")")(
|
//moz_to_me = parse(moz_to_me).print_to_string({ beautify: true });
|
||||||
mytype, my_start_token, my_end_token, from_moz
|
//me_to_moz = parse(me_to_moz).print_to_string({ beautify: true });
|
||||||
|
//console.log(moz_to_me);
|
||||||
|
|
||||||
|
moz_to_me = new Function("U2", "my_start_token", "my_end_token", "from_moz", "return(" + moz_to_me + ")")(
|
||||||
|
exports, my_start_token, my_end_token, from_moz
|
||||||
);
|
);
|
||||||
return MOZ_TO_ME[moztype] = moz_to_me;
|
me_to_moz = new Function("to_moz", "to_moz_block", "to_moz_scope", "return(" + me_to_moz + ")")(
|
||||||
|
to_moz, to_moz_block, to_moz_scope
|
||||||
|
);
|
||||||
|
MOZ_TO_ME[moztype] = moz_to_me;
|
||||||
|
def_to_moz(mytype, me_to_moz);
|
||||||
};
|
};
|
||||||
|
|
||||||
var FROM_MOZ_STACK = null;
|
var FROM_MOZ_STACK = null;
|
||||||
@@ -261,7 +566,67 @@
|
|||||||
FROM_MOZ_STACK = [];
|
FROM_MOZ_STACK = [];
|
||||||
var ast = from_moz(node);
|
var ast = from_moz(node);
|
||||||
FROM_MOZ_STACK = save_stack;
|
FROM_MOZ_STACK = save_stack;
|
||||||
|
ast.walk(new TreeWalker(function(node) {
|
||||||
|
if (node instanceof AST_LabelRef) {
|
||||||
|
for (var level = 0, parent; parent = this.parent(level); level++) {
|
||||||
|
if (parent instanceof AST_Scope) break;
|
||||||
|
if (parent instanceof AST_LabeledStatement && parent.label.name == node.name) {
|
||||||
|
node.thedef = parent.label;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!node.thedef) {
|
||||||
|
var s = node.start;
|
||||||
|
js_error("Undefined label " + node.name, s.file, s.line, s.col, s.pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}));
|
||||||
return ast;
|
return ast;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function set_moz_loc(mynode, moznode, myparent) {
|
||||||
|
var start = mynode.start;
|
||||||
|
var end = mynode.end;
|
||||||
|
if (start.pos != null && end.endpos != null) {
|
||||||
|
moznode.range = [start.pos, end.endpos];
|
||||||
|
}
|
||||||
|
if (start.line) {
|
||||||
|
moznode.loc = {
|
||||||
|
start: {line: start.line, column: start.col},
|
||||||
|
end: end.endline ? {line: end.endline, column: end.endcol} : null
|
||||||
|
};
|
||||||
|
if (start.file) {
|
||||||
|
moznode.loc.source = start.file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return moznode;
|
||||||
|
};
|
||||||
|
|
||||||
|
function def_to_moz(mytype, handler) {
|
||||||
|
mytype.DEFMETHOD("to_mozilla_ast", function() {
|
||||||
|
return set_moz_loc(this, handler(this));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
function to_moz(node) {
|
||||||
|
return node != null ? node.to_mozilla_ast() : null;
|
||||||
|
};
|
||||||
|
|
||||||
|
function to_moz_block(node) {
|
||||||
|
return {
|
||||||
|
type: "BlockStatement",
|
||||||
|
body: node.body.map(to_moz)
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
function to_moz_scope(type, node) {
|
||||||
|
var body = node.body.map(to_moz);
|
||||||
|
if (node.body[0] instanceof AST_SimpleStatement && node.body[0].body instanceof AST_String) {
|
||||||
|
body.unshift(to_moz(new AST_EmptyStatement(node.body[0])));
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
type: type,
|
||||||
|
body: body
|
||||||
|
};
|
||||||
|
};
|
||||||
})();
|
})();
|
||||||
|
|||||||
1005
lib/output.js
1005
lib/output.js
File diff suppressed because it is too large
Load Diff
646
lib/parse.js
646
lib/parse.js
File diff suppressed because it is too large
Load Diff
244
lib/propmangle.js
Normal file
244
lib/propmangle.js
Normal file
@@ -0,0 +1,244 @@
|
|||||||
|
/***********************************************************************
|
||||||
|
|
||||||
|
A JavaScript tokenizer / parser / beautifier / compressor.
|
||||||
|
https://github.com/mishoo/UglifyJS2
|
||||||
|
|
||||||
|
-------------------------------- (C) ---------------------------------
|
||||||
|
|
||||||
|
Author: Mihai Bazon
|
||||||
|
<mihai.bazon@gmail.com>
|
||||||
|
http://mihai.bazon.net/blog
|
||||||
|
|
||||||
|
Distributed under the BSD license:
|
||||||
|
|
||||||
|
Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above
|
||||||
|
copyright notice, this list of conditions and the following
|
||||||
|
disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following
|
||||||
|
disclaimer in the documentation and/or other materials
|
||||||
|
provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
|
||||||
|
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||||
|
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
||||||
|
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||||
|
THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGE.
|
||||||
|
|
||||||
|
***********************************************************************/
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
function find_builtins(reserved) {
|
||||||
|
// NaN will be included due to Number.NaN
|
||||||
|
[
|
||||||
|
"null",
|
||||||
|
"true",
|
||||||
|
"false",
|
||||||
|
"Infinity",
|
||||||
|
"-Infinity",
|
||||||
|
"undefined",
|
||||||
|
].forEach(add);
|
||||||
|
[ Object, Array, Function, Number,
|
||||||
|
String, Boolean, Error, Math,
|
||||||
|
Date, RegExp
|
||||||
|
].forEach(function(ctor){
|
||||||
|
Object.getOwnPropertyNames(ctor).map(add);
|
||||||
|
if (ctor.prototype) {
|
||||||
|
Object.getOwnPropertyNames(ctor.prototype).map(add);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
function add(name) {
|
||||||
|
push_uniq(reserved, name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function reserve_quoted_keys(ast, reserved) {
|
||||||
|
function add(name) {
|
||||||
|
push_uniq(reserved, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
ast.walk(new TreeWalker(function(node) {
|
||||||
|
if (node instanceof AST_ObjectKeyVal && node.quote) {
|
||||||
|
add(node.key);
|
||||||
|
} else if (node instanceof AST_Sub) {
|
||||||
|
addStrings(node.property, add);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
function addStrings(node, add) {
|
||||||
|
node.walk(new TreeWalker(function(node) {
|
||||||
|
if (node instanceof AST_Sequence) {
|
||||||
|
addStrings(node.tail_node(), add);
|
||||||
|
} else if (node instanceof AST_String) {
|
||||||
|
add(node.value);
|
||||||
|
} else if (node instanceof AST_Conditional) {
|
||||||
|
addStrings(node.consequent, add);
|
||||||
|
addStrings(node.alternative, add);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
function mangle_properties(ast, options) {
|
||||||
|
options = defaults(options, {
|
||||||
|
builtins: false,
|
||||||
|
cache: null,
|
||||||
|
debug: false,
|
||||||
|
keep_quoted: false,
|
||||||
|
only_cache: false,
|
||||||
|
regex: null,
|
||||||
|
reserved: null,
|
||||||
|
}, true);
|
||||||
|
|
||||||
|
var reserved = options.reserved;
|
||||||
|
if (!Array.isArray(reserved)) reserved = [];
|
||||||
|
if (!options.builtins) find_builtins(reserved);
|
||||||
|
|
||||||
|
var cname = -1;
|
||||||
|
var cache;
|
||||||
|
if (options.cache) {
|
||||||
|
cache = options.cache.props;
|
||||||
|
cache.each(function(mangled_name) {
|
||||||
|
push_uniq(reserved, mangled_name);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
cache = new Dictionary();
|
||||||
|
}
|
||||||
|
|
||||||
|
var regex = options.regex;
|
||||||
|
|
||||||
|
// note debug is either false (disabled), or a string of the debug suffix to use (enabled).
|
||||||
|
// note debug may be enabled as an empty string, which is falsey. Also treat passing 'true'
|
||||||
|
// the same as passing an empty string.
|
||||||
|
var debug = options.debug !== false;
|
||||||
|
var debug_name_suffix;
|
||||||
|
if (debug) {
|
||||||
|
debug_name_suffix = (options.debug === true ? "" : options.debug);
|
||||||
|
}
|
||||||
|
|
||||||
|
var names_to_mangle = [];
|
||||||
|
var unmangleable = [];
|
||||||
|
|
||||||
|
// step 1: find candidates to mangle
|
||||||
|
ast.walk(new TreeWalker(function(node){
|
||||||
|
if (node instanceof AST_ObjectKeyVal) {
|
||||||
|
add(node.key);
|
||||||
|
}
|
||||||
|
else if (node instanceof AST_ObjectProperty) {
|
||||||
|
// setter or getter, since KeyVal is handled above
|
||||||
|
add(node.key.name);
|
||||||
|
}
|
||||||
|
else if (node instanceof AST_Dot) {
|
||||||
|
add(node.property);
|
||||||
|
}
|
||||||
|
else if (node instanceof AST_Sub) {
|
||||||
|
addStrings(node.property, add);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
// step 2: transform the tree, renaming properties
|
||||||
|
return ast.transform(new TreeTransformer(function(node){
|
||||||
|
if (node instanceof AST_ObjectKeyVal) {
|
||||||
|
node.key = mangle(node.key);
|
||||||
|
}
|
||||||
|
else if (node instanceof AST_ObjectProperty) {
|
||||||
|
// setter or getter
|
||||||
|
node.key.name = mangle(node.key.name);
|
||||||
|
}
|
||||||
|
else if (node instanceof AST_Dot) {
|
||||||
|
node.property = mangle(node.property);
|
||||||
|
}
|
||||||
|
else if (!options.keep_quoted && node instanceof AST_Sub) {
|
||||||
|
node.property = mangleStrings(node.property);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
// only function declarations after this line
|
||||||
|
|
||||||
|
function can_mangle(name) {
|
||||||
|
if (unmangleable.indexOf(name) >= 0) return false;
|
||||||
|
if (reserved.indexOf(name) >= 0) return false;
|
||||||
|
if (options.only_cache) {
|
||||||
|
return cache.has(name);
|
||||||
|
}
|
||||||
|
if (/^-?[0-9]+(\.[0-9]+)?(e[+-][0-9]+)?$/.test(name)) return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function should_mangle(name) {
|
||||||
|
if (regex && !regex.test(name)) return false;
|
||||||
|
if (reserved.indexOf(name) >= 0) return false;
|
||||||
|
return cache.has(name)
|
||||||
|
|| names_to_mangle.indexOf(name) >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function add(name) {
|
||||||
|
if (can_mangle(name))
|
||||||
|
push_uniq(names_to_mangle, name);
|
||||||
|
|
||||||
|
if (!should_mangle(name)) {
|
||||||
|
push_uniq(unmangleable, name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function mangle(name) {
|
||||||
|
if (!should_mangle(name)) {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
var mangled = cache.get(name);
|
||||||
|
if (!mangled) {
|
||||||
|
if (debug) {
|
||||||
|
// debug mode: use a prefix and suffix to preserve readability, e.g. o.foo -> o._$foo$NNN_.
|
||||||
|
var debug_mangled = "_$" + name + "$" + debug_name_suffix + "_";
|
||||||
|
|
||||||
|
if (can_mangle(debug_mangled)) {
|
||||||
|
mangled = debug_mangled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// either debug mode is off, or it is on and we could not use the mangled name
|
||||||
|
if (!mangled) {
|
||||||
|
do {
|
||||||
|
mangled = base54(++cname);
|
||||||
|
} while (!can_mangle(mangled));
|
||||||
|
}
|
||||||
|
|
||||||
|
cache.set(name, mangled);
|
||||||
|
}
|
||||||
|
return mangled;
|
||||||
|
}
|
||||||
|
|
||||||
|
function mangleStrings(node) {
|
||||||
|
return node.transform(new TreeTransformer(function(node){
|
||||||
|
if (node instanceof AST_Sequence) {
|
||||||
|
var last = node.expressions.length - 1;
|
||||||
|
node.expressions[last] = mangleStrings(node.expressions[last]);
|
||||||
|
}
|
||||||
|
else if (node instanceof AST_String) {
|
||||||
|
node.value = mangle(node.value);
|
||||||
|
}
|
||||||
|
else if (node instanceof AST_Conditional) {
|
||||||
|
node.consequent = mangleStrings(node.consequent);
|
||||||
|
node.alternative = mangleStrings(node.alternative);
|
||||||
|
}
|
||||||
|
return node;
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
691
lib/scope.js
691
lib/scope.js
@@ -43,69 +43,83 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function SymbolDef(scope, index, orig) {
|
function SymbolDef(scope, orig, init) {
|
||||||
this.name = orig.name;
|
this.name = orig.name;
|
||||||
this.orig = [ orig ];
|
this.orig = [ orig ];
|
||||||
|
this.init = init;
|
||||||
|
this.eliminated = 0;
|
||||||
this.scope = scope;
|
this.scope = scope;
|
||||||
this.references = [];
|
this.references = [];
|
||||||
|
this.replaced = 0;
|
||||||
this.global = false;
|
this.global = false;
|
||||||
this.mangled_name = null;
|
this.mangled_name = null;
|
||||||
this.undeclared = false;
|
this.undeclared = false;
|
||||||
this.constant = false;
|
this.id = SymbolDef.next_id++;
|
||||||
this.index = index;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
SymbolDef.next_id = 1;
|
||||||
|
|
||||||
SymbolDef.prototype = {
|
SymbolDef.prototype = {
|
||||||
unmangleable: function(options) {
|
unmangleable: function(options) {
|
||||||
return (this.global && !(options && options.toplevel))
|
if (!options) options = {};
|
||||||
|
|
||||||
|
return (this.global && !options.toplevel)
|
||||||
|| this.undeclared
|
|| this.undeclared
|
||||||
|| (!(options && options.eval) && (this.scope.uses_eval || this.scope.uses_with));
|
|| (!options.eval && (this.scope.uses_eval || this.scope.uses_with))
|
||||||
|
|| (options.keep_fnames
|
||||||
|
&& (this.orig[0] instanceof AST_SymbolLambda
|
||||||
|
|| this.orig[0] instanceof AST_SymbolDefun));
|
||||||
},
|
},
|
||||||
mangle: function(options) {
|
mangle: function(options) {
|
||||||
if (!this.mangled_name && !this.unmangleable(options)) {
|
var cache = options.cache && options.cache.props;
|
||||||
var s = this.scope;
|
if (this.global && cache && cache.has(this.name)) {
|
||||||
if (!options.screw_ie8 && this.orig[0] instanceof AST_SymbolLambda)
|
this.mangled_name = cache.get(this.name);
|
||||||
s = s.parent_scope;
|
} else if (!this.mangled_name && !this.unmangleable(options)) {
|
||||||
this.mangled_name = s.next_mangled(options, this);
|
var def;
|
||||||
|
if (def = this.redefined()) {
|
||||||
|
this.mangled_name = def.mangled_name || def.name;
|
||||||
|
} else {
|
||||||
|
this.mangled_name = next_mangled_name(this.scope, options, this);
|
||||||
|
}
|
||||||
|
if (this.global && cache) {
|
||||||
|
cache.set(this.name, this.mangled_name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
redefined: function() {
|
||||||
|
return this.defun && this.defun.variables.get(this.name);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
||||||
options = defaults(options, {
|
options = defaults(options, {
|
||||||
screw_ie8: false
|
cache: null,
|
||||||
|
ie8: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
// pass 1: setup scope chaining and handle definitions
|
// pass 1: setup scope chaining and handle definitions
|
||||||
var self = this;
|
var self = this;
|
||||||
var scope = self.parent_scope = null;
|
var scope = self.parent_scope = null;
|
||||||
var defun = null;
|
var defun = null;
|
||||||
var nesting = 0;
|
|
||||||
var tw = new TreeWalker(function(node, descend){
|
var tw = new TreeWalker(function(node, descend){
|
||||||
if (options.screw_ie8 && node instanceof AST_Catch) {
|
if (node instanceof AST_Catch) {
|
||||||
var save_scope = scope;
|
var save_scope = scope;
|
||||||
scope = new AST_Scope(node);
|
scope = new AST_Scope(node);
|
||||||
scope.init_scope_vars(nesting);
|
scope.init_scope_vars(save_scope);
|
||||||
scope.parent_scope = save_scope;
|
|
||||||
descend();
|
descend();
|
||||||
scope = save_scope;
|
scope = save_scope;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Scope) {
|
if (node instanceof AST_Scope) {
|
||||||
node.init_scope_vars(nesting);
|
node.init_scope_vars(scope);
|
||||||
var save_scope = node.parent_scope = scope;
|
var save_scope = scope;
|
||||||
var save_defun = defun;
|
var save_defun = defun;
|
||||||
defun = scope = node;
|
defun = scope = node;
|
||||||
++nesting; descend(); --nesting;
|
descend();
|
||||||
scope = save_scope;
|
scope = save_scope;
|
||||||
defun = save_defun;
|
defun = save_defun;
|
||||||
return true; // don't descend again in TreeWalker
|
return true; // don't descend again in TreeWalker
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Directive) {
|
|
||||||
node.scope = scope;
|
|
||||||
push_uniq(scope.directives, node.value);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (node instanceof AST_With) {
|
if (node instanceof AST_With) {
|
||||||
for (var s = scope; s; s = s.parent_scope)
|
for (var s = scope; s; s = s.parent_scope)
|
||||||
s.uses_with = true;
|
s.uses_with = true;
|
||||||
@@ -114,8 +128,12 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
if (node instanceof AST_Symbol) {
|
if (node instanceof AST_Symbol) {
|
||||||
node.scope = scope;
|
node.scope = scope;
|
||||||
}
|
}
|
||||||
|
if (node instanceof AST_Label) {
|
||||||
|
node.thedef = node;
|
||||||
|
node.references = [];
|
||||||
|
}
|
||||||
if (node instanceof AST_SymbolLambda) {
|
if (node instanceof AST_SymbolLambda) {
|
||||||
defun.def_function(node);
|
defun.def_function(node, node.name == "arguments" ? undefined : defun);
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_SymbolDefun) {
|
else if (node instanceof AST_SymbolDefun) {
|
||||||
// Careful here, the scope where this should be defined is
|
// Careful here, the scope where this should be defined is
|
||||||
@@ -123,94 +141,133 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
|
|||||||
// scope when we encounter the AST_Defun node (which is
|
// scope when we encounter the AST_Defun node (which is
|
||||||
// instanceof AST_Scope) but we get to the symbol a bit
|
// instanceof AST_Scope) but we get to the symbol a bit
|
||||||
// later.
|
// later.
|
||||||
(node.scope = defun.parent_scope).def_function(node);
|
(node.scope = defun.parent_scope).def_function(node, defun);
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_SymbolVar
|
else if (node instanceof AST_SymbolVar) {
|
||||||
|| node instanceof AST_SymbolConst) {
|
defun.def_variable(node, node.TYPE == "SymbolVar" ? null : undefined);
|
||||||
var def = defun.def_variable(node);
|
if (defun !== scope) {
|
||||||
def.constant = node instanceof AST_SymbolConst;
|
node.mark_enclosed(options);
|
||||||
def.init = tw.parent().value;
|
var def = scope.find_variable(node);
|
||||||
|
if (node.thedef !== def) {
|
||||||
|
node.thedef = def;
|
||||||
|
}
|
||||||
|
node.reference(options);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (node instanceof AST_SymbolCatch) {
|
else if (node instanceof AST_SymbolCatch) {
|
||||||
(options.screw_ie8 ? scope : defun)
|
scope.def_variable(node).defun = defun;
|
||||||
.def_variable(node);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
self.walk(tw);
|
self.walk(tw);
|
||||||
|
|
||||||
// pass 2: find back references and eval
|
// pass 2: find back references and eval
|
||||||
var func = null;
|
self.globals = new Dictionary();
|
||||||
var globals = self.globals = new Dictionary();
|
|
||||||
var tw = new TreeWalker(function(node, descend){
|
var tw = new TreeWalker(function(node, descend){
|
||||||
if (node instanceof AST_Lambda) {
|
if (node instanceof AST_LoopControl && node.label) {
|
||||||
var prev_func = func;
|
node.label.thedef.references.push(node);
|
||||||
func = node;
|
|
||||||
descend();
|
|
||||||
func = prev_func;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (node instanceof AST_SymbolRef) {
|
if (node instanceof AST_SymbolRef) {
|
||||||
var name = node.name;
|
var name = node.name;
|
||||||
|
if (name == "eval" && tw.parent() instanceof AST_Call) {
|
||||||
|
for (var s = node.scope; s && !s.uses_eval; s = s.parent_scope) {
|
||||||
|
s.uses_eval = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
var sym = node.scope.find_variable(name);
|
var sym = node.scope.find_variable(name);
|
||||||
if (!sym) {
|
if (!sym) {
|
||||||
var g;
|
sym = self.def_global(node);
|
||||||
if (globals.has(name)) {
|
} else if (sym.scope instanceof AST_Lambda && name == "arguments") {
|
||||||
g = globals.get(name);
|
sym.scope.uses_arguments = true;
|
||||||
} else {
|
|
||||||
g = new SymbolDef(self, globals.size(), node);
|
|
||||||
g.undeclared = true;
|
|
||||||
g.global = true;
|
|
||||||
globals.set(name, g);
|
|
||||||
}
|
|
||||||
node.thedef = g;
|
|
||||||
if (name == "eval" && tw.parent() instanceof AST_Call) {
|
|
||||||
for (var s = node.scope; s && !s.uses_eval; s = s.parent_scope)
|
|
||||||
s.uses_eval = true;
|
|
||||||
}
|
|
||||||
if (func && name == "arguments") {
|
|
||||||
func.uses_arguments = true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
node.thedef = sym;
|
|
||||||
}
|
}
|
||||||
node.reference();
|
node.thedef = sym;
|
||||||
|
node.reference(options);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
// ensure mangling works if catch reuses a scope variable
|
||||||
|
var def;
|
||||||
|
if (node instanceof AST_SymbolCatch && (def = node.definition().redefined())) {
|
||||||
|
var s = node.scope;
|
||||||
|
while (s) {
|
||||||
|
push_uniq(s.enclosed, def);
|
||||||
|
if (s === def.scope) break;
|
||||||
|
s = s.parent_scope;
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
self.walk(tw);
|
self.walk(tw);
|
||||||
|
|
||||||
|
// pass 3: fix up any scoping issue with IE8
|
||||||
|
if (options.ie8) {
|
||||||
|
self.walk(new TreeWalker(function(node, descend) {
|
||||||
|
if (node instanceof AST_SymbolCatch) {
|
||||||
|
var name = node.name;
|
||||||
|
var refs = node.thedef.references;
|
||||||
|
var scope = node.thedef.defun;
|
||||||
|
var def = scope.find_variable(name) || self.globals.get(name) || scope.def_variable(node);
|
||||||
|
refs.forEach(function(ref) {
|
||||||
|
ref.thedef = def;
|
||||||
|
ref.reference(options);
|
||||||
|
});
|
||||||
|
node.thedef = def;
|
||||||
|
node.reference(options);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("init_scope_vars", function(nesting){
|
AST_Toplevel.DEFMETHOD("def_global", function(node){
|
||||||
this.directives = []; // contains the directives defined in this scope, i.e. "use strict"
|
var globals = this.globals, name = node.name;
|
||||||
this.variables = new Dictionary(); // map name to AST_SymbolVar (variables defined in this scope; includes functions)
|
if (globals.has(name)) {
|
||||||
this.functions = new Dictionary(); // map name to AST_SymbolDefun (functions defined in this scope)
|
return globals.get(name);
|
||||||
this.uses_with = false; // will be set to true if this or some nested scope uses the `with` statement
|
} else {
|
||||||
this.uses_eval = false; // will be set to true if this or nested scope uses the global `eval`
|
var g = new SymbolDef(this, node);
|
||||||
this.parent_scope = null; // the parent scope
|
g.undeclared = true;
|
||||||
this.enclosed = []; // a list of variables from this or outer scope(s) that are referenced from this or inner scopes
|
g.global = true;
|
||||||
this.cname = -1; // the current index for mangling functions/variables
|
globals.set(name, g);
|
||||||
this.nesting = nesting; // the nesting level of this scope (0 means toplevel)
|
return g;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("strict", function(){
|
AST_Scope.DEFMETHOD("init_scope_vars", function(parent_scope){
|
||||||
return this.has_directive("use strict");
|
this.variables = new Dictionary(); // map name to AST_SymbolVar (variables defined in this scope; includes functions)
|
||||||
|
this.functions = new Dictionary(); // map name to AST_SymbolDefun (functions defined in this scope)
|
||||||
|
this.uses_with = false; // will be set to true if this or some nested scope uses the `with` statement
|
||||||
|
this.uses_eval = false; // will be set to true if this or nested scope uses the global `eval`
|
||||||
|
this.parent_scope = parent_scope; // the parent scope
|
||||||
|
this.enclosed = []; // a list of variables from this or outer scope(s) that are referenced from this or inner scopes
|
||||||
|
this.cname = -1; // the current index for mangling functions/variables
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Lambda.DEFMETHOD("init_scope_vars", function(){
|
AST_Lambda.DEFMETHOD("init_scope_vars", function(){
|
||||||
AST_Scope.prototype.init_scope_vars.apply(this, arguments);
|
AST_Scope.prototype.init_scope_vars.apply(this, arguments);
|
||||||
this.uses_arguments = false;
|
this.uses_arguments = false;
|
||||||
|
this.def_variable(new AST_SymbolFunarg({
|
||||||
|
name: "arguments",
|
||||||
|
start: this.start,
|
||||||
|
end: this.end
|
||||||
|
}));
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_SymbolRef.DEFMETHOD("reference", function() {
|
AST_Symbol.DEFMETHOD("mark_enclosed", function(options) {
|
||||||
var def = this.definition();
|
var def = this.definition();
|
||||||
def.references.push(this);
|
|
||||||
var s = this.scope;
|
var s = this.scope;
|
||||||
while (s) {
|
while (s) {
|
||||||
push_uniq(s.enclosed, def);
|
push_uniq(s.enclosed, def);
|
||||||
|
if (options.keep_fnames) {
|
||||||
|
s.functions.each(function(d) {
|
||||||
|
push_uniq(def.scope.enclosed, d);
|
||||||
|
});
|
||||||
|
}
|
||||||
if (s === def.scope) break;
|
if (s === def.scope) break;
|
||||||
s = s.parent_scope;
|
s = s.parent_scope;
|
||||||
}
|
}
|
||||||
this.frame = this.scope.nesting - def.scope.nesting;
|
});
|
||||||
|
|
||||||
|
AST_Symbol.DEFMETHOD("reference", function(options) {
|
||||||
|
this.definition().references.push(this);
|
||||||
|
this.mark_enclosed(options);
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("find_variable", function(name){
|
AST_Scope.DEFMETHOD("find_variable", function(name){
|
||||||
@@ -219,99 +276,98 @@ AST_Scope.DEFMETHOD("find_variable", function(name){
|
|||||||
|| (this.parent_scope && this.parent_scope.find_variable(name));
|
|| (this.parent_scope && this.parent_scope.find_variable(name));
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("has_directive", function(value){
|
AST_Scope.DEFMETHOD("def_function", function(symbol, init){
|
||||||
return this.parent_scope && this.parent_scope.has_directive(value)
|
var def = this.def_variable(symbol, init);
|
||||||
|| (this.directives.indexOf(value) >= 0 ? this : null);
|
if (!def.init || def.init instanceof AST_Defun) def.init = init;
|
||||||
|
this.functions.set(symbol.name, def);
|
||||||
|
return def;
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("def_function", function(symbol){
|
AST_Scope.DEFMETHOD("def_variable", function(symbol, init){
|
||||||
this.functions.set(symbol.name, this.def_variable(symbol));
|
var def = this.variables.get(symbol.name);
|
||||||
});
|
if (def) {
|
||||||
|
def.orig.push(symbol);
|
||||||
AST_Scope.DEFMETHOD("def_variable", function(symbol){
|
if (def.init && (def.scope !== symbol.scope || def.init instanceof AST_Function)) {
|
||||||
var def;
|
def.init = init;
|
||||||
if (!this.variables.has(symbol.name)) {
|
}
|
||||||
def = new SymbolDef(this, this.variables.size(), symbol);
|
} else {
|
||||||
|
def = new SymbolDef(this, symbol, init);
|
||||||
this.variables.set(symbol.name, def);
|
this.variables.set(symbol.name, def);
|
||||||
def.global = !this.parent_scope;
|
def.global = !this.parent_scope;
|
||||||
} else {
|
|
||||||
def = this.variables.get(symbol.name);
|
|
||||||
def.orig.push(symbol);
|
|
||||||
}
|
}
|
||||||
return symbol.thedef = def;
|
return symbol.thedef = def;
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Scope.DEFMETHOD("next_mangled", function(options){
|
function names_in_use(scope, options) {
|
||||||
var ext = this.enclosed;
|
var names = scope.names_in_use;
|
||||||
out: while (true) {
|
if (!names) {
|
||||||
var m = base54(++this.cname);
|
scope.names_in_use = names = Object.create(scope.mangled_names || null);
|
||||||
if (!is_identifier(m)) continue; // skip over "do"
|
scope.cname_holes = [];
|
||||||
|
scope.enclosed.forEach(function(def) {
|
||||||
// https://github.com/mishoo/UglifyJS2/issues/242 -- do not
|
if (def.unmangleable(options)) names[def.name] = true;
|
||||||
// shadow a name excepted from mangling.
|
});
|
||||||
if (options.except.indexOf(m) >= 0) continue;
|
|
||||||
|
|
||||||
// we must ensure that the mangled name does not shadow a name
|
|
||||||
// from some parent scope that is referenced in this or in
|
|
||||||
// inner scopes.
|
|
||||||
for (var i = ext.length; --i >= 0;) {
|
|
||||||
var sym = ext[i];
|
|
||||||
var name = sym.mangled_name || (sym.unmangleable(options) && sym.name);
|
|
||||||
if (m == name) continue out;
|
|
||||||
}
|
|
||||||
return m;
|
|
||||||
}
|
}
|
||||||
});
|
return names;
|
||||||
|
}
|
||||||
|
|
||||||
AST_Function.DEFMETHOD("next_mangled", function(options, def){
|
function next_mangled_name(scope, options, def) {
|
||||||
|
var in_use = names_in_use(scope, options);
|
||||||
|
var holes = scope.cname_holes;
|
||||||
|
var names = Object.create(null);
|
||||||
// #179, #326
|
// #179, #326
|
||||||
// in Safari strict mode, something like (function x(x){...}) is a syntax error;
|
// in Safari strict mode, something like (function x(x){...}) is a syntax error;
|
||||||
// a function expression's argument cannot shadow the function expression's name
|
// a function expression's argument cannot shadow the function expression's name
|
||||||
|
if (scope instanceof AST_Function && scope.name && def.orig[0] instanceof AST_SymbolFunarg) {
|
||||||
var tricky_def = def.orig[0] instanceof AST_SymbolFunarg && this.name && this.name.definition();
|
var tricky_def = scope.name.definition();
|
||||||
while (true) {
|
// the function's mangled_name is null when keep_fnames is true
|
||||||
var name = AST_Lambda.prototype.next_mangled.call(this, options, def);
|
names[tricky_def.mangled_name || tricky_def.name] = true;
|
||||||
if (!(tricky_def && tricky_def.mangled_name == name))
|
|
||||||
return name;
|
|
||||||
}
|
}
|
||||||
});
|
var scopes = [ scope ];
|
||||||
|
def.references.forEach(function(sym) {
|
||||||
AST_Scope.DEFMETHOD("references", function(sym){
|
var scope = sym.scope;
|
||||||
if (sym instanceof AST_Symbol) sym = sym.definition();
|
do {
|
||||||
return this.enclosed.indexOf(sym) < 0 ? null : sym;
|
if (scopes.indexOf(scope) < 0) {
|
||||||
});
|
for (var name in names_in_use(scope, options)) {
|
||||||
|
names[name] = true;
|
||||||
|
}
|
||||||
|
scopes.push(scope);
|
||||||
|
} else break;
|
||||||
|
} while (scope = scope.parent_scope);
|
||||||
|
});
|
||||||
|
var name;
|
||||||
|
for (var i = 0, len = holes.length; i < len; i++) {
|
||||||
|
name = base54(holes[i]);
|
||||||
|
if (names[name]) continue;
|
||||||
|
holes.splice(i, 1);
|
||||||
|
scope.names_in_use[name] = true;
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
while (true) {
|
||||||
|
name = base54(++scope.cname);
|
||||||
|
if (in_use[name] || !is_identifier(name) || member(name, options.reserved)) continue;
|
||||||
|
if (!names[name]) break;
|
||||||
|
holes.push(scope.cname);
|
||||||
|
}
|
||||||
|
scope.names_in_use[name] = true;
|
||||||
|
if (options.ie8 && def.orig[0] instanceof AST_SymbolLambda) {
|
||||||
|
names_in_use(scope.parent_scope, options)[name] = true;
|
||||||
|
}
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("unmangleable", function(options){
|
AST_Symbol.DEFMETHOD("unmangleable", function(options){
|
||||||
return this.definition().unmangleable(options);
|
var def = this.definition();
|
||||||
});
|
return !def || def.unmangleable(options);
|
||||||
|
|
||||||
// property accessors are not mangleable
|
|
||||||
AST_SymbolAccessor.DEFMETHOD("unmangleable", function(){
|
|
||||||
return true;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// labels are always mangleable
|
// labels are always mangleable
|
||||||
AST_Label.DEFMETHOD("unmangleable", function(){
|
AST_Label.DEFMETHOD("unmangleable", return_false);
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("unreferenced", function(){
|
AST_Symbol.DEFMETHOD("unreferenced", function(){
|
||||||
return this.definition().references.length == 0
|
return this.definition().references.length == 0
|
||||||
&& !(this.scope.uses_eval || this.scope.uses_with);
|
&& !(this.scope.uses_eval || this.scope.uses_with);
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("undeclared", function(){
|
|
||||||
return this.definition().undeclared;
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_LabelRef.DEFMETHOD("undeclared", function(){
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Label.DEFMETHOD("undeclared", function(){
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
AST_Symbol.DEFMETHOD("definition", function(){
|
AST_Symbol.DEFMETHOD("definition", function(){
|
||||||
return this.thedef;
|
return this.thedef;
|
||||||
});
|
});
|
||||||
@@ -320,24 +376,37 @@ AST_Symbol.DEFMETHOD("global", function(){
|
|||||||
return this.definition().global;
|
return this.definition().global;
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("_default_mangler_options", function(options){
|
function _default_mangler_options(options) {
|
||||||
return defaults(options, {
|
options = defaults(options, {
|
||||||
except : [],
|
eval : false,
|
||||||
eval : false,
|
ie8 : false,
|
||||||
sort : false,
|
keep_fnames : false,
|
||||||
toplevel : false,
|
reserved : [],
|
||||||
screw_ie8 : false
|
toplevel : false,
|
||||||
});
|
});
|
||||||
});
|
if (!Array.isArray(options.reserved)) options.reserved = [];
|
||||||
|
// Never mangle arguments
|
||||||
|
push_uniq(options.reserved, "arguments");
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
||||||
options = this._default_mangler_options(options);
|
options = _default_mangler_options(options);
|
||||||
|
|
||||||
// We only need to mangle declaration nodes. Special logic wired
|
// We only need to mangle declaration nodes. Special logic wired
|
||||||
// into the code generator will display the mangled name if it's
|
// into the code generator will display the mangled name if it's
|
||||||
// present (and for AST_SymbolRef-s it'll use the mangled name of
|
// present (and for AST_SymbolRef-s it'll use the mangled name of
|
||||||
// the AST_SymbolDeclaration that it points to).
|
// the AST_SymbolDeclaration that it points to).
|
||||||
var lname = -1;
|
var lname = -1;
|
||||||
var to_mangle = [];
|
|
||||||
|
if (options.cache && options.cache.props) {
|
||||||
|
var mangled_names = this.mangled_names = Object.create(null);
|
||||||
|
options.cache.props.each(function(mangled_name) {
|
||||||
|
mangled_names[mangled_name] = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
var redefined = [];
|
||||||
var tw = new TreeWalker(function(node, descend){
|
var tw = new TreeWalker(function(node, descend){
|
||||||
if (node instanceof AST_LabeledStatement) {
|
if (node instanceof AST_LabeledStatement) {
|
||||||
// lname is incremented when we get to the AST_Label
|
// lname is incremented when we get to the AST_Label
|
||||||
@@ -347,17 +416,12 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
|||||||
return true; // don't descend again in TreeWalker
|
return true; // don't descend again in TreeWalker
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Scope) {
|
if (node instanceof AST_Scope) {
|
||||||
var p = tw.parent(), a = [];
|
descend();
|
||||||
node.variables.each(function(symbol){
|
if (options.cache && node instanceof AST_Toplevel) {
|
||||||
if (options.except.indexOf(symbol.name) < 0) {
|
node.globals.each(mangle);
|
||||||
a.push(symbol);
|
}
|
||||||
}
|
node.variables.each(mangle);
|
||||||
});
|
return true;
|
||||||
if (options.sort) a.sort(function(a, b){
|
|
||||||
return b.references.length - a.references.length;
|
|
||||||
});
|
|
||||||
to_mangle.push.apply(to_mangle, a);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
if (node instanceof AST_Label) {
|
if (node instanceof AST_Label) {
|
||||||
var name;
|
var name;
|
||||||
@@ -365,110 +429,164 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options){
|
|||||||
node.mangled_name = name;
|
node.mangled_name = name;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (!options.ie8 && node instanceof AST_Catch) {
|
||||||
|
var def = node.argname.definition();
|
||||||
|
var redef = def.redefined();
|
||||||
|
if (redef) {
|
||||||
|
redefined.push(def);
|
||||||
|
reference(node.argname);
|
||||||
|
def.references.forEach(reference);
|
||||||
|
}
|
||||||
|
descend();
|
||||||
|
if (!redef) mangle(def);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function reference(sym) {
|
||||||
|
sym.thedef = redef;
|
||||||
|
sym.reference(options);
|
||||||
|
sym.thedef = def;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
this.walk(tw);
|
this.walk(tw);
|
||||||
to_mangle.forEach(function(def){ def.mangle(options) });
|
redefined.forEach(mangle);
|
||||||
|
|
||||||
|
function mangle(def) {
|
||||||
|
if (!member(def.name, options.reserved)) {
|
||||||
|
def.mangle(options);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
AST_Toplevel.DEFMETHOD("find_colliding_names", function(options) {
|
||||||
|
var cache = options.cache && options.cache.props;
|
||||||
|
var avoid = Object.create(null);
|
||||||
|
options.reserved.forEach(to_avoid);
|
||||||
|
this.globals.each(add_def);
|
||||||
|
this.walk(new TreeWalker(function(node) {
|
||||||
|
if (node instanceof AST_Scope) node.variables.each(add_def);
|
||||||
|
if (node instanceof AST_SymbolCatch) add_def(node.definition());
|
||||||
|
}));
|
||||||
|
return avoid;
|
||||||
|
|
||||||
|
function to_avoid(name) {
|
||||||
|
avoid[name] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function add_def(def) {
|
||||||
|
var name = def.name;
|
||||||
|
if (def.global && cache && cache.has(name)) name = cache.get(name);
|
||||||
|
else if (!def.unmangleable(options)) return;
|
||||||
|
to_avoid(name);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
AST_Toplevel.DEFMETHOD("expand_names", function(options) {
|
||||||
|
base54.reset();
|
||||||
|
base54.sort();
|
||||||
|
options = _default_mangler_options(options);
|
||||||
|
var avoid = this.find_colliding_names(options);
|
||||||
|
var cname = 0;
|
||||||
|
this.globals.each(rename);
|
||||||
|
this.walk(new TreeWalker(function(node) {
|
||||||
|
if (node instanceof AST_Scope) node.variables.each(rename);
|
||||||
|
if (node instanceof AST_SymbolCatch) rename(node.definition());
|
||||||
|
}));
|
||||||
|
|
||||||
|
function next_name() {
|
||||||
|
var name;
|
||||||
|
do {
|
||||||
|
name = base54(cname++);
|
||||||
|
} while (avoid[name] || !is_identifier(name));
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
function rename(def) {
|
||||||
|
if (def.global && options.cache) return;
|
||||||
|
if (def.unmangleable(options)) return;
|
||||||
|
if (member(def.name, options.reserved)) return;
|
||||||
|
var d = def.redefined();
|
||||||
|
def.name = d ? d.name : next_name();
|
||||||
|
def.orig.forEach(function(sym) {
|
||||||
|
sym.name = def.name;
|
||||||
|
});
|
||||||
|
def.references.forEach(function(sym) {
|
||||||
|
sym.name = def.name;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
AST_Node.DEFMETHOD("tail_node", return_this);
|
||||||
|
AST_Sequence.DEFMETHOD("tail_node", function() {
|
||||||
|
return this.expressions[this.expressions.length - 1];
|
||||||
});
|
});
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("compute_char_frequency", function(options){
|
AST_Toplevel.DEFMETHOD("compute_char_frequency", function(options){
|
||||||
options = this._default_mangler_options(options);
|
options = _default_mangler_options(options);
|
||||||
var tw = new TreeWalker(function(node){
|
base54.reset();
|
||||||
if (node instanceof AST_Constant)
|
try {
|
||||||
base54.consider(node.print_to_string());
|
AST_Node.prototype.print = function(stream, force_parens) {
|
||||||
else if (node instanceof AST_Return)
|
this._print(stream, force_parens);
|
||||||
base54.consider("return");
|
if (this instanceof AST_Symbol && !this.unmangleable(options)) {
|
||||||
else if (node instanceof AST_Throw)
|
base54.consider(this.name, -1);
|
||||||
base54.consider("throw");
|
} else if (options.properties) {
|
||||||
else if (node instanceof AST_Continue)
|
if (this instanceof AST_Dot) {
|
||||||
base54.consider("continue");
|
base54.consider(this.property, -1);
|
||||||
else if (node instanceof AST_Break)
|
} else if (this instanceof AST_Sub) {
|
||||||
base54.consider("break");
|
skip_string(this.property);
|
||||||
else if (node instanceof AST_Debugger)
|
}
|
||||||
base54.consider("debugger");
|
}
|
||||||
else if (node instanceof AST_Directive)
|
};
|
||||||
base54.consider(node.value);
|
base54.consider(this.print_to_string(), 1);
|
||||||
else if (node instanceof AST_While)
|
} finally {
|
||||||
base54.consider("while");
|
AST_Node.prototype.print = AST_Node.prototype._print;
|
||||||
else if (node instanceof AST_Do)
|
}
|
||||||
base54.consider("do while");
|
|
||||||
else if (node instanceof AST_If) {
|
|
||||||
base54.consider("if");
|
|
||||||
if (node.alternative) base54.consider("else");
|
|
||||||
}
|
|
||||||
else if (node instanceof AST_Var)
|
|
||||||
base54.consider("var");
|
|
||||||
else if (node instanceof AST_Const)
|
|
||||||
base54.consider("const");
|
|
||||||
else if (node instanceof AST_Lambda)
|
|
||||||
base54.consider("function");
|
|
||||||
else if (node instanceof AST_For)
|
|
||||||
base54.consider("for");
|
|
||||||
else if (node instanceof AST_ForIn)
|
|
||||||
base54.consider("for in");
|
|
||||||
else if (node instanceof AST_Switch)
|
|
||||||
base54.consider("switch");
|
|
||||||
else if (node instanceof AST_Case)
|
|
||||||
base54.consider("case");
|
|
||||||
else if (node instanceof AST_Default)
|
|
||||||
base54.consider("default");
|
|
||||||
else if (node instanceof AST_With)
|
|
||||||
base54.consider("with");
|
|
||||||
else if (node instanceof AST_ObjectSetter)
|
|
||||||
base54.consider("set" + node.key);
|
|
||||||
else if (node instanceof AST_ObjectGetter)
|
|
||||||
base54.consider("get" + node.key);
|
|
||||||
else if (node instanceof AST_ObjectKeyVal)
|
|
||||||
base54.consider(node.key);
|
|
||||||
else if (node instanceof AST_New)
|
|
||||||
base54.consider("new");
|
|
||||||
else if (node instanceof AST_This)
|
|
||||||
base54.consider("this");
|
|
||||||
else if (node instanceof AST_Try)
|
|
||||||
base54.consider("try");
|
|
||||||
else if (node instanceof AST_Catch)
|
|
||||||
base54.consider("catch");
|
|
||||||
else if (node instanceof AST_Finally)
|
|
||||||
base54.consider("finally");
|
|
||||||
else if (node instanceof AST_Symbol && node.unmangleable(options))
|
|
||||||
base54.consider(node.name);
|
|
||||||
else if (node instanceof AST_Unary || node instanceof AST_Binary)
|
|
||||||
base54.consider(node.operator);
|
|
||||||
else if (node instanceof AST_Dot)
|
|
||||||
base54.consider(node.property);
|
|
||||||
});
|
|
||||||
this.walk(tw);
|
|
||||||
base54.sort();
|
base54.sort();
|
||||||
|
|
||||||
|
function skip_string(node) {
|
||||||
|
if (node instanceof AST_String) {
|
||||||
|
base54.consider(node.value, -1);
|
||||||
|
} else if (node instanceof AST_Conditional) {
|
||||||
|
skip_string(node.consequent);
|
||||||
|
skip_string(node.alternative);
|
||||||
|
} else if (node instanceof AST_Sequence) {
|
||||||
|
skip_string(node.tail_node());
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var base54 = (function() {
|
var base54 = (function() {
|
||||||
var string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_0123456789";
|
var leading = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_".split("");
|
||||||
|
var digits = "0123456789".split("");
|
||||||
var chars, frequency;
|
var chars, frequency;
|
||||||
function reset() {
|
function reset() {
|
||||||
frequency = Object.create(null);
|
frequency = Object.create(null);
|
||||||
chars = string.split("").map(function(ch){ return ch.charCodeAt(0) });
|
leading.forEach(function(ch) {
|
||||||
chars.forEach(function(ch){ frequency[ch] = 0 });
|
frequency[ch] = 0;
|
||||||
|
});
|
||||||
|
digits.forEach(function(ch) {
|
||||||
|
frequency[ch] = 0;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
base54.consider = function(str){
|
base54.consider = function(str, delta) {
|
||||||
for (var i = str.length; --i >= 0;) {
|
for (var i = str.length; --i >= 0;) {
|
||||||
var code = str.charCodeAt(i);
|
frequency[str[i]] += delta;
|
||||||
if (code in frequency) ++frequency[code];
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
function compare(a, b) {
|
||||||
|
return frequency[b] - frequency[a];
|
||||||
|
}
|
||||||
base54.sort = function() {
|
base54.sort = function() {
|
||||||
chars = mergeSort(chars, function(a, b){
|
chars = mergeSort(leading, compare).concat(mergeSort(digits, compare));
|
||||||
if (is_digit(a) && !is_digit(b)) return 1;
|
|
||||||
if (is_digit(b) && !is_digit(a)) return -1;
|
|
||||||
return frequency[b] - frequency[a];
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
base54.reset = reset;
|
base54.reset = reset;
|
||||||
reset();
|
reset();
|
||||||
base54.get = function(){ return chars };
|
|
||||||
base54.freq = function(){ return frequency };
|
|
||||||
function base54(num) {
|
function base54(num) {
|
||||||
var ret = "", base = 54;
|
var ret = "", base = 54;
|
||||||
|
num++;
|
||||||
do {
|
do {
|
||||||
ret += String.fromCharCode(chars[num % base]);
|
num--;
|
||||||
|
ret += chars[num % base];
|
||||||
num = Math.floor(num / base);
|
num = Math.floor(num / base);
|
||||||
base = 64;
|
base = 64;
|
||||||
} while (num > 0);
|
} while (num > 0);
|
||||||
@@ -476,88 +594,3 @@ var base54 = (function() {
|
|||||||
};
|
};
|
||||||
return base54;
|
return base54;
|
||||||
})();
|
})();
|
||||||
|
|
||||||
AST_Toplevel.DEFMETHOD("scope_warnings", function(options){
|
|
||||||
options = defaults(options, {
|
|
||||||
undeclared : false, // this makes a lot of noise
|
|
||||||
unreferenced : true,
|
|
||||||
assign_to_global : true,
|
|
||||||
func_arguments : true,
|
|
||||||
nested_defuns : true,
|
|
||||||
eval : true
|
|
||||||
});
|
|
||||||
var tw = new TreeWalker(function(node){
|
|
||||||
if (options.undeclared
|
|
||||||
&& node instanceof AST_SymbolRef
|
|
||||||
&& node.undeclared())
|
|
||||||
{
|
|
||||||
// XXX: this also warns about JS standard names,
|
|
||||||
// i.e. Object, Array, parseInt etc. Should add a list of
|
|
||||||
// exceptions.
|
|
||||||
AST_Node.warn("Undeclared symbol: {name} [{file}:{line},{col}]", {
|
|
||||||
name: node.name,
|
|
||||||
file: node.start.file,
|
|
||||||
line: node.start.line,
|
|
||||||
col: node.start.col
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (options.assign_to_global)
|
|
||||||
{
|
|
||||||
var sym = null;
|
|
||||||
if (node instanceof AST_Assign && node.left instanceof AST_SymbolRef)
|
|
||||||
sym = node.left;
|
|
||||||
else if (node instanceof AST_ForIn && node.init instanceof AST_SymbolRef)
|
|
||||||
sym = node.init;
|
|
||||||
if (sym
|
|
||||||
&& (sym.undeclared()
|
|
||||||
|| (sym.global() && sym.scope !== sym.definition().scope))) {
|
|
||||||
AST_Node.warn("{msg}: {name} [{file}:{line},{col}]", {
|
|
||||||
msg: sym.undeclared() ? "Accidental global?" : "Assignment to global",
|
|
||||||
name: sym.name,
|
|
||||||
file: sym.start.file,
|
|
||||||
line: sym.start.line,
|
|
||||||
col: sym.start.col
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (options.eval
|
|
||||||
&& node instanceof AST_SymbolRef
|
|
||||||
&& node.undeclared()
|
|
||||||
&& node.name == "eval") {
|
|
||||||
AST_Node.warn("Eval is used [{file}:{line},{col}]", node.start);
|
|
||||||
}
|
|
||||||
if (options.unreferenced
|
|
||||||
&& (node instanceof AST_SymbolDeclaration || node instanceof AST_Label)
|
|
||||||
&& node.unreferenced()) {
|
|
||||||
AST_Node.warn("{type} {name} is declared but not referenced [{file}:{line},{col}]", {
|
|
||||||
type: node instanceof AST_Label ? "Label" : "Symbol",
|
|
||||||
name: node.name,
|
|
||||||
file: node.start.file,
|
|
||||||
line: node.start.line,
|
|
||||||
col: node.start.col
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (options.func_arguments
|
|
||||||
&& node instanceof AST_Lambda
|
|
||||||
&& node.uses_arguments) {
|
|
||||||
AST_Node.warn("arguments used in function {name} [{file}:{line},{col}]", {
|
|
||||||
name: node.name ? node.name.name : "anonymous",
|
|
||||||
file: node.start.file,
|
|
||||||
line: node.start.line,
|
|
||||||
col: node.start.col
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (options.nested_defuns
|
|
||||||
&& node instanceof AST_Defun
|
|
||||||
&& !(tw.parent() instanceof AST_Scope)) {
|
|
||||||
AST_Node.warn("Function {name} declared in nested statement \"{type}\" [{file}:{line},{col}]", {
|
|
||||||
name: node.name.name,
|
|
||||||
type: tw.parent().TYPE,
|
|
||||||
file: node.start.file,
|
|
||||||
line: node.start.line,
|
|
||||||
col: node.start.col
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.walk(tw);
|
|
||||||
});
|
|
||||||
|
|||||||
@@ -58,16 +58,29 @@ function SourceMap(options) {
|
|||||||
sourceRoot : options.root
|
sourceRoot : options.root
|
||||||
});
|
});
|
||||||
var orig_map = options.orig && new MOZ_SourceMap.SourceMapConsumer(options.orig);
|
var orig_map = options.orig && new MOZ_SourceMap.SourceMapConsumer(options.orig);
|
||||||
|
|
||||||
|
if (orig_map && Array.isArray(options.orig.sources)) {
|
||||||
|
orig_map._sources.toArray().forEach(function(source) {
|
||||||
|
var sourceContent = orig_map.sourceContentFor(source, true);
|
||||||
|
if (sourceContent) {
|
||||||
|
generator.setSourceContent(source, sourceContent);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function add(source, gen_line, gen_col, orig_line, orig_col, name) {
|
function add(source, gen_line, gen_col, orig_line, orig_col, name) {
|
||||||
if (orig_map) {
|
if (orig_map) {
|
||||||
var info = orig_map.originalPositionFor({
|
var info = orig_map.originalPositionFor({
|
||||||
line: orig_line,
|
line: orig_line,
|
||||||
column: orig_col
|
column: orig_col
|
||||||
});
|
});
|
||||||
|
if (info.source === null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
source = info.source;
|
source = info.source;
|
||||||
orig_line = info.line;
|
orig_line = info.line;
|
||||||
orig_col = info.column;
|
orig_col = info.column;
|
||||||
name = info.name;
|
name = info.name || name;
|
||||||
}
|
}
|
||||||
generator.addMapping({
|
generator.addMapping({
|
||||||
generated : { line: gen_line + options.dest_line_diff, column: gen_col },
|
generated : { line: gen_line + options.dest_line_diff, column: gen_col },
|
||||||
@@ -79,6 +92,6 @@ function SourceMap(options) {
|
|||||||
return {
|
return {
|
||||||
add : add,
|
add : add,
|
||||||
get : function() { return generator },
|
get : function() { return generator },
|
||||||
toString : function() { return generator.toString() }
|
toString : function() { return JSON.stringify(generator.toJSON()); }
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -60,12 +60,9 @@ TreeTransformer.prototype = new TreeWalker;
|
|||||||
tw.push(this);
|
tw.push(this);
|
||||||
if (tw.before) x = tw.before(this, descend, in_list);
|
if (tw.before) x = tw.before(this, descend, in_list);
|
||||||
if (x === undefined) {
|
if (x === undefined) {
|
||||||
if (!tw.after) {
|
x = this;
|
||||||
x = this;
|
descend(x, tw);
|
||||||
descend(x, tw);
|
if (tw.after) {
|
||||||
} else {
|
|
||||||
tw.stack[tw.stack.length - 1] = x = this.clone();
|
|
||||||
descend(x, tw);
|
|
||||||
y = tw.after(x, in_list);
|
y = tw.after(x, in_list);
|
||||||
if (y !== undefined) x = y;
|
if (y !== undefined) x = y;
|
||||||
}
|
}
|
||||||
@@ -174,9 +171,8 @@ TreeTransformer.prototype = new TreeWalker;
|
|||||||
self.args = do_list(self.args, tw);
|
self.args = do_list(self.args, tw);
|
||||||
});
|
});
|
||||||
|
|
||||||
_(AST_Seq, function(self, tw){
|
_(AST_Sequence, function(self, tw){
|
||||||
self.car = self.car.transform(tw);
|
self.expressions = do_list(self.expressions, tw);
|
||||||
self.cdr = self.cdr.transform(tw);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
_(AST_Dot, function(self, tw){
|
_(AST_Dot, function(self, tw){
|
||||||
|
|||||||
124
lib/utils.js
124
lib/utils.js
@@ -43,26 +43,12 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
function array_to_hash(a) {
|
|
||||||
var ret = Object.create(null);
|
|
||||||
for (var i = 0; i < a.length; ++i)
|
|
||||||
ret[a[i]] = true;
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
function slice(a, start) {
|
|
||||||
return Array.prototype.slice.call(a, start || 0);
|
|
||||||
};
|
|
||||||
|
|
||||||
function characters(str) {
|
function characters(str) {
|
||||||
return str.split("");
|
return str.split("");
|
||||||
};
|
};
|
||||||
|
|
||||||
function member(name, array) {
|
function member(name, array) {
|
||||||
for (var i = array.length; --i >= 0;)
|
return array.indexOf(name) >= 0;
|
||||||
if (array[i] == name)
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
function find_if(func, array) {
|
function find_if(func, array) {
|
||||||
@@ -81,13 +67,28 @@ function repeat_string(str, i) {
|
|||||||
return d;
|
return d;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function configure_error_stack(fn) {
|
||||||
|
Object.defineProperty(fn.prototype, "stack", {
|
||||||
|
get: function() {
|
||||||
|
var err = new Error(this.message);
|
||||||
|
err.name = this.name;
|
||||||
|
try {
|
||||||
|
throw err;
|
||||||
|
} catch(e) {
|
||||||
|
return e.stack;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function DefaultsError(msg, defs) {
|
function DefaultsError(msg, defs) {
|
||||||
Error.call(this, msg);
|
this.message = msg;
|
||||||
this.msg = msg;
|
|
||||||
this.defs = defs;
|
this.defs = defs;
|
||||||
};
|
};
|
||||||
DefaultsError.prototype = Object.create(Error.prototype);
|
DefaultsError.prototype = Object.create(Error.prototype);
|
||||||
DefaultsError.prototype.constructor = DefaultsError;
|
DefaultsError.prototype.constructor = DefaultsError;
|
||||||
|
DefaultsError.prototype.name = "DefaultsError";
|
||||||
|
configure_error_stack(DefaultsError);
|
||||||
|
|
||||||
DefaultsError.croak = function(msg, defs) {
|
DefaultsError.croak = function(msg, defs) {
|
||||||
throw new DefaultsError(msg, defs);
|
throw new DefaultsError(msg, defs);
|
||||||
@@ -97,22 +98,28 @@ function defaults(args, defs, croak) {
|
|||||||
if (args === true)
|
if (args === true)
|
||||||
args = {};
|
args = {};
|
||||||
var ret = args || {};
|
var ret = args || {};
|
||||||
if (croak) for (var i in ret) if (ret.hasOwnProperty(i) && !defs.hasOwnProperty(i))
|
if (croak) for (var i in ret) if (HOP(ret, i) && !HOP(defs, i))
|
||||||
DefaultsError.croak("`" + i + "` is not a supported option", defs);
|
DefaultsError.croak("`" + i + "` is not a supported option", defs);
|
||||||
for (var i in defs) if (defs.hasOwnProperty(i)) {
|
for (var i in defs) if (HOP(defs, i)) {
|
||||||
ret[i] = (args && args.hasOwnProperty(i)) ? args[i] : defs[i];
|
ret[i] = (args && HOP(args, i)) ? args[i] : defs[i];
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
|
|
||||||
function merge(obj, ext) {
|
function merge(obj, ext) {
|
||||||
for (var i in ext) if (ext.hasOwnProperty(i)) {
|
var count = 0;
|
||||||
|
for (var i in ext) if (HOP(ext, i)) {
|
||||||
obj[i] = ext[i];
|
obj[i] = ext[i];
|
||||||
|
count++;
|
||||||
}
|
}
|
||||||
return obj;
|
return count;
|
||||||
};
|
};
|
||||||
|
|
||||||
function noop() {};
|
function noop() {}
|
||||||
|
function return_false() { return false; }
|
||||||
|
function return_true() { return true; }
|
||||||
|
function return_this() { return this; }
|
||||||
|
function return_null() { return null; }
|
||||||
|
|
||||||
var MAP = (function(){
|
var MAP = (function(){
|
||||||
function MAP(a, f, backwards) {
|
function MAP(a, f, backwards) {
|
||||||
@@ -148,7 +155,7 @@ var MAP = (function(){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for (i in a) if (a.hasOwnProperty(i)) if (doit()) break;
|
for (i in a) if (HOP(a, i)) if (doit()) break;
|
||||||
}
|
}
|
||||||
return top.concat(ret);
|
return top.concat(ret);
|
||||||
};
|
};
|
||||||
@@ -169,7 +176,7 @@ function push_uniq(array, el) {
|
|||||||
|
|
||||||
function string_template(text, props) {
|
function string_template(text, props) {
|
||||||
return text.replace(/\{(.+?)\}/g, function(str, p){
|
return text.replace(/\{(.+?)\}/g, function(str, p){
|
||||||
return props[p];
|
return props && props[p];
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -203,18 +210,6 @@ function mergeSort(array, cmp) {
|
|||||||
return _ms(array);
|
return _ms(array);
|
||||||
};
|
};
|
||||||
|
|
||||||
function set_difference(a, b) {
|
|
||||||
return a.filter(function(el){
|
|
||||||
return b.indexOf(el) < 0;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
function set_intersection(a, b) {
|
|
||||||
return a.filter(function(el){
|
|
||||||
return b.indexOf(el) >= 0;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
// this function is taken from Acorn [1], written by Marijn Haverbeke
|
// this function is taken from Acorn [1], written by Marijn Haverbeke
|
||||||
// [1] https://github.com/marijnh/acorn
|
// [1] https://github.com/marijnh/acorn
|
||||||
function makePredicate(words) {
|
function makePredicate(words) {
|
||||||
@@ -228,10 +223,19 @@ function makePredicate(words) {
|
|||||||
}
|
}
|
||||||
cats.push([words[i]]);
|
cats.push([words[i]]);
|
||||||
}
|
}
|
||||||
|
function quote(word) {
|
||||||
|
return JSON.stringify(word).replace(/[\u2028\u2029]/g, function(s) {
|
||||||
|
switch (s) {
|
||||||
|
case "\u2028": return "\\u2028";
|
||||||
|
case "\u2029": return "\\u2029";
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
});
|
||||||
|
}
|
||||||
function compareTo(arr) {
|
function compareTo(arr) {
|
||||||
if (arr.length == 1) return f += "return str === " + JSON.stringify(arr[0]) + ";";
|
if (arr.length == 1) return f += "return str === " + quote(arr[0]) + ";";
|
||||||
f += "switch(str){";
|
f += "switch(str){";
|
||||||
for (var i = 0; i < arr.length; ++i) f += "case " + JSON.stringify(arr[i]) + ":";
|
for (var i = 0; i < arr.length; ++i) f += "case " + quote(arr[i]) + ":";
|
||||||
f += "return true}return false;";
|
f += "return true}return false;";
|
||||||
}
|
}
|
||||||
// When there are more than three length categories, an outer
|
// When there are more than three length categories, an outer
|
||||||
@@ -298,5 +302,45 @@ Dictionary.prototype = {
|
|||||||
for (var i in this._values)
|
for (var i in this._values)
|
||||||
ret.push(f(this._values[i], i.substr(1)));
|
ret.push(f(this._values[i], i.substr(1)));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
},
|
||||||
|
clone: function() {
|
||||||
|
var ret = new Dictionary();
|
||||||
|
for (var i in this._values)
|
||||||
|
ret._values[i] = this._values[i];
|
||||||
|
ret._size = this._size;
|
||||||
|
return ret;
|
||||||
|
},
|
||||||
|
toObject: function() { return this._values }
|
||||||
};
|
};
|
||||||
|
Dictionary.fromObject = function(obj) {
|
||||||
|
var dict = new Dictionary();
|
||||||
|
dict._size = merge(dict._values, obj);
|
||||||
|
return dict;
|
||||||
|
};
|
||||||
|
|
||||||
|
function HOP(obj, prop) {
|
||||||
|
return Object.prototype.hasOwnProperty.call(obj, prop);
|
||||||
|
}
|
||||||
|
|
||||||
|
// return true if the node at the top of the stack (that means the
|
||||||
|
// innermost node in the current output) is lexically the first in
|
||||||
|
// a statement.
|
||||||
|
function first_in_statement(stack) {
|
||||||
|
var node = stack.parent(-1);
|
||||||
|
for (var i = 0, p; p = stack.parent(i); i++) {
|
||||||
|
if (p instanceof AST_Statement && p.body === node)
|
||||||
|
return true;
|
||||||
|
if ((p instanceof AST_Sequence && p.expressions[0] === node) ||
|
||||||
|
(p.TYPE == "Call" && p.expression === node ) ||
|
||||||
|
(p instanceof AST_Dot && p.expression === node ) ||
|
||||||
|
(p instanceof AST_Sub && p.expression === node ) ||
|
||||||
|
(p instanceof AST_Conditional && p.condition === node ) ||
|
||||||
|
(p instanceof AST_Binary && p.left === node ) ||
|
||||||
|
(p instanceof AST_UnaryPostfix && p.expression === node ))
|
||||||
|
{
|
||||||
|
node = p;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
87
package.json
87
package.json
@@ -1,30 +1,61 @@
|
|||||||
{
|
{
|
||||||
"name": "uglify-js",
|
"name": "uglify-js",
|
||||||
"description": "JavaScript parser, mangler/compressor and beautifier toolkit",
|
"description": "JavaScript parser, mangler/compressor and beautifier toolkit",
|
||||||
"homepage": "http://lisperator.net/uglifyjs",
|
"author": "Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)",
|
||||||
"main": "tools/node.js",
|
"license": "BSD-2-Clause",
|
||||||
"version": "2.4.12",
|
"version": "3.3.17",
|
||||||
"engines": { "node" : ">=0.4.0" },
|
"engines": {
|
||||||
"maintainers": [{
|
"node": ">=0.8.0"
|
||||||
"name": "Mihai Bazon",
|
},
|
||||||
"email": "mihai.bazon@gmail.com",
|
"maintainers": [
|
||||||
"web": "http://lisperator.net/"
|
"Alex Lam <alexlamsl@gmail.com>",
|
||||||
}],
|
"Mihai Bazon <mihai.bazon@gmail.com> (http://lisperator.net/)"
|
||||||
"repository": {
|
],
|
||||||
"type": "git",
|
"repository": "mishoo/UglifyJS2",
|
||||||
"url": "https://github.com/mishoo/UglifyJS2.git"
|
"main": "tools/node.js",
|
||||||
},
|
"bin": {
|
||||||
"dependencies": {
|
"uglifyjs": "bin/uglifyjs"
|
||||||
"async" : "~0.2.6",
|
},
|
||||||
"source-map" : "~0.1.7",
|
"files": [
|
||||||
"optimist" : "~0.3.5",
|
"bin",
|
||||||
"uglify-to-browserify": "~1.0.0"
|
"lib",
|
||||||
},
|
"tools",
|
||||||
"browserify": {
|
"LICENSE"
|
||||||
"transform": [ "uglify-to-browserify" ]
|
],
|
||||||
},
|
"dependencies": {
|
||||||
"bin": {
|
"commander": "~2.15.0",
|
||||||
"uglifyjs" : "bin/uglifyjs"
|
"source-map": "~0.6.1"
|
||||||
},
|
},
|
||||||
"scripts": {"test": "node test/run-tests.js"}
|
"devDependencies": {
|
||||||
|
"acorn": "~5.5.3",
|
||||||
|
"mocha": "~3.5.1",
|
||||||
|
"semver": "~5.5.0"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "node test/run-tests.js"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"cli",
|
||||||
|
"compress",
|
||||||
|
"compressor",
|
||||||
|
"ecma",
|
||||||
|
"ecmascript",
|
||||||
|
"es",
|
||||||
|
"es5",
|
||||||
|
"javascript",
|
||||||
|
"js",
|
||||||
|
"jsmin",
|
||||||
|
"min",
|
||||||
|
"minification",
|
||||||
|
"minifier",
|
||||||
|
"minify",
|
||||||
|
"optimize",
|
||||||
|
"optimizer",
|
||||||
|
"pack",
|
||||||
|
"packer",
|
||||||
|
"parse",
|
||||||
|
"parser",
|
||||||
|
"uglifier",
|
||||||
|
"uglify"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
96
test/benchmark.js
Normal file
96
test/benchmark.js
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
#! /usr/bin/env node
|
||||||
|
// -*- js -*-
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var createHash = require("crypto").createHash;
|
||||||
|
var fetch = require("./fetch");
|
||||||
|
var fork = require("child_process").fork;
|
||||||
|
var zlib = require("zlib");
|
||||||
|
var args = process.argv.slice(2);
|
||||||
|
if (!args.length) {
|
||||||
|
args.push("-mc");
|
||||||
|
}
|
||||||
|
args.push("--timings");
|
||||||
|
var urls = [
|
||||||
|
"https://code.jquery.com/jquery-3.2.1.js",
|
||||||
|
"https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.4/angular.js",
|
||||||
|
"https://cdnjs.cloudflare.com/ajax/libs/mathjs/3.9.0/math.js",
|
||||||
|
"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.js",
|
||||||
|
"https://unpkg.com/react@15.3.2/dist/react.js",
|
||||||
|
"http://builds.emberjs.com/tags/v2.11.0/ember.prod.js",
|
||||||
|
"https://cdn.jsdelivr.net/lodash/4.17.4/lodash.js",
|
||||||
|
"https://cdnjs.cloudflare.com/ajax/libs/d3/4.5.0/d3.js",
|
||||||
|
"https://raw.githubusercontent.com/kangax/html-minifier/v3.5.7/dist/htmlminifier.js",
|
||||||
|
];
|
||||||
|
var results = {};
|
||||||
|
var remaining = 2 * urls.length;
|
||||||
|
function done() {
|
||||||
|
if (!--remaining) {
|
||||||
|
var failures = [];
|
||||||
|
var sum = { input: 0, output: 0, gzip: 0 };
|
||||||
|
urls.forEach(function(url) {
|
||||||
|
var info = results[url];
|
||||||
|
console.log();
|
||||||
|
console.log(url);
|
||||||
|
console.log(info.log);
|
||||||
|
console.log("Original:", info.input, "bytes");
|
||||||
|
console.log("Uglified:", info.output, "bytes");
|
||||||
|
console.log("GZipped: ", info.gzip, "bytes");
|
||||||
|
console.log("SHA1 sum:", info.sha1);
|
||||||
|
if (info.code) {
|
||||||
|
failures.push(url);
|
||||||
|
}
|
||||||
|
sum.input += info.input;
|
||||||
|
sum.output += info.output;
|
||||||
|
sum.gzip += info.gzip;
|
||||||
|
});
|
||||||
|
if (failures.length) {
|
||||||
|
console.error("Benchmark failed:");
|
||||||
|
failures.forEach(function(url) {
|
||||||
|
console.error(url);
|
||||||
|
});
|
||||||
|
process.exit(1);
|
||||||
|
} else {
|
||||||
|
console.log();
|
||||||
|
console.log("Subtotal");
|
||||||
|
console.log();
|
||||||
|
console.log("Original:", sum.input, "bytes");
|
||||||
|
console.log("Uglified:", sum.output, "bytes");
|
||||||
|
console.log("GZipped: ", sum.gzip, "bytes");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
urls.forEach(function(url) {
|
||||||
|
results[url] = {
|
||||||
|
input: 0,
|
||||||
|
output: 0,
|
||||||
|
gzip: 0,
|
||||||
|
log: ""
|
||||||
|
};
|
||||||
|
fetch(url, function(err, res) {
|
||||||
|
if (err) throw err;
|
||||||
|
var uglifyjs = fork("bin/uglifyjs", args, { silent: true });
|
||||||
|
res.on("data", function(data) {
|
||||||
|
results[url].input += data.length;
|
||||||
|
}).pipe(uglifyjs.stdin);
|
||||||
|
uglifyjs.stdout.on("data", function(data) {
|
||||||
|
results[url].output += data.length;
|
||||||
|
}).pipe(zlib.createGzip({
|
||||||
|
level: zlib.Z_BEST_COMPRESSION
|
||||||
|
})).on("data", function(data) {
|
||||||
|
results[url].gzip += data.length;
|
||||||
|
}).pipe(createHash("sha1")).on("data", function(data) {
|
||||||
|
results[url].sha1 = data.toString("hex");
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
uglifyjs.stderr.setEncoding("utf8");
|
||||||
|
uglifyjs.stderr.on("data", function(data) {
|
||||||
|
results[url].log += data;
|
||||||
|
});
|
||||||
|
uglifyjs.on("exit", function(code) {
|
||||||
|
results[url].code = code;
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
119
test/compress/arguments.js
Normal file
119
test/compress/arguments.js
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
replace_index: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
evaluate: true,
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(arguments && arguments[0]);
|
||||||
|
(function() {
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
|
(function(a, b) {
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
|
(function(arguments) {
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
|
(function() {
|
||||||
|
var arguments;
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(arguments && arguments[0]);
|
||||||
|
(function() {
|
||||||
|
console.log(arguments[1], arguments[1], arguments.foo);
|
||||||
|
})("bar", 42);
|
||||||
|
(function(a, b) {
|
||||||
|
console.log(b, b, arguments.foo);
|
||||||
|
})("bar", 42);
|
||||||
|
(function(arguments) {
|
||||||
|
console.log(arguments[1], arguments[1], arguments.foo);
|
||||||
|
})("bar", 42);
|
||||||
|
(function() {
|
||||||
|
var arguments;
|
||||||
|
console.log(arguments[1], arguments[1], arguments.foo);
|
||||||
|
})("bar", 42);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined",
|
||||||
|
"42 42 undefined",
|
||||||
|
"42 42 undefined",
|
||||||
|
"a a undefined",
|
||||||
|
"42 42 undefined",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
replace_index_keep_fargs: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
evaluate: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(arguments && arguments[0]);
|
||||||
|
(function() {
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
|
(function(a, b) {
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
|
(function(arguments) {
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
|
(function() {
|
||||||
|
var arguments;
|
||||||
|
console.log(arguments[1], arguments["1"], arguments["foo"]);
|
||||||
|
})("bar", 42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(arguments && arguments[0]);
|
||||||
|
(function(argument_0, argument_1) {
|
||||||
|
console.log(argument_1, argument_1, arguments.foo);
|
||||||
|
})("bar", 42);
|
||||||
|
(function(a, b) {
|
||||||
|
console.log(b, b, arguments.foo);
|
||||||
|
})("bar", 42);
|
||||||
|
(function(arguments) {
|
||||||
|
console.log(arguments[1], arguments[1], arguments.foo);
|
||||||
|
})("bar", 42);
|
||||||
|
(function() {
|
||||||
|
var arguments;
|
||||||
|
console.log(arguments[1], arguments[1], arguments.foo);
|
||||||
|
})("bar", 42);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"undefined",
|
||||||
|
"42 42 undefined",
|
||||||
|
"42 42 undefined",
|
||||||
|
"a a undefined",
|
||||||
|
"42 42 undefined",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
modified: {
|
||||||
|
options = {
|
||||||
|
arguments: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a, b) {
|
||||||
|
var c = arguments[0];
|
||||||
|
var d = arguments[1];
|
||||||
|
a = "foo";
|
||||||
|
b++;
|
||||||
|
console.log(a, b, c, d, arguments[0], arguments[1]);
|
||||||
|
})("bar", 42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(a, b) {
|
||||||
|
var c = a;
|
||||||
|
var d = b;
|
||||||
|
a = "foo";
|
||||||
|
b++;
|
||||||
|
console.log(a, b, c, d, a, b);
|
||||||
|
})("bar", 42);
|
||||||
|
}
|
||||||
|
expect_stdout: "foo 43 bar 42 foo 43"
|
||||||
|
}
|
||||||
@@ -21,10 +21,19 @@ constant_join: {
|
|||||||
input: {
|
input: {
|
||||||
var a = [ "foo", "bar", "baz" ].join("");
|
var a = [ "foo", "bar", "baz" ].join("");
|
||||||
var a1 = [ "foo", "bar", "baz" ].join();
|
var a1 = [ "foo", "bar", "baz" ].join();
|
||||||
|
var a2 = [ "foo", "bar", "baz" ].join(null);
|
||||||
|
var a3 = [ "foo", "bar", "baz" ].join(void 0);
|
||||||
|
var a4 = [ "foo", , "baz" ].join();
|
||||||
|
var a5 = [ "foo", null, "baz" ].join();
|
||||||
|
var a6 = [ "foo", void 0, "baz" ].join();
|
||||||
var b = [ "foo", 1, 2, 3, "bar" ].join("");
|
var b = [ "foo", 1, 2, 3, "bar" ].join("");
|
||||||
var c = [ boo(), "foo", 1, 2, 3, "bar", bar() ].join("");
|
var c = [ boo(), "foo", 1, 2, 3, "bar", bar() ].join("");
|
||||||
var c1 = [ boo(), bar(), "foo", 1, 2, 3, "bar", bar() ].join("");
|
var c1 = [ boo(), bar(), "foo", 1, 2, 3, "bar", bar() ].join("");
|
||||||
var c2 = [ 1, 2, "foo", "bar", baz() ].join("");
|
var c2 = [ 1, 2, "foo", "bar", baz() ].join("");
|
||||||
|
var c3 = [ boo() + bar() + "foo", 1, 2, 3, "bar", bar() + "foo" ].join("");
|
||||||
|
var c4 = [ 1, 2, null, undefined, "foo", "bar", baz() ].join("");
|
||||||
|
var c5 = [ boo() + bar() + "foo", 1, 2, 3, "bar", bar() + "foo" ].join();
|
||||||
|
var c6 = [ 1, 2, null, undefined, "foo", "bar", baz() ].join();
|
||||||
var d = [ "foo", 1 + 2 + "bar", "baz" ].join("-");
|
var d = [ "foo", 1 + 2 + "bar", "baz" ].join("-");
|
||||||
var e = [].join(foo + bar);
|
var e = [].join(foo + bar);
|
||||||
var f = [].join("");
|
var f = [].join("");
|
||||||
@@ -33,10 +42,19 @@ constant_join: {
|
|||||||
expect: {
|
expect: {
|
||||||
var a = "foobarbaz";
|
var a = "foobarbaz";
|
||||||
var a1 = "foo,bar,baz";
|
var a1 = "foo,bar,baz";
|
||||||
|
var a2 = "foonullbarnullbaz";
|
||||||
|
var a3 = "foo,bar,baz";
|
||||||
|
var a4 = "foo,,baz";
|
||||||
|
var a5 = "foo,,baz";
|
||||||
|
var a6 = "foo,,baz";
|
||||||
var b = "foo123bar";
|
var b = "foo123bar";
|
||||||
var c = boo() + "foo123bar" + bar();
|
var c = boo() + "foo123bar" + bar();
|
||||||
var c1 = "" + boo() + bar() + "foo123bar" + bar();
|
var c1 = "" + boo() + bar() + "foo123bar" + bar();
|
||||||
var c2 = "12foobar" + baz();
|
var c2 = "12foobar" + baz();
|
||||||
|
var c3 = boo() + bar() + "foo123bar" + bar() + "foo";
|
||||||
|
var c4 = "12foobar" + baz();
|
||||||
|
var c5 = [ boo() + bar() + "foo", 1, 2, 3, "bar", bar() + "foo" ].join();
|
||||||
|
var c6 = [ "1,2,,,foo,bar", baz() ].join();
|
||||||
var d = "foo-3bar-baz";
|
var d = "foo-3bar-baz";
|
||||||
var e = [].join(foo + bar);
|
var e = [].join(foo + bar);
|
||||||
var f = "";
|
var f = "";
|
||||||
@@ -72,3 +90,152 @@ constant_join_2: {
|
|||||||
var f = "strstr" + variable + "foobarmoo" + foo;
|
var f = "strstr" + variable + "foobarmoo" + foo;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
constant_join_3: {
|
||||||
|
options = {
|
||||||
|
unsafe: true,
|
||||||
|
evaluate: true,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
var a = [ null ].join();
|
||||||
|
var b = [ , ].join();
|
||||||
|
var c = [ , 1, , 3 ].join();
|
||||||
|
var d = [ foo ].join();
|
||||||
|
var e = [ foo, null, undefined, bar ].join("-");
|
||||||
|
var f = [ foo, bar ].join("");
|
||||||
|
var g = [ null, "foo", null, bar + "baz" ].join("");
|
||||||
|
var h = [ null, "foo", null, bar + "baz" ].join("-");
|
||||||
|
var i = [ "foo" + bar, null, baz + "moo" ].join("");
|
||||||
|
var j = [ foo + "bar", baz ].join("");
|
||||||
|
var k = [ foo, "bar" + baz ].join("");
|
||||||
|
var l = [ foo, bar + "baz" ].join("");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "";
|
||||||
|
var b = "";
|
||||||
|
var c = ",1,,3";
|
||||||
|
var d = "" + foo;
|
||||||
|
var e = [ foo, "-", bar ].join("-");
|
||||||
|
var f = "" + foo + bar;
|
||||||
|
var g = "foo" + bar + "baz";
|
||||||
|
var h = [ "-foo-", bar + "baz" ].join("-");
|
||||||
|
var i = "foo" + bar + baz + "moo";
|
||||||
|
var j = foo + "bar" + baz;
|
||||||
|
var k = foo + "bar" + baz;
|
||||||
|
var l = foo + (bar + "baz");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for_loop: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
function f0() {
|
||||||
|
var a = [1, 2, 3];
|
||||||
|
var b = 0;
|
||||||
|
for (var i = 0; i < a.length; i++)
|
||||||
|
b += a[i];
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
function f1() {
|
||||||
|
var a = [1, 2, 3];
|
||||||
|
var b = 0;
|
||||||
|
for (var i = 0, len = a.length; i < len; i++)
|
||||||
|
b += a[i];
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
function f2() {
|
||||||
|
var a = [1, 2, 3];
|
||||||
|
for (var i = 0; i < a.length; i++)
|
||||||
|
a[i]++;
|
||||||
|
return a[2];
|
||||||
|
}
|
||||||
|
console.log(f0(), f1(), f2());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f0() {
|
||||||
|
var a = [1, 2, 3];
|
||||||
|
var b = 0;
|
||||||
|
for (var i = 0; i < 3; i++)
|
||||||
|
b += a[i];
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
function f1() {
|
||||||
|
var a = [1, 2, 3];
|
||||||
|
var b = 0;
|
||||||
|
for (var i = 0; i < 3; i++)
|
||||||
|
b += a[i];
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
function f2() {
|
||||||
|
var a = [1, 2, 3];
|
||||||
|
for (var i = 0; i < a.length; i++)
|
||||||
|
a[i]++;
|
||||||
|
return a[2];
|
||||||
|
}
|
||||||
|
console.log(f0(), f1(), f2());
|
||||||
|
}
|
||||||
|
expect_stdout: "6 6 4"
|
||||||
|
}
|
||||||
|
|
||||||
|
index: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = [ 1, 2 ];
|
||||||
|
console.log(a[0], a[1]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1, 2);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 2"
|
||||||
|
}
|
||||||
|
|
||||||
|
length: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = [ 1, 2 ];
|
||||||
|
console.log(a.length);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(2);
|
||||||
|
}
|
||||||
|
expect_stdout: "2"
|
||||||
|
}
|
||||||
|
|
||||||
|
index_length: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = [ 1, 2 ];
|
||||||
|
console.log(a[0], a.length);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1, 2);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 2"
|
||||||
|
}
|
||||||
|
|||||||
35
test/compress/ascii.js
Normal file
35
test/compress/ascii.js
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
ascii_only_true: {
|
||||||
|
options = {}
|
||||||
|
beautify = {
|
||||||
|
ascii_only : true,
|
||||||
|
ie8 : false,
|
||||||
|
beautify : false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
return "\x000\x001\x007\x008\x00" +
|
||||||
|
"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" +
|
||||||
|
"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" +
|
||||||
|
"\x20\x21\x22\x23 ... \x7d\x7e\x7f\x80\x81 ... \xfe\xff\u0fff\uffff";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: 'function f(){return"\\x000\\x001\\x007\\x008\\0"+"\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\b\\t\\n\\v\\f\\r\\x0e\\x0f"+"\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f"+\' !"# ... }~\\x7f\\x80\\x81 ... \\xfe\\xff\\u0fff\\uffff\'}'
|
||||||
|
}
|
||||||
|
|
||||||
|
ascii_only_false: {
|
||||||
|
options = {}
|
||||||
|
beautify = {
|
||||||
|
ascii_only : false,
|
||||||
|
ie8 : false,
|
||||||
|
beautify : false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
return "\x000\x001\x007\x008\x00" +
|
||||||
|
"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" +
|
||||||
|
"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" +
|
||||||
|
"\x20\x21\x22\x23 ... \x7d\x7e\x7f\x80\x81 ... \xfe\xff\u0fff\uffff";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: 'function f(){return"\\x000\\x001\\x007\\x008\\0"+"\\0\x01\x02\x03\x04\x05\x06\x07\\b\\t\\n\\v\\f\\r\x0e\x0f"+"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"+\' !"# ... }~\x7f\x80\x81 ... \xfe\xff\u0fff\uffff\'}'
|
||||||
|
}
|
||||||
167
test/compress/asm.js
Normal file
167
test/compress/asm.js
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
asm_mixed: {
|
||||||
|
options = {
|
||||||
|
sequences : true,
|
||||||
|
properties : true,
|
||||||
|
dead_code : true,
|
||||||
|
drop_debugger : true,
|
||||||
|
conditionals : true,
|
||||||
|
comparisons : true,
|
||||||
|
evaluate : true,
|
||||||
|
booleans : true,
|
||||||
|
loops : true,
|
||||||
|
unused : true,
|
||||||
|
hoist_funs : true,
|
||||||
|
keep_fargs : true,
|
||||||
|
keep_fnames : false,
|
||||||
|
hoist_vars : true,
|
||||||
|
if_return : true,
|
||||||
|
join_vars : true,
|
||||||
|
side_effects : true,
|
||||||
|
negate_iife : true
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
// adapted from http://asmjs.org/spec/latest/
|
||||||
|
function asm_GeometricMean(stdlib, foreign, buffer) {
|
||||||
|
"use asm";
|
||||||
|
var exp = stdlib.Math.exp;
|
||||||
|
var log = stdlib.Math.log;
|
||||||
|
var values = new stdlib.Float64Array(buffer);
|
||||||
|
function logSum(start, end) {
|
||||||
|
start = start|0;
|
||||||
|
end = end|0;
|
||||||
|
var sum = 0.0, p = 0, q = 0;
|
||||||
|
// asm.js forces byte addressing of the heap by requiring shifting by 3
|
||||||
|
for (p = start << 3, q = end << 3; (p|0) < (q|0); p = (p + 8)|0) {
|
||||||
|
sum = sum + +log(values[p>>3]);
|
||||||
|
}
|
||||||
|
return +sum;
|
||||||
|
}
|
||||||
|
function geometricMean(start, end) {
|
||||||
|
start = start|0;
|
||||||
|
end = end|0;
|
||||||
|
return +exp(+logSum(start, end) / +((end - start)|0));
|
||||||
|
}
|
||||||
|
return { geometricMean: geometricMean };
|
||||||
|
}
|
||||||
|
function no_asm_GeometricMean(stdlib, foreign, buffer) {
|
||||||
|
var exp = stdlib.Math.exp;
|
||||||
|
var log = stdlib.Math.log;
|
||||||
|
var values = new stdlib.Float64Array(buffer);
|
||||||
|
function logSum(start, end) {
|
||||||
|
start = start|0;
|
||||||
|
end = end|0;
|
||||||
|
var sum = 0.0, p = 0, q = 0;
|
||||||
|
// asm.js forces byte addressing of the heap by requiring shifting by 3
|
||||||
|
for (p = start << 3, q = end << 3; (p|0) < (q|0); p = (p + 8)|0) {
|
||||||
|
sum = sum + +log(values[p>>3]);
|
||||||
|
}
|
||||||
|
return +sum;
|
||||||
|
}
|
||||||
|
function geometricMean(start, end) {
|
||||||
|
start = start|0;
|
||||||
|
end = end|0;
|
||||||
|
return +exp(+logSum(start, end) / +((end - start)|0));
|
||||||
|
}
|
||||||
|
return { geometricMean: geometricMean };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function asm_GeometricMean(stdlib, foreign, buffer) {
|
||||||
|
"use asm";
|
||||||
|
var exp = stdlib.Math.exp;
|
||||||
|
var log = stdlib.Math.log;
|
||||||
|
var values = new stdlib.Float64Array(buffer);
|
||||||
|
function logSum(start, end) {
|
||||||
|
start = start | 0;
|
||||||
|
end = end | 0;
|
||||||
|
var sum = 0.0, p = 0, q = 0;
|
||||||
|
for (p = start << 3, q = end << 3; (p | 0) < (q | 0); p = p + 8 | 0) {
|
||||||
|
sum = sum + +log(values[p >> 3]);
|
||||||
|
}
|
||||||
|
return +sum;
|
||||||
|
}
|
||||||
|
function geometricMean(start, end) {
|
||||||
|
start = start | 0;
|
||||||
|
end = end | 0;
|
||||||
|
return +exp(+logSum(start, end) / +(end - start | 0));
|
||||||
|
}
|
||||||
|
return { geometricMean: geometricMean };
|
||||||
|
}
|
||||||
|
function no_asm_GeometricMean(stdlib, foreign, buffer) {
|
||||||
|
function logSum(start, end) {
|
||||||
|
start |= 0, end |= 0;
|
||||||
|
var sum = 0, p = 0, q = 0;
|
||||||
|
for (p = start << 3, q = end << 3; (0 | p) < (0 | q); p = p + 8 | 0) sum += +log(values[p >> 3]);
|
||||||
|
return +sum;
|
||||||
|
}
|
||||||
|
function geometricMean(start, end) {
|
||||||
|
return start |= 0, end |= 0, +exp(+logSum(start, end) / +(end - start | 0));
|
||||||
|
}
|
||||||
|
var exp = stdlib.Math.exp, log = stdlib.Math.log, values = new stdlib.Float64Array(buffer);
|
||||||
|
return { geometricMean: geometricMean };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
asm_toplevel: {
|
||||||
|
options = {}
|
||||||
|
input: {
|
||||||
|
"use asm";
|
||||||
|
0.0;
|
||||||
|
function f() {
|
||||||
|
0.0;
|
||||||
|
(function(){
|
||||||
|
0.0;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
0.0;
|
||||||
|
}
|
||||||
|
expect_exact: '"use asm";0.0;function f(){0.0;(function(){0.0})}0.0;'
|
||||||
|
}
|
||||||
|
|
||||||
|
asm_function_expression: {
|
||||||
|
options = {}
|
||||||
|
input: {
|
||||||
|
0.0;
|
||||||
|
var a = function() {
|
||||||
|
"use asm";
|
||||||
|
0.0;
|
||||||
|
}
|
||||||
|
function f() {
|
||||||
|
0.0;
|
||||||
|
return function(){
|
||||||
|
"use asm";
|
||||||
|
0.0;
|
||||||
|
}
|
||||||
|
0.0;
|
||||||
|
}
|
||||||
|
0.0;
|
||||||
|
}
|
||||||
|
expect_exact: '0;var a=function(){"use asm";0.0};function f(){0;return function(){"use asm";0.0};0}0;'
|
||||||
|
}
|
||||||
|
|
||||||
|
asm_nested_functions: {
|
||||||
|
options = {}
|
||||||
|
input: {
|
||||||
|
0.0;
|
||||||
|
function a() {
|
||||||
|
"use asm";
|
||||||
|
0.0;
|
||||||
|
}
|
||||||
|
0.0;
|
||||||
|
function b() {
|
||||||
|
0.0;
|
||||||
|
function c(){
|
||||||
|
"use asm";
|
||||||
|
0.0;
|
||||||
|
}
|
||||||
|
0.0;
|
||||||
|
function d(){
|
||||||
|
0.0;
|
||||||
|
}
|
||||||
|
0.0;
|
||||||
|
}
|
||||||
|
0.0;
|
||||||
|
}
|
||||||
|
expect_exact: '0;function a(){"use asm";0.0}0;function b(){0;function c(){"use asm";0.0}0;function d(){0}0}0;'
|
||||||
|
}
|
||||||
238
test/compress/assignment.js
Normal file
238
test/compress/assignment.js
Normal file
@@ -0,0 +1,238 @@
|
|||||||
|
op_equals_left_local_var: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var x;
|
||||||
|
|
||||||
|
x = x + 3;
|
||||||
|
x = x - 3;
|
||||||
|
x = x / 3;
|
||||||
|
x = x * 3;
|
||||||
|
x = x >> 3;
|
||||||
|
x = x << 3;
|
||||||
|
x = x >>> 3;
|
||||||
|
x = x | 3;
|
||||||
|
x = x ^ 3;
|
||||||
|
x = x % 3;
|
||||||
|
x = x & 3;
|
||||||
|
|
||||||
|
x = x + g();
|
||||||
|
x = x - g();
|
||||||
|
x = x / g();
|
||||||
|
x = x * g();
|
||||||
|
x = x >> g();
|
||||||
|
x = x << g();
|
||||||
|
x = x >>> g();
|
||||||
|
x = x | g();
|
||||||
|
x = x ^ g();
|
||||||
|
x = x % g();
|
||||||
|
x = x & g();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var x;
|
||||||
|
|
||||||
|
x += 3;
|
||||||
|
x -= 3;
|
||||||
|
x /= 3;
|
||||||
|
x *= 3;
|
||||||
|
x >>= 3;
|
||||||
|
x <<= 3;
|
||||||
|
x >>>= 3;
|
||||||
|
x |= 3;
|
||||||
|
x ^= 3;
|
||||||
|
x %= 3;
|
||||||
|
x &= 3;
|
||||||
|
|
||||||
|
x += g();
|
||||||
|
x -= g();
|
||||||
|
x /= g();
|
||||||
|
x *= g();
|
||||||
|
x >>= g();
|
||||||
|
x <<= g();
|
||||||
|
x >>>= g();
|
||||||
|
x |= g();
|
||||||
|
x ^= g();
|
||||||
|
x %= g();
|
||||||
|
x &= g();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
op_equals_right_local_var: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var x;
|
||||||
|
|
||||||
|
x = (x -= 2) ^ x;
|
||||||
|
|
||||||
|
x = 3 + x;
|
||||||
|
x = 3 - x;
|
||||||
|
x = 3 / x;
|
||||||
|
x = 3 * x;
|
||||||
|
x = 3 >> x;
|
||||||
|
x = 3 << x;
|
||||||
|
x = 3 >>> x;
|
||||||
|
x = 3 | x;
|
||||||
|
x = 3 ^ x;
|
||||||
|
x = 3 % x;
|
||||||
|
x = 3 & x;
|
||||||
|
|
||||||
|
x = g() + x;
|
||||||
|
x = g() - x;
|
||||||
|
x = g() / x;
|
||||||
|
x = g() * x;
|
||||||
|
x = g() >> x;
|
||||||
|
x = g() << x;
|
||||||
|
x = g() >>> x;
|
||||||
|
x = g() | x;
|
||||||
|
x = g() ^ x;
|
||||||
|
x = g() % x;
|
||||||
|
x = g() & x;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var x;
|
||||||
|
|
||||||
|
x = (x -= 2) ^ x;
|
||||||
|
|
||||||
|
x = 3 + x;
|
||||||
|
x = 3 - x;
|
||||||
|
x = 3 / x;
|
||||||
|
x *= 3;
|
||||||
|
x = 3 >> x;
|
||||||
|
x = 3 << x;
|
||||||
|
x = 3 >>> x;
|
||||||
|
x |= 3;
|
||||||
|
x ^= 3;
|
||||||
|
x = 3 % x;
|
||||||
|
x &= 3;
|
||||||
|
|
||||||
|
x = g() + x;
|
||||||
|
x = g() - x;
|
||||||
|
x = g() / x;
|
||||||
|
x = g() * x;
|
||||||
|
x = g() >> x;
|
||||||
|
x = g() << x;
|
||||||
|
x = g() >>> x;
|
||||||
|
x = g() | x;
|
||||||
|
x = g() ^ x;
|
||||||
|
x = g() % x;
|
||||||
|
x = g() & x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
op_equals_left_global_var: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
x = x + 3;
|
||||||
|
x = x - 3;
|
||||||
|
x = x / 3;
|
||||||
|
x = x * 3;
|
||||||
|
x = x >> 3;
|
||||||
|
x = x << 3;
|
||||||
|
x = x >>> 3;
|
||||||
|
x = x | 3;
|
||||||
|
x = x ^ 3;
|
||||||
|
x = x % 3;
|
||||||
|
x = x & 3;
|
||||||
|
|
||||||
|
x = x + g();
|
||||||
|
x = x - g();
|
||||||
|
x = x / g();
|
||||||
|
x = x * g();
|
||||||
|
x = x >> g();
|
||||||
|
x = x << g();
|
||||||
|
x = x >>> g();
|
||||||
|
x = x | g();
|
||||||
|
x = x ^ g();
|
||||||
|
x = x % g();
|
||||||
|
x = x & g();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
x += 3;
|
||||||
|
x -= 3;
|
||||||
|
x /= 3;
|
||||||
|
x *= 3;
|
||||||
|
x >>= 3;
|
||||||
|
x <<= 3;
|
||||||
|
x >>>= 3;
|
||||||
|
x |= 3;
|
||||||
|
x ^= 3;
|
||||||
|
x %= 3;
|
||||||
|
x &= 3;
|
||||||
|
|
||||||
|
x += g();
|
||||||
|
x -= g();
|
||||||
|
x /= g();
|
||||||
|
x *= g();
|
||||||
|
x >>= g();
|
||||||
|
x <<= g();
|
||||||
|
x >>>= g();
|
||||||
|
x |= g();
|
||||||
|
x ^= g();
|
||||||
|
x %= g();
|
||||||
|
x &= g();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
op_equals_right_global_var: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
x = (x -= 2) ^ x;
|
||||||
|
|
||||||
|
x = 3 + x;
|
||||||
|
x = 3 - x;
|
||||||
|
x = 3 / x;
|
||||||
|
x = 3 * x;
|
||||||
|
x = 3 >> x;
|
||||||
|
x = 3 << x;
|
||||||
|
x = 3 >>> x;
|
||||||
|
x = 3 | x;
|
||||||
|
x = 3 ^ x;
|
||||||
|
x = 3 % x;
|
||||||
|
x = 3 & x;
|
||||||
|
|
||||||
|
x = g() + x;
|
||||||
|
x = g() - x;
|
||||||
|
x = g() / x;
|
||||||
|
x = g() * x;
|
||||||
|
x = g() >> x;
|
||||||
|
x = g() << x;
|
||||||
|
x = g() >>> x;
|
||||||
|
x = g() | x;
|
||||||
|
x = g() ^ x;
|
||||||
|
x = g() % x;
|
||||||
|
x = g() & x;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
x = (x -= 2) ^ x;
|
||||||
|
|
||||||
|
x = 3 + x;
|
||||||
|
x = 3 - x;
|
||||||
|
x = 3 / x;
|
||||||
|
x *= 3;
|
||||||
|
x = 3 >> x;
|
||||||
|
x = 3 << x;
|
||||||
|
x = 3 >>> x;
|
||||||
|
x |= 3;
|
||||||
|
x ^= 3;
|
||||||
|
x = 3 % x;
|
||||||
|
x &= 3;
|
||||||
|
|
||||||
|
x = g() + x;
|
||||||
|
x = g() - x;
|
||||||
|
x = g() / x;
|
||||||
|
x = g() * x;
|
||||||
|
x = g() >> x;
|
||||||
|
x = g() << x;
|
||||||
|
x = g() >>> x;
|
||||||
|
x = g() | x;
|
||||||
|
x = g() ^ x;
|
||||||
|
x = g() % x;
|
||||||
|
x = g() & x;
|
||||||
|
}
|
||||||
|
}
|
||||||
5329
test/compress/collapse_vars.js
Normal file
5329
test/compress/collapse_vars.js
Normal file
File diff suppressed because it is too large
Load Diff
297
test/compress/comparing.js
Normal file
297
test/compress/comparing.js
Normal file
@@ -0,0 +1,297 @@
|
|||||||
|
comparisons: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj1, obj2;
|
||||||
|
var result1 = obj1 <= obj2;
|
||||||
|
var result2 = obj1 < obj2;
|
||||||
|
var result3 = obj1 >= obj2;
|
||||||
|
var result4 = obj1 > obj2;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var obj1, obj2;
|
||||||
|
var result1 = obj1 <= obj2;
|
||||||
|
var result2 = obj1 < obj2;
|
||||||
|
var result3 = obj2 <= obj1;
|
||||||
|
var result4 = obj2 < obj1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe_comps: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
unsafe_comps: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj1, obj2;
|
||||||
|
obj1 <= obj2 ? f1() : g1();
|
||||||
|
obj1 < obj2 ? f2() : g2();
|
||||||
|
obj1 >= obj2 ? f3() : g3();
|
||||||
|
obj1 > obj2 ? f4() : g4();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var obj1, obj2;
|
||||||
|
obj2 < obj1 ? g1() : f1();
|
||||||
|
obj1 < obj2 ? f2() : g2();
|
||||||
|
obj1 < obj2 ? g3() : f3();
|
||||||
|
obj2 < obj1 ? f4() : g4();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dont_change_in_or_instanceof_expressions: {
|
||||||
|
input: {
|
||||||
|
1 in 1;
|
||||||
|
null in null;
|
||||||
|
1 instanceof 1;
|
||||||
|
null instanceof null;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
1 in 1;
|
||||||
|
null in null;
|
||||||
|
1 instanceof 1;
|
||||||
|
null instanceof null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self_comparison_1: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
a === a;
|
||||||
|
a !== b;
|
||||||
|
b.c === a.c;
|
||||||
|
b.c !== b.c;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
a == a;
|
||||||
|
a !== b;
|
||||||
|
b.c === a.c;
|
||||||
|
b.c != b.c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self_comparison_2: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {}
|
||||||
|
var o = {};
|
||||||
|
console.log(f != f, o === o);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {}
|
||||||
|
var o = {};
|
||||||
|
console.log(false, true);
|
||||||
|
}
|
||||||
|
expect_stdout: "false true"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2857_1: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f1(a) {
|
||||||
|
a === undefined || a === null;
|
||||||
|
a === undefined || a !== null;
|
||||||
|
a !== undefined || a === null;
|
||||||
|
a !== undefined || a !== null;
|
||||||
|
a === undefined && a === null;
|
||||||
|
a === undefined && a !== null;
|
||||||
|
a !== undefined && a === null;
|
||||||
|
a !== undefined && a !== null;
|
||||||
|
}
|
||||||
|
function f2(a) {
|
||||||
|
a === null || a === undefined;
|
||||||
|
a === null || a !== undefined;
|
||||||
|
a !== null || a === undefined;
|
||||||
|
a !== null || a !== undefined;
|
||||||
|
a === null && a === undefined;
|
||||||
|
a === null && a !== undefined;
|
||||||
|
a !== null && a === undefined;
|
||||||
|
a !== null && a !== undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f1(a) {
|
||||||
|
null == a;
|
||||||
|
void 0 === a || null !== a;
|
||||||
|
void 0 !== a || null === a;
|
||||||
|
void 0 !== a || null !== a;
|
||||||
|
void 0 === a && null === a;
|
||||||
|
void 0 === a && null !== a;
|
||||||
|
void 0 !== a && null === a;
|
||||||
|
null != a;
|
||||||
|
}
|
||||||
|
function f2(a) {
|
||||||
|
null == a;
|
||||||
|
null === a || void 0 !== a;
|
||||||
|
null !== a || void 0 === a;
|
||||||
|
null !== a || void 0 !== a;
|
||||||
|
null === a && void 0 === a;
|
||||||
|
null === a && void 0 !== a;
|
||||||
|
null !== a && void 0 === a;
|
||||||
|
null != a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2857_2: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, p) {
|
||||||
|
a === undefined || a === null || p;
|
||||||
|
a === undefined || a !== null || p;
|
||||||
|
a !== undefined || a === null || p;
|
||||||
|
a !== undefined || a !== null || p;
|
||||||
|
a === undefined && a === null || p;
|
||||||
|
a === undefined && a !== null || p;
|
||||||
|
a !== undefined && a === null || p;
|
||||||
|
a !== undefined && a !== null || p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, p) {
|
||||||
|
null == a || p;
|
||||||
|
void 0 === a || null !== a || p;
|
||||||
|
void 0 !== a || null === a || p;
|
||||||
|
void 0 !== a || null !== a || p;
|
||||||
|
void 0 === a && null === a || p;
|
||||||
|
void 0 === a && null !== a || p;
|
||||||
|
void 0 !== a && null === a || p;
|
||||||
|
null != a || p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2857_3: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, p) {
|
||||||
|
a === undefined || a === null && p;
|
||||||
|
a === undefined || a !== null && p;
|
||||||
|
a !== undefined || a === null && p;
|
||||||
|
a !== undefined || a !== null && p;
|
||||||
|
a === undefined && a === null && p;
|
||||||
|
a === undefined && a !== null && p;
|
||||||
|
a !== undefined && a === null && p;
|
||||||
|
a !== undefined && a !== null && p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, p) {
|
||||||
|
void 0 === a || null === a && p;
|
||||||
|
void 0 === a || null !== a && p;
|
||||||
|
void 0 !== a || null === a && p;
|
||||||
|
void 0 !== a || null !== a && p;
|
||||||
|
void 0 === a && null === a && p;
|
||||||
|
void 0 === a && null !== a && p;
|
||||||
|
void 0 !== a && null === a && p;
|
||||||
|
null != a && p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2857_4: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, p) {
|
||||||
|
p || a === undefined || a === null;
|
||||||
|
p || a === undefined || a !== null;
|
||||||
|
p || a !== undefined || a === null;
|
||||||
|
p || a !== undefined || a !== null;
|
||||||
|
p || a === undefined && a === null;
|
||||||
|
p || a === undefined && a !== null;
|
||||||
|
p || a !== undefined && a === null;
|
||||||
|
p || a !== undefined && a !== null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, p) {
|
||||||
|
p || null == a;
|
||||||
|
p || void 0 === a || null !== a;
|
||||||
|
p || void 0 !== a || null === a;
|
||||||
|
p || void 0 !== a || null !== a;
|
||||||
|
p || void 0 === a && null === a;
|
||||||
|
p || void 0 === a && null !== a;
|
||||||
|
p || void 0 !== a && null === a;
|
||||||
|
p || null != a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2857_5: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, p) {
|
||||||
|
p && a === undefined || a === null;
|
||||||
|
p && a === undefined || a !== null;
|
||||||
|
p && a !== undefined || a === null;
|
||||||
|
p && a !== undefined || a !== null;
|
||||||
|
p && a === undefined && a === null;
|
||||||
|
p && a === undefined && a !== null;
|
||||||
|
p && a !== undefined && a === null;
|
||||||
|
p && a !== undefined && a !== null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, p) {
|
||||||
|
p && void 0 === a || null === a;
|
||||||
|
p && void 0 === a || null !== a;
|
||||||
|
p && void 0 !== a || null === a;
|
||||||
|
p && void 0 !== a || null !== a;
|
||||||
|
p && void 0 === a && null === a;
|
||||||
|
p && void 0 === a && null !== a;
|
||||||
|
p && void 0 !== a && null === a;
|
||||||
|
p && null != a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2857_6: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
if (({}).b === undefined || {}.b === null)
|
||||||
|
return a.b !== undefined && a.b !== null;
|
||||||
|
}
|
||||||
|
console.log(f({
|
||||||
|
a: [ null ],
|
||||||
|
get b() {
|
||||||
|
return this.a.shift();
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
if (null == {}.b)
|
||||||
|
return void 0 !== a.b && null !== a.b;
|
||||||
|
}
|
||||||
|
console.log(f({
|
||||||
|
a: [ null ],
|
||||||
|
get b() {
|
||||||
|
return this.a.shift();
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
@@ -11,6 +11,9 @@ concat_1: {
|
|||||||
var d = 1 + x() + 2 + 3 + "boo";
|
var d = 1 + x() + 2 + 3 + "boo";
|
||||||
|
|
||||||
var e = 1 + x() + 2 + "X" + 3 + "boo";
|
var e = 1 + x() + 2 + "X" + 3 + "boo";
|
||||||
|
|
||||||
|
// be careful with concatentation with "\0" with octal-looking strings.
|
||||||
|
var f = "\0" + 360 + "\0" + 8 + "\0";
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a = "foobar" + x() + "moofoo" + y() + "xyz" + q();
|
var a = "foobar" + x() + "moofoo" + y() + "xyz" + q();
|
||||||
@@ -18,5 +21,203 @@ concat_1: {
|
|||||||
var c = 1 + x() + 2 + "boo";
|
var c = 1 + x() + 2 + "boo";
|
||||||
var d = 1 + x() + 2 + 3 + "boo";
|
var d = 1 + x() + 2 + 3 + "boo";
|
||||||
var e = 1 + x() + 2 + "X3boo";
|
var e = 1 + x() + 2 + "X3boo";
|
||||||
|
var f = "\x00360\x008\0";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
concat_2: {
|
||||||
|
options = {};
|
||||||
|
input: {
|
||||||
|
console.log(
|
||||||
|
1 + (2 + 3),
|
||||||
|
1 + (2 + "3"),
|
||||||
|
1 + ("2" + 3),
|
||||||
|
1 + ("2" + "3"),
|
||||||
|
"1" + (2 + 3),
|
||||||
|
"1" + (2 + "3"),
|
||||||
|
"1" + ("2" + 3),
|
||||||
|
"1" + ("2" + "3")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(
|
||||||
|
1 + (2 + 3),
|
||||||
|
1 + (2 + "3"),
|
||||||
|
1 + "2" + 3,
|
||||||
|
1 + "2" + "3",
|
||||||
|
"1" + (2 + 3),
|
||||||
|
"1" + 2 + "3",
|
||||||
|
"1" + "2" + 3,
|
||||||
|
"1" + "2" + "3"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
concat_3: {
|
||||||
|
options = {};
|
||||||
|
input: {
|
||||||
|
console.log(
|
||||||
|
1 + 2 + (3 + 4 + 5),
|
||||||
|
1 + 2 + (3 + 4 + "5"),
|
||||||
|
1 + 2 + (3 + "4" + 5),
|
||||||
|
1 + 2 + (3 + "4" + "5"),
|
||||||
|
1 + 2 + ("3" + 4 + 5),
|
||||||
|
1 + 2 + ("3" + 4 + "5"),
|
||||||
|
1 + 2 + ("3" + "4" + 5),
|
||||||
|
1 + 2 + ("3" + "4" + "5")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(
|
||||||
|
1 + 2 + (3 + 4 + 5),
|
||||||
|
1 + 2 + (3 + 4 + "5"),
|
||||||
|
1 + 2 + (3 + "4") + 5,
|
||||||
|
1 + 2 + (3 + "4") + "5",
|
||||||
|
1 + 2 + "3" + 4 + 5,
|
||||||
|
1 + 2 + "3" + 4 + "5",
|
||||||
|
1 + 2 + "3" + "4" + 5,
|
||||||
|
1 + 2 + "3" + "4" + "5"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
concat_4: {
|
||||||
|
options = {};
|
||||||
|
input: {
|
||||||
|
console.log(
|
||||||
|
1 + "2" + (3 + 4 + 5),
|
||||||
|
1 + "2" + (3 + 4 + "5"),
|
||||||
|
1 + "2" + (3 + "4" + 5),
|
||||||
|
1 + "2" + (3 + "4" + "5"),
|
||||||
|
1 + "2" + ("3" + 4 + 5),
|
||||||
|
1 + "2" + ("3" + 4 + "5"),
|
||||||
|
1 + "2" + ("3" + "4" + 5),
|
||||||
|
1 + "2" + ("3" + "4" + "5")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(
|
||||||
|
1 + "2" + (3 + 4 + 5),
|
||||||
|
1 + "2" + (3 + 4) + "5",
|
||||||
|
1 + "2" + 3 + "4" + 5,
|
||||||
|
1 + "2" + 3 + "4" + "5",
|
||||||
|
1 + "2" + "3" + 4 + 5,
|
||||||
|
1 + "2" + "3" + 4 + "5",
|
||||||
|
1 + "2" + "3" + "4" + 5,
|
||||||
|
1 + "2" + "3" + "4" + "5"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
concat_5: {
|
||||||
|
options = {};
|
||||||
|
input: {
|
||||||
|
console.log(
|
||||||
|
"1" + 2 + (3 + 4 + 5),
|
||||||
|
"1" + 2 + (3 + 4 + "5"),
|
||||||
|
"1" + 2 + (3 + "4" + 5),
|
||||||
|
"1" + 2 + (3 + "4" + "5"),
|
||||||
|
"1" + 2 + ("3" + 4 + 5),
|
||||||
|
"1" + 2 + ("3" + 4 + "5"),
|
||||||
|
"1" + 2 + ("3" + "4" + 5),
|
||||||
|
"1" + 2 + ("3" + "4" + "5")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(
|
||||||
|
"1" + 2 + (3 + 4 + 5),
|
||||||
|
"1" + 2 + (3 + 4) + "5",
|
||||||
|
"1" + 2 + 3 + "4" + 5,
|
||||||
|
"1" + 2 + 3 + "4" + "5",
|
||||||
|
"1" + 2 + "3" + 4 + 5,
|
||||||
|
"1" + 2 + "3" + 4 + "5",
|
||||||
|
"1" + 2 + "3" + "4" + 5,
|
||||||
|
"1" + 2 + "3" + "4" + "5"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
concat_6: {
|
||||||
|
options = {};
|
||||||
|
input: {
|
||||||
|
console.log(
|
||||||
|
"1" + "2" + (3 + 4 + 5),
|
||||||
|
"1" + "2" + (3 + 4 + "5"),
|
||||||
|
"1" + "2" + (3 + "4" + 5),
|
||||||
|
"1" + "2" + (3 + "4" + "5"),
|
||||||
|
"1" + "2" + ("3" + 4 + 5),
|
||||||
|
"1" + "2" + ("3" + 4 + "5"),
|
||||||
|
"1" + "2" + ("3" + "4" + 5),
|
||||||
|
"1" + "2" + ("3" + "4" + "5")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(
|
||||||
|
"1" + "2" + (3 + 4 + 5),
|
||||||
|
"1" + "2" + (3 + 4) + "5",
|
||||||
|
"1" + "2" + 3 + "4" + 5,
|
||||||
|
"1" + "2" + 3 + "4" + "5",
|
||||||
|
"1" + "2" + "3" + 4 + 5,
|
||||||
|
"1" + "2" + "3" + 4 + "5",
|
||||||
|
"1" + "2" + "3" + "4" + 5,
|
||||||
|
"1" + "2" + "3" + "4" + "5"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
concat_7: {
|
||||||
|
input: {
|
||||||
|
console.log(
|
||||||
|
"" + 1,
|
||||||
|
"" + "1",
|
||||||
|
"" + 1 + 2,
|
||||||
|
"" + 1 + "2",
|
||||||
|
"" + "1" + 2,
|
||||||
|
"" + "1" + "2",
|
||||||
|
"" + (x += "foo")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(
|
||||||
|
"" + 1,
|
||||||
|
"1",
|
||||||
|
"" + 1 + 2,
|
||||||
|
1 + "2",
|
||||||
|
"1" + 2,
|
||||||
|
"1" + "2",
|
||||||
|
x += "foo"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
concat_8: {
|
||||||
|
input: {
|
||||||
|
console.log(
|
||||||
|
1 + "",
|
||||||
|
"1" + "",
|
||||||
|
1 + 2 + "",
|
||||||
|
1 + "2" + "",
|
||||||
|
"1" + 2 + "",
|
||||||
|
"1" + "2" + "",
|
||||||
|
(x += "foo") + ""
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(
|
||||||
|
1 + "",
|
||||||
|
"1",
|
||||||
|
1 + 2 + "",
|
||||||
|
1 + "2",
|
||||||
|
"1" + 2,
|
||||||
|
"1" + "2",
|
||||||
|
x += "foo"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -31,7 +31,7 @@ dead_code_2_should_warn: {
|
|||||||
function f() {
|
function f() {
|
||||||
g();
|
g();
|
||||||
x = 10;
|
x = 10;
|
||||||
throw "foo";
|
throw new Error("foo");
|
||||||
// completely discarding the `if` would introduce some
|
// completely discarding the `if` would introduce some
|
||||||
// bugs. UglifyJS v1 doesn't deal with this issue; in v2
|
// bugs. UglifyJS v1 doesn't deal with this issue; in v2
|
||||||
// we copy any declarations to the upper scope.
|
// we copy any declarations to the upper scope.
|
||||||
@@ -46,16 +46,20 @@ dead_code_2_should_warn: {
|
|||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
f();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
function f() {
|
function f() {
|
||||||
g();
|
g();
|
||||||
x = 10;
|
x = 10;
|
||||||
throw "foo";
|
throw new Error("foo");
|
||||||
var x;
|
var x;
|
||||||
function g(){};
|
function g(){};
|
||||||
}
|
}
|
||||||
|
f();
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: "<=4"
|
||||||
}
|
}
|
||||||
|
|
||||||
dead_code_constant_boolean_should_warn_more: {
|
dead_code_constant_boolean_should_warn_more: {
|
||||||
@@ -64,7 +68,8 @@ dead_code_constant_boolean_should_warn_more: {
|
|||||||
loops : true,
|
loops : true,
|
||||||
booleans : true,
|
booleans : true,
|
||||||
conditionals : true,
|
conditionals : true,
|
||||||
evaluate : true
|
evaluate : true,
|
||||||
|
side_effects : true,
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
while (!((foo && bar) || (x + "0"))) {
|
while (!((foo && bar) || (x + "0"))) {
|
||||||
@@ -72,18 +77,868 @@ dead_code_constant_boolean_should_warn_more: {
|
|||||||
var foo;
|
var foo;
|
||||||
function bar() {}
|
function bar() {}
|
||||||
}
|
}
|
||||||
for (var x = 10; x && (y || x) && (!typeof x); ++x) {
|
for (var x = 10, y; x && (y || x) && (!typeof x); ++x) {
|
||||||
asdf();
|
asdf();
|
||||||
foo();
|
foo();
|
||||||
var moo;
|
var moo;
|
||||||
}
|
}
|
||||||
|
bar();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var foo;
|
var foo;
|
||||||
function bar() {}
|
function bar() {}
|
||||||
// nothing for the while
|
// nothing for the while
|
||||||
// as for the for, it should keep:
|
// as for the for, it should keep:
|
||||||
var x = 10;
|
|
||||||
var moo;
|
var moo;
|
||||||
|
var x = 10, y;
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
node_version: "<=4"
|
||||||
|
}
|
||||||
|
|
||||||
|
try_catch_finally: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
passes: 2,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
!function() {
|
||||||
|
try {
|
||||||
|
if (false) throw x;
|
||||||
|
} catch (a) {
|
||||||
|
var a = 2;
|
||||||
|
console.log("FAIL");
|
||||||
|
} finally {
|
||||||
|
a = 3;
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
try {
|
||||||
|
console.log(a);
|
||||||
|
} finally {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
!function() {
|
||||||
|
var a;
|
||||||
|
a = 3;
|
||||||
|
console.log("PASS");
|
||||||
|
}();
|
||||||
|
try {
|
||||||
|
console.log(a);
|
||||||
|
} finally {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"PASS",
|
||||||
|
"1",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
accessor: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
({
|
||||||
|
get a() {},
|
||||||
|
set a(v){
|
||||||
|
this.b = 2;
|
||||||
|
},
|
||||||
|
b: 1
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2233_1: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
Array.isArray;
|
||||||
|
Boolean;
|
||||||
|
console.log;
|
||||||
|
Date;
|
||||||
|
decodeURI;
|
||||||
|
decodeURIComponent;
|
||||||
|
encodeURI;
|
||||||
|
encodeURIComponent;
|
||||||
|
Error.name;
|
||||||
|
escape;
|
||||||
|
eval;
|
||||||
|
EvalError;
|
||||||
|
Function.length;
|
||||||
|
isFinite;
|
||||||
|
isNaN;
|
||||||
|
JSON;
|
||||||
|
Math.random;
|
||||||
|
Number.isNaN;
|
||||||
|
parseFloat;
|
||||||
|
parseInt;
|
||||||
|
RegExp;
|
||||||
|
Object.defineProperty;
|
||||||
|
String.fromCharCode;
|
||||||
|
RangeError;
|
||||||
|
ReferenceError;
|
||||||
|
SyntaxError;
|
||||||
|
TypeError;
|
||||||
|
unescape;
|
||||||
|
URIError;
|
||||||
|
}
|
||||||
|
expect: {}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
global_timeout_and_interval_symbols: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
side_effects: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
// These global symbols do not exist in the test sandbox
|
||||||
|
// and must be tested separately.
|
||||||
|
clearInterval;
|
||||||
|
clearTimeout;
|
||||||
|
setInterval;
|
||||||
|
setTimeout;
|
||||||
|
}
|
||||||
|
expect: {}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2233_2: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var RegExp;
|
||||||
|
Array.isArray;
|
||||||
|
RegExp;
|
||||||
|
UndeclaredGlobal;
|
||||||
|
function foo() {
|
||||||
|
var Number;
|
||||||
|
AnotherUndeclaredGlobal;
|
||||||
|
Math.sin;
|
||||||
|
Number.isNaN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var RegExp;
|
||||||
|
UndeclaredGlobal;
|
||||||
|
function foo() {
|
||||||
|
var Number;
|
||||||
|
AnotherUndeclaredGlobal;
|
||||||
|
Number.isNaN;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
issue_2233_3: {
|
||||||
|
options = {
|
||||||
|
pure_getters: "strict",
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unsafe: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var RegExp;
|
||||||
|
Array.isArray;
|
||||||
|
RegExp;
|
||||||
|
UndeclaredGlobal;
|
||||||
|
function foo() {
|
||||||
|
var Number;
|
||||||
|
AnotherUndeclaredGlobal;
|
||||||
|
Math.sin;
|
||||||
|
Number.isNaN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
UndeclaredGlobal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
global_fns: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
Boolean(1, 2);
|
||||||
|
decodeURI(1, 2);
|
||||||
|
decodeURIComponent(1, 2);
|
||||||
|
Date(1, 2);
|
||||||
|
encodeURI(1, 2);
|
||||||
|
encodeURIComponent(1, 2);
|
||||||
|
Error(1, 2);
|
||||||
|
escape(1, 2);
|
||||||
|
EvalError(1, 2);
|
||||||
|
isFinite(1, 2);
|
||||||
|
isNaN(1, 2);
|
||||||
|
Number(1, 2);
|
||||||
|
Object(1, 2);
|
||||||
|
parseFloat(1, 2);
|
||||||
|
parseInt(1, 2);
|
||||||
|
RangeError(1, 2);
|
||||||
|
ReferenceError(1, 2);
|
||||||
|
String(1, 2);
|
||||||
|
SyntaxError(1, 2);
|
||||||
|
TypeError(1, 2);
|
||||||
|
unescape(1, 2);
|
||||||
|
URIError(1, 2);
|
||||||
|
try {
|
||||||
|
Function(1, 2);
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e.name);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
RegExp(1, 2);
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e.name);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Array(NaN);
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e.name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
try {
|
||||||
|
Function(1, 2);
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e.name);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
RegExp(1, 2);
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e.name);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Array(NaN);
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e.name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"SyntaxError",
|
||||||
|
"SyntaxError",
|
||||||
|
"RangeError",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
collapse_vars_assignment: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
dead_code: true,
|
||||||
|
passes: 2,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f0(c) {
|
||||||
|
var a = 3 / c;
|
||||||
|
return a = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f0(c) {
|
||||||
|
return 3 / c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
collapse_vars_lvalues_drop_assign: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
dead_code: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f0(x) { var i = ++x; return x += i; }
|
||||||
|
function f1(x) { var a = (x -= 3); return x += a; }
|
||||||
|
function f2(x) { var z = x, a = ++z; return z += a; }
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f0(x) { var i = ++x; return x + i; }
|
||||||
|
function f1(x) { var a = (x -= 3); return x + a; }
|
||||||
|
function f2(x) { var z = x, a = ++z; return z + a; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
collapse_vars_misc1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
dead_code: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f10(x) { var a = 5, b = 3; return a += b; }
|
||||||
|
function f11(x) { var a = 5, b = 3; return a += --b; }
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f10(x) { return 5 + 3; }
|
||||||
|
function f11(x) { var b = 3; return 5 + --b; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return_assignment: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f1(a, b, c) {
|
||||||
|
return a = x(), b = y(), b = a && (c >>= 5);
|
||||||
|
}
|
||||||
|
function f2() {
|
||||||
|
return e = x();
|
||||||
|
}
|
||||||
|
function f3(e) {
|
||||||
|
return e = x();
|
||||||
|
}
|
||||||
|
function f4() {
|
||||||
|
var e;
|
||||||
|
return e = x();
|
||||||
|
}
|
||||||
|
function f5(a) {
|
||||||
|
try {
|
||||||
|
return a = x();
|
||||||
|
} catch (b) {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function f6(a) {
|
||||||
|
try {
|
||||||
|
return a = x();
|
||||||
|
} finally {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function y() {
|
||||||
|
console.log("y");
|
||||||
|
}
|
||||||
|
function test(inc) {
|
||||||
|
var counter = 0;
|
||||||
|
x = function() {
|
||||||
|
counter += inc;
|
||||||
|
if (inc < 0) throw counter;
|
||||||
|
return counter;
|
||||||
|
};
|
||||||
|
[ f1, f2, f3, f4, f5, f6 ].forEach(function(f, i) {
|
||||||
|
e = null;
|
||||||
|
try {
|
||||||
|
i += 1;
|
||||||
|
console.log("result " + f(10 * i, 100 * i, 1000 * i));
|
||||||
|
} catch (x) {
|
||||||
|
console.log("caught " + x);
|
||||||
|
}
|
||||||
|
if (null !== e) console.log("e: " + e);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
var x, e;
|
||||||
|
test(1);
|
||||||
|
test(-1);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f1(a, b, c) {
|
||||||
|
return a = x(), y(), a && (c >> 5);
|
||||||
|
}
|
||||||
|
function f2() {
|
||||||
|
return e = x();
|
||||||
|
}
|
||||||
|
function f3(e) {
|
||||||
|
return x();
|
||||||
|
}
|
||||||
|
function f4() {
|
||||||
|
return x();
|
||||||
|
}
|
||||||
|
function f5(a) {
|
||||||
|
try {
|
||||||
|
return x();
|
||||||
|
} catch (b) {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function f6(a) {
|
||||||
|
try {
|
||||||
|
return a = x();
|
||||||
|
} finally {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function y() {
|
||||||
|
console.log("y");
|
||||||
|
}
|
||||||
|
function test(inc) {
|
||||||
|
var counter = 0;
|
||||||
|
x = function() {
|
||||||
|
counter += inc;
|
||||||
|
if (inc < 0) throw counter;
|
||||||
|
return counter;
|
||||||
|
};
|
||||||
|
[ f1, f2, f3, f4, f5, f6 ].forEach(function(f, i) {
|
||||||
|
e = null;
|
||||||
|
try {
|
||||||
|
i += 1;
|
||||||
|
console.log("result " + f(10 * i, 100 * i, 1000 * i));
|
||||||
|
} catch (x) {
|
||||||
|
console.log("caught " + x);
|
||||||
|
}
|
||||||
|
if (null !== e) console.log("e: " + e);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
var x, e;
|
||||||
|
test(1);
|
||||||
|
test(-1);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"y",
|
||||||
|
"result 31",
|
||||||
|
"result 2",
|
||||||
|
"e: 2",
|
||||||
|
"result 3",
|
||||||
|
"result 4",
|
||||||
|
"result 5",
|
||||||
|
"6",
|
||||||
|
"result 6",
|
||||||
|
"caught -1",
|
||||||
|
"caught -2",
|
||||||
|
"caught -3",
|
||||||
|
"caught -4",
|
||||||
|
"50",
|
||||||
|
"result undefined",
|
||||||
|
"60",
|
||||||
|
"caught -6",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
throw_assignment: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f1() {
|
||||||
|
throw a = x();
|
||||||
|
}
|
||||||
|
function f2(a) {
|
||||||
|
throw a = x();
|
||||||
|
}
|
||||||
|
function f3() {
|
||||||
|
var a;
|
||||||
|
throw a = x();
|
||||||
|
}
|
||||||
|
function f4() {
|
||||||
|
try {
|
||||||
|
throw a = x();
|
||||||
|
} catch (b) {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function f5(a) {
|
||||||
|
try {
|
||||||
|
throw a = x();
|
||||||
|
} catch (b) {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function f6() {
|
||||||
|
var a;
|
||||||
|
try {
|
||||||
|
throw a = x();
|
||||||
|
} catch (b) {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function f7() {
|
||||||
|
try {
|
||||||
|
throw a = x();
|
||||||
|
} finally {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function f8(a) {
|
||||||
|
try {
|
||||||
|
throw a = x();
|
||||||
|
} finally {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function f9() {
|
||||||
|
var a;
|
||||||
|
try {
|
||||||
|
throw a = x();
|
||||||
|
} finally {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function test(inc) {
|
||||||
|
var counter = 0;
|
||||||
|
x = function() {
|
||||||
|
counter += inc;
|
||||||
|
if (inc < 0) throw counter;
|
||||||
|
return counter;
|
||||||
|
};
|
||||||
|
[ f1, f2, f3, f4, f5, f6, f7, f8, f9 ].forEach(function(f, i) {
|
||||||
|
a = null;
|
||||||
|
try {
|
||||||
|
f(10 * (1 + i));
|
||||||
|
} catch (x) {
|
||||||
|
console.log("caught " + x);
|
||||||
|
}
|
||||||
|
if (null !== a) console.log("a: " + a);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
var x, a;
|
||||||
|
test(1);
|
||||||
|
test(-1);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f1() {
|
||||||
|
throw a = x();
|
||||||
|
}
|
||||||
|
function f2(a) {
|
||||||
|
throw x();
|
||||||
|
}
|
||||||
|
function f3() {
|
||||||
|
throw x();
|
||||||
|
}
|
||||||
|
function f4() {
|
||||||
|
try {
|
||||||
|
throw a = x();
|
||||||
|
} catch (b) {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function f5(a) {
|
||||||
|
try {
|
||||||
|
throw a = x();
|
||||||
|
} catch (b) {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function f6() {
|
||||||
|
var a;
|
||||||
|
try {
|
||||||
|
throw a = x();
|
||||||
|
} catch (b) {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function f7() {
|
||||||
|
try {
|
||||||
|
throw a = x();
|
||||||
|
} finally {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function f8(a) {
|
||||||
|
try {
|
||||||
|
throw a = x();
|
||||||
|
} finally {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function f9() {
|
||||||
|
var a;
|
||||||
|
try {
|
||||||
|
throw a = x();
|
||||||
|
} finally {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function test(inc) {
|
||||||
|
var counter = 0;
|
||||||
|
x = function() {
|
||||||
|
counter += inc;
|
||||||
|
if (inc < 0) throw counter;
|
||||||
|
return counter;
|
||||||
|
};
|
||||||
|
[ f1, f2, f3, f4, f5, f6, f7, f8, f9 ].forEach(function(f, i) {
|
||||||
|
a = null;
|
||||||
|
try {
|
||||||
|
f(10 * (1 + i));
|
||||||
|
} catch (x) {
|
||||||
|
console.log("caught " + x);
|
||||||
|
}
|
||||||
|
if (null !== a) console.log("a: " + a);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
var x, a;
|
||||||
|
test(1);
|
||||||
|
test(-1);
|
||||||
|
}
|
||||||
|
expect_stdout: [
|
||||||
|
"caught 1",
|
||||||
|
"a: 1",
|
||||||
|
"caught 2",
|
||||||
|
"caught 3",
|
||||||
|
"4",
|
||||||
|
"a: 4",
|
||||||
|
"5",
|
||||||
|
"6",
|
||||||
|
"7",
|
||||||
|
"caught 7",
|
||||||
|
"a: 7",
|
||||||
|
"8",
|
||||||
|
"caught 8",
|
||||||
|
"9",
|
||||||
|
"caught 9",
|
||||||
|
"caught -1",
|
||||||
|
"caught -2",
|
||||||
|
"caught -3",
|
||||||
|
"null",
|
||||||
|
"50",
|
||||||
|
"undefined",
|
||||||
|
"null",
|
||||||
|
"caught -7",
|
||||||
|
"80",
|
||||||
|
"caught -8",
|
||||||
|
"undefined",
|
||||||
|
"caught -9",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2597: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(b) {
|
||||||
|
try {
|
||||||
|
try {
|
||||||
|
throw "foo";
|
||||||
|
} catch (e) {
|
||||||
|
return b = true;
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
b && (a = "PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var a = "FAIL";
|
||||||
|
f();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(b) {
|
||||||
|
try {
|
||||||
|
try {
|
||||||
|
throw "foo";
|
||||||
|
} catch (e) {
|
||||||
|
return b = true;
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
b && (a = "PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var a = "FAIL";
|
||||||
|
f();
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2666: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
return a = {
|
||||||
|
p: function() {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
console.log(typeof f().p());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
return a = {
|
||||||
|
p: function() {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
console.log(typeof f().p());
|
||||||
|
}
|
||||||
|
expect_stdout: "object"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2692: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
reduce_vars: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
return a = g;
|
||||||
|
function g() {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(typeof f()());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
return a = g;
|
||||||
|
function g() {
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(typeof f()());
|
||||||
|
}
|
||||||
|
expect_stdout: "function"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2701: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
inline: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
return a = function() {
|
||||||
|
return function() {
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
console.log(typeof f()());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a) {
|
||||||
|
return a = function() {
|
||||||
|
return function() {
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
console.log(typeof f()());
|
||||||
|
}
|
||||||
|
expect_stdout: "function"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2749: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
inline: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 2, c = "PASS";
|
||||||
|
while (a--)
|
||||||
|
(function() {
|
||||||
|
return b ? c = "FAIL" : b = 1;
|
||||||
|
try {
|
||||||
|
} catch (b) {
|
||||||
|
var b;
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 2, c = "PASS";
|
||||||
|
while (a--)
|
||||||
|
b = void 0, b ? c = "FAIL" : b = 1;
|
||||||
|
var b;
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe_builtin: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(!w).constructor(x);
|
||||||
|
Math.abs(y);
|
||||||
|
[ 1, 2, z ].valueOf();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
w, x;
|
||||||
|
y;
|
||||||
|
z;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2860_1: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
return a ^= 1;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
return 1 ^ a;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2860_2: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
return a ^= 1;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2929: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(a) {
|
||||||
|
try {
|
||||||
|
return null.p = a = 1;
|
||||||
|
} catch (e) {
|
||||||
|
return a ? "PASS" : "FAIL";
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(a) {
|
||||||
|
try {
|
||||||
|
return null.p = a = 1;
|
||||||
|
} catch (e) {
|
||||||
|
return a ? "PASS" : "FAIL";
|
||||||
|
}
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|||||||
24
test/compress/drop-console.js
Normal file
24
test/compress/drop-console.js
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
drop_console_1: {
|
||||||
|
options = {};
|
||||||
|
input: {
|
||||||
|
console.log('foo');
|
||||||
|
console.log.apply(console, arguments);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log('foo');
|
||||||
|
console.log.apply(console, arguments);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_console_2: {
|
||||||
|
options = { drop_console: true };
|
||||||
|
input: {
|
||||||
|
console.log('foo');
|
||||||
|
console.log.apply(console, arguments);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
// with regular compression these will be stripped out as well
|
||||||
|
void 0;
|
||||||
|
void 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
1608
test/compress/evaluate.js
Normal file
1608
test/compress/evaluate.js
Normal file
File diff suppressed because it is too large
Load Diff
2239
test/compress/functions.js
Normal file
2239
test/compress/functions.js
Normal file
File diff suppressed because it is too large
Load Diff
199
test/compress/global_defs.js
Normal file
199
test/compress/global_defs.js
Normal file
@@ -0,0 +1,199 @@
|
|||||||
|
must_replace: {
|
||||||
|
options = {
|
||||||
|
global_defs: {
|
||||||
|
D: "foo bar",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(D);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log("foo bar");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
keyword: {
|
||||||
|
options = {
|
||||||
|
global_defs: {
|
||||||
|
undefined: 0,
|
||||||
|
NaN: 1,
|
||||||
|
Infinity: 2,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(undefined, NaN, Infinity);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(0, 1, 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
global_defs: {
|
||||||
|
CONFIG: {
|
||||||
|
DEBUG: [ 0 ],
|
||||||
|
VALUE: 42,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
side_effects: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(CONFIG) {
|
||||||
|
// CONFIG not global - do not replace
|
||||||
|
return CONFIG.VALUE;
|
||||||
|
}
|
||||||
|
function g() {
|
||||||
|
var CONFIG = { VALUE: 1 };
|
||||||
|
// CONFIG not global - do not replace
|
||||||
|
return CONFIG.VALUE;
|
||||||
|
}
|
||||||
|
function h() {
|
||||||
|
return CONFIG.VALUE;
|
||||||
|
}
|
||||||
|
if (CONFIG.DEBUG[0])
|
||||||
|
console.debug("foo");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(CONFIG) {
|
||||||
|
return CONFIG.VALUE;
|
||||||
|
}
|
||||||
|
function g() {
|
||||||
|
var CONFIG = { VALUE: 1 };
|
||||||
|
return CONFIG.VALUE;
|
||||||
|
}
|
||||||
|
function h() {
|
||||||
|
return 42;
|
||||||
|
}
|
||||||
|
if (0)
|
||||||
|
console.debug("foo");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
expanded: {
|
||||||
|
options = {
|
||||||
|
global_defs: {
|
||||||
|
"CONFIG.DEBUG": [ 0 ],
|
||||||
|
"CONFIG.VALUE": 42,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(CONFIG) {
|
||||||
|
// CONFIG not global - do not replace
|
||||||
|
return CONFIG.VALUE;
|
||||||
|
}
|
||||||
|
function g() {
|
||||||
|
var CONFIG = { VALUE: 1 };
|
||||||
|
// CONFIG not global - do not replace
|
||||||
|
return CONFIG.VALUE;
|
||||||
|
}
|
||||||
|
function h() {
|
||||||
|
return CONFIG.VALUE;
|
||||||
|
}
|
||||||
|
if (CONFIG.DEBUG[0])
|
||||||
|
console.debug("foo");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(CONFIG) {
|
||||||
|
return CONFIG.VALUE;
|
||||||
|
}
|
||||||
|
function g() {
|
||||||
|
var CONFIG = { VALUE: 1 };
|
||||||
|
return CONFIG.VALUE;
|
||||||
|
}
|
||||||
|
function h() {
|
||||||
|
return 42;
|
||||||
|
}
|
||||||
|
if ([0][0])
|
||||||
|
console.debug("foo");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mixed: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
global_defs: {
|
||||||
|
"CONFIG.VALUE": 42,
|
||||||
|
"FOO.BAR": "moo",
|
||||||
|
},
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var FOO = { BAR: 0 };
|
||||||
|
console.log(FOO.BAR);
|
||||||
|
console.log(++CONFIG.DEBUG);
|
||||||
|
console.log(++CONFIG.VALUE);
|
||||||
|
console.log(++CONFIG["VAL" + "UE"]);
|
||||||
|
console.log(++DEBUG[CONFIG.VALUE]);
|
||||||
|
CONFIG.VALUE.FOO = "bar";
|
||||||
|
console.log(CONFIG);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var FOO = { BAR: 0 };
|
||||||
|
console.log("moo");
|
||||||
|
console.log(++CONFIG.DEBUG);
|
||||||
|
console.log(++CONFIG.VALUE);
|
||||||
|
console.log(++CONFIG.VALUE);
|
||||||
|
console.log(++DEBUG[42]);
|
||||||
|
CONFIG.VALUE.FOO = "bar";
|
||||||
|
console.log(CONFIG);
|
||||||
|
}
|
||||||
|
expect_warnings: [
|
||||||
|
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:127,22]',
|
||||||
|
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:128,22]',
|
||||||
|
'WARN: global_defs CONFIG.VALUE redefined [test/compress/global_defs.js:130,8]',
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1801: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
global_defs: {
|
||||||
|
"CONFIG.FOO.BAR": true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(CONFIG.FOO.BAR);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(!0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1986: {
|
||||||
|
options = {
|
||||||
|
global_defs: {
|
||||||
|
"@alert": "console.log",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
alert(42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(42);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2167: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
global_defs: {
|
||||||
|
"@isDevMode": "function(){}",
|
||||||
|
},
|
||||||
|
passes: 2,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (isDevMode()) {
|
||||||
|
greetOverlord();
|
||||||
|
}
|
||||||
|
doWork();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
doWork();
|
||||||
|
}
|
||||||
|
}
|
||||||
718
test/compress/hoist_props.js
Normal file
718
test/compress/hoist_props.js
Normal file
@@ -0,0 +1,718 @@
|
|||||||
|
issue_2377_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj = {
|
||||||
|
foo: 1,
|
||||||
|
bar: 2,
|
||||||
|
square: function(x) {
|
||||||
|
return x * x;
|
||||||
|
},
|
||||||
|
cube: function(x) {
|
||||||
|
return x * x * x;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
console.log(obj.foo, obj.cube(3));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var obj_foo = 1, obj_cube = function(x) {
|
||||||
|
return x * x * x;
|
||||||
|
};
|
||||||
|
console.log(obj_foo, obj_cube(3));
|
||||||
|
}
|
||||||
|
expect_stdout: "1 27"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2377_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
hoist_props: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj = {
|
||||||
|
foo: 1,
|
||||||
|
bar: 2,
|
||||||
|
square: function(x) {
|
||||||
|
return x * x;
|
||||||
|
},
|
||||||
|
cube: function(x) {
|
||||||
|
return x * x * x;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
console.log(obj.foo, obj.cube(3));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1, (x = 3, x * x * x));
|
||||||
|
var x;
|
||||||
|
}
|
||||||
|
expect_stdout: "1 27"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2377_3: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
hoist_props: true,
|
||||||
|
passes: 4,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj = {
|
||||||
|
foo: 1,
|
||||||
|
bar: 2,
|
||||||
|
square: function(x) {
|
||||||
|
return x * x;
|
||||||
|
},
|
||||||
|
cube: function(x) {
|
||||||
|
return x * x * x;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
console.log(obj.foo, obj.cube(3));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1, 27);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 27"
|
||||||
|
}
|
||||||
|
|
||||||
|
direct_access_1: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0;
|
||||||
|
var obj = {
|
||||||
|
a: 1,
|
||||||
|
b: 2,
|
||||||
|
};
|
||||||
|
for (var k in obj) a++;
|
||||||
|
console.log(a, obj.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0;
|
||||||
|
var obj = {
|
||||||
|
a: 1,
|
||||||
|
b: 2,
|
||||||
|
};
|
||||||
|
for (var k in obj) a++;
|
||||||
|
console.log(a, obj.a);
|
||||||
|
}
|
||||||
|
expect_stdout: "2 1"
|
||||||
|
}
|
||||||
|
|
||||||
|
direct_access_2: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = { a: 1 };
|
||||||
|
var f = function(k) {
|
||||||
|
if (o[k]) return "PASS";
|
||||||
|
};
|
||||||
|
console.log(f("a"));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = { a: 1 };
|
||||||
|
console.log(function(k) {
|
||||||
|
if (o[k]) return "PASS";
|
||||||
|
}("a"));
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
direct_access_3: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = { a: 1 };
|
||||||
|
o.b;
|
||||||
|
console.log(o.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = { a: 1 };
|
||||||
|
o.b;
|
||||||
|
console.log(o.a);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
single_use: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj = {
|
||||||
|
bar: function() {
|
||||||
|
return 42;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
console.log(obj.bar());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log({
|
||||||
|
bar: function() {
|
||||||
|
return 42;
|
||||||
|
},
|
||||||
|
}.bar());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
name_collision_1: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj_foo = 1;
|
||||||
|
var obj_bar = 2;
|
||||||
|
function f() {
|
||||||
|
var obj = {
|
||||||
|
foo: 3,
|
||||||
|
bar: 4,
|
||||||
|
"b-r": 5,
|
||||||
|
"b+r": 6,
|
||||||
|
"b!r": 7,
|
||||||
|
};
|
||||||
|
console.log(obj_foo, obj.foo, obj.bar, obj["b-r"], obj["b+r"], obj["b!r"]);
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var obj_foo = 1;
|
||||||
|
var obj_bar = 2;
|
||||||
|
function f() {
|
||||||
|
var obj_foo$0 = 3,
|
||||||
|
obj_bar = 4,
|
||||||
|
obj_b_r = 5,
|
||||||
|
obj_b_r$0 = 6,
|
||||||
|
obj_b_r$1 = 7;
|
||||||
|
console.log(obj_foo, obj_foo$0, obj_bar, obj_b_r, obj_b_r$0, obj_b_r$1);
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_stdout: "1 3 4 5 6 7"
|
||||||
|
}
|
||||||
|
|
||||||
|
name_collision_2: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
p: 1,
|
||||||
|
"+": function(x) {
|
||||||
|
return x;
|
||||||
|
},
|
||||||
|
"-": function(x) {
|
||||||
|
return x + 1;
|
||||||
|
}
|
||||||
|
}, o__$0 = 2, o__$1 = 3;
|
||||||
|
console.log(o.p === o.p, o["+"](4), o["-"](5), o__$0, o__$1);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o_p = 1,
|
||||||
|
o__ = function(x) {
|
||||||
|
return x;
|
||||||
|
},
|
||||||
|
o__$2 = function(x) {
|
||||||
|
return x + 1;
|
||||||
|
},
|
||||||
|
o__$0 = 2,
|
||||||
|
o__$1 = 3;
|
||||||
|
console.log(o_p === o_p, o__(4), o__$2(5), o__$0, o__$1);
|
||||||
|
}
|
||||||
|
expect_stdout: "true 4 6 2 3"
|
||||||
|
}
|
||||||
|
|
||||||
|
name_collision_3: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
p: 1,
|
||||||
|
"+": function(x) {
|
||||||
|
return x;
|
||||||
|
},
|
||||||
|
"-": function(x) {
|
||||||
|
return x + 1;
|
||||||
|
}
|
||||||
|
}, o__$0 = 2, o__$1 = 3;
|
||||||
|
console.log(o.p === o.p, o["+"](4), o["-"](5));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o_p = 1,
|
||||||
|
o__ = function(x) {
|
||||||
|
return x;
|
||||||
|
},
|
||||||
|
o__$2 = function(x) {
|
||||||
|
return x + 1;
|
||||||
|
},
|
||||||
|
o__$0 = 2,
|
||||||
|
o__$1 = 3;
|
||||||
|
console.log(o_p === o_p, o__(4), o__$2(5));
|
||||||
|
}
|
||||||
|
expect_stdout: "true 4 6"
|
||||||
|
}
|
||||||
|
|
||||||
|
contains_this_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
u: function() {
|
||||||
|
return this === this;
|
||||||
|
},
|
||||||
|
p: 1
|
||||||
|
};
|
||||||
|
console.log(o.p, o.p);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1, 1);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 1"
|
||||||
|
}
|
||||||
|
|
||||||
|
contains_this_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
u: function() {
|
||||||
|
return this === this;
|
||||||
|
},
|
||||||
|
p: 1
|
||||||
|
};
|
||||||
|
console.log(o.p, o.p, o.u);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(1, 1, function() {
|
||||||
|
return this === this;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
contains_this_3: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
u: function() {
|
||||||
|
return this === this;
|
||||||
|
},
|
||||||
|
p: 1
|
||||||
|
};
|
||||||
|
console.log(o.p, o.p, o.u());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
u: function() {
|
||||||
|
return this === this;
|
||||||
|
},
|
||||||
|
p: 1
|
||||||
|
};
|
||||||
|
console.log(o.p, o.p, o.u());
|
||||||
|
}
|
||||||
|
expect_stdout: "1 1 true"
|
||||||
|
}
|
||||||
|
|
||||||
|
new_this: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
a: 1,
|
||||||
|
b: 2,
|
||||||
|
f: function(a) {
|
||||||
|
this.b = a;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
console.log(new o.f(o.a).b, o.b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(new function(a) {
|
||||||
|
this.b = a;
|
||||||
|
}(1).b, 2);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 2"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2473_1: {
|
||||||
|
options = {
|
||||||
|
hoist_props: false,
|
||||||
|
reduce_vars: true,
|
||||||
|
top_retain: [ "x", "y" ],
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var x = {};
|
||||||
|
var y = [];
|
||||||
|
var z = {};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var x = {};
|
||||||
|
var y = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2473_2: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
top_retain: [ "x", "y" ],
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var x = {};
|
||||||
|
var y = [];
|
||||||
|
var z = {};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var x = {};
|
||||||
|
var y = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2473_3: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
top_retain: "o",
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
a: 1,
|
||||||
|
b: 2,
|
||||||
|
};
|
||||||
|
console.log(o.a, o.b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
a: 1,
|
||||||
|
b: 2,
|
||||||
|
};
|
||||||
|
console.log(o.a, o.b);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 2"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2473_4: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
top_retain: "o",
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
var o = {
|
||||||
|
a: 1,
|
||||||
|
b: 2,
|
||||||
|
};
|
||||||
|
console.log(o.a, o.b);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
var o_a = 1, o_b = 2;
|
||||||
|
console.log(o_a, o_b);
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "1 2"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2508_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
a: [ 1 ],
|
||||||
|
f: function(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o.f(o.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(x) {
|
||||||
|
console.log(x);
|
||||||
|
})([ 1 ]);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2508_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
a: { b: 2 },
|
||||||
|
f: function(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o.f(o.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(x) {
|
||||||
|
console.log(x);
|
||||||
|
})({ b: 2 });
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2508_3: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
a: [ o ],
|
||||||
|
f: function(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o.f(o.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
a: [ o ],
|
||||||
|
f: function(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o.f(o.a);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2508_4: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
a: { b: o },
|
||||||
|
f: function(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o.f(o.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = {
|
||||||
|
a: { b: o },
|
||||||
|
f: function(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o.f(o.a);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2508_5: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = {
|
||||||
|
f: function(x) {
|
||||||
|
console.log(x);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
o.f(o.f);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o_f = function(x) {
|
||||||
|
console.log(x);
|
||||||
|
};
|
||||||
|
o_f(o_f);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2519: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function testFunc() {
|
||||||
|
var dimensions = {
|
||||||
|
minX: 5,
|
||||||
|
maxX: 6,
|
||||||
|
};
|
||||||
|
var scale = 1;
|
||||||
|
var d = {
|
||||||
|
x: (dimensions.maxX + dimensions.minX) / 2,
|
||||||
|
};
|
||||||
|
return d.x * scale;
|
||||||
|
}
|
||||||
|
console.log(testFunc());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function testFunc() {
|
||||||
|
return 1 * ((6 + 5) / 2);
|
||||||
|
}
|
||||||
|
console.log(testFunc());
|
||||||
|
}
|
||||||
|
expect_stdout: "5.5"
|
||||||
|
}
|
||||||
|
|
||||||
|
undefined_key: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
hoist_props: true,
|
||||||
|
join_vars: true,
|
||||||
|
passes: 4,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a, o = {};
|
||||||
|
o[a] = 1;
|
||||||
|
o.b = 2;
|
||||||
|
console.log(o[a] + o.b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(3);
|
||||||
|
}
|
||||||
|
expect_stdout: "3"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3021: {
|
||||||
|
options = {
|
||||||
|
hoist_props: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1, b = 2;
|
||||||
|
(function() {
|
||||||
|
b = a;
|
||||||
|
if (a++ + b--)
|
||||||
|
return 1;
|
||||||
|
return;
|
||||||
|
var b = {};
|
||||||
|
})();
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1, b = 2;
|
||||||
|
(function() {
|
||||||
|
b = a;
|
||||||
|
if (a++ + b--)
|
||||||
|
return 1;
|
||||||
|
return;
|
||||||
|
var b = {};
|
||||||
|
})();
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_stdout: "2 2"
|
||||||
|
}
|
||||||
111
test/compress/hoist_vars.js
Normal file
111
test/compress/hoist_vars.js
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
statements: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: false,
|
||||||
|
hoist_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
var a = 1;
|
||||||
|
var b = 2;
|
||||||
|
var c = 3;
|
||||||
|
function g() {}
|
||||||
|
return g(a, b, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
var a = 1, b = 2, c = 3;
|
||||||
|
function g() {}
|
||||||
|
return g(a, b, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
statements_funs: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
var a = 1;
|
||||||
|
var b = 2;
|
||||||
|
var c = 3;
|
||||||
|
function g() {}
|
||||||
|
return g(a, b, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
function g() {}
|
||||||
|
var a = 1, b = 2, c = 3;
|
||||||
|
return g(a, b, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sequences: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: false,
|
||||||
|
hoist_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
var a = 1, b = 2;
|
||||||
|
function g() {}
|
||||||
|
var c = 3;
|
||||||
|
return g(a, b, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
var c, a = 1, b = 2;
|
||||||
|
function g() {}
|
||||||
|
c = 3;
|
||||||
|
return g(a, b, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sequences_funs: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
var a = 1, b = 2;
|
||||||
|
function g() {}
|
||||||
|
var c = 3;
|
||||||
|
return g(a, b, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
function g() {}
|
||||||
|
var a = 1, b = 2, c = 3;
|
||||||
|
return g(a, b, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2295: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
hoist_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function foo(o) {
|
||||||
|
var a = o.a;
|
||||||
|
if (a) return a;
|
||||||
|
var a = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function foo(o) {
|
||||||
|
var a = o.a;
|
||||||
|
if (a) return a;
|
||||||
|
a = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
55
test/compress/html_comments.js
Normal file
55
test/compress/html_comments.js
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
html_comment_in_expression: {
|
||||||
|
input: {
|
||||||
|
function f(a, b, x, y) { return a < !--b && x-- > y; }
|
||||||
|
}
|
||||||
|
expect_exact: "function f(a,b,x,y){return a< !--b&&x-- >y}";
|
||||||
|
}
|
||||||
|
|
||||||
|
html_comment_in_less_than: {
|
||||||
|
input: {
|
||||||
|
function f(a, b) { return a < !--b; }
|
||||||
|
}
|
||||||
|
expect_exact: "function f(a,b){return a< !--b}";
|
||||||
|
}
|
||||||
|
|
||||||
|
html_comment_in_left_shift: {
|
||||||
|
input: {
|
||||||
|
function f(a, b) { return a << !--b; }
|
||||||
|
}
|
||||||
|
expect_exact: "function f(a,b){return a<< !--b}";
|
||||||
|
}
|
||||||
|
|
||||||
|
html_comment_in_right_shift: {
|
||||||
|
input: {
|
||||||
|
function f(a, b) { return a-- >> b; }
|
||||||
|
}
|
||||||
|
expect_exact: "function f(a,b){return a-- >>b}";
|
||||||
|
}
|
||||||
|
|
||||||
|
html_comment_in_zero_fill_right_shift: {
|
||||||
|
input: {
|
||||||
|
function f(a, b) { return a-- >>> b; }
|
||||||
|
}
|
||||||
|
expect_exact: "function f(a,b){return a-- >>>b}";
|
||||||
|
}
|
||||||
|
|
||||||
|
html_comment_in_greater_than: {
|
||||||
|
input: {
|
||||||
|
function f(a, b) { return a-- > b; }
|
||||||
|
}
|
||||||
|
expect_exact: "function f(a,b){return a-- >b}";
|
||||||
|
}
|
||||||
|
|
||||||
|
html_comment_in_greater_than_or_equal: {
|
||||||
|
input: {
|
||||||
|
function f(a, b) { return a-- >= b; }
|
||||||
|
}
|
||||||
|
expect_exact: "function f(a,b){return a-- >=b}";
|
||||||
|
}
|
||||||
|
|
||||||
|
html_comment_in_string_literal: {
|
||||||
|
input: {
|
||||||
|
function f() { return "<!--HTML-->comment in<!--string literal-->"; }
|
||||||
|
}
|
||||||
|
expect_exact: 'function f(){return"\\x3c!--HTML--\\x3ecomment in\\x3c!--string literal--\\x3e"}';
|
||||||
|
}
|
||||||
540
test/compress/ie8.js
Normal file
540
test/compress/ie8.js
Normal file
@@ -0,0 +1,540 @@
|
|||||||
|
do_screw: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
ie8: false,
|
||||||
|
ascii_only: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
f("\v");
|
||||||
|
}
|
||||||
|
expect_exact: 'f("\\v");'
|
||||||
|
}
|
||||||
|
|
||||||
|
dont_screw: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
ie8: true,
|
||||||
|
ascii_only: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
f("\v");
|
||||||
|
}
|
||||||
|
expect_exact: 'f("\\x0B");'
|
||||||
|
}
|
||||||
|
|
||||||
|
do_screw_constants: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
f(undefined, Infinity);
|
||||||
|
}
|
||||||
|
expect_exact: "f(void 0,1/0);"
|
||||||
|
}
|
||||||
|
|
||||||
|
dont_screw_constants: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
f(undefined, Infinity);
|
||||||
|
}
|
||||||
|
expect_exact: "f(undefined,Infinity);"
|
||||||
|
}
|
||||||
|
|
||||||
|
do_screw_try_catch: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
good = function(e){
|
||||||
|
return function(error){
|
||||||
|
try{
|
||||||
|
e()
|
||||||
|
} catch(e) {
|
||||||
|
error(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
good = function(n){
|
||||||
|
return function(t){
|
||||||
|
try{
|
||||||
|
n()
|
||||||
|
} catch(n) {
|
||||||
|
t(n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dont_screw_try_catch: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
bad = function(e){
|
||||||
|
return function(error){
|
||||||
|
try{
|
||||||
|
e()
|
||||||
|
} catch(e) {
|
||||||
|
error(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
bad = function(t){
|
||||||
|
return function(n){
|
||||||
|
try{
|
||||||
|
t()
|
||||||
|
} catch(t) {
|
||||||
|
n(t)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
do_screw_try_catch_undefined: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function a(b){
|
||||||
|
try {
|
||||||
|
throw 'Stuff';
|
||||||
|
} catch (undefined) {
|
||||||
|
console.log('caught: ' + undefined);
|
||||||
|
}
|
||||||
|
console.log('undefined is ' + undefined);
|
||||||
|
return b === undefined;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function a(o){
|
||||||
|
try{
|
||||||
|
throw "Stuff"
|
||||||
|
} catch (o) {
|
||||||
|
console.log("caught: "+o)
|
||||||
|
}
|
||||||
|
console.log("undefined is " + void 0);
|
||||||
|
return void 0===o
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
dont_screw_try_catch_undefined: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function a(b){
|
||||||
|
try {
|
||||||
|
throw 'Stuff';
|
||||||
|
} catch (undefined) {
|
||||||
|
console.log('caught: ' + undefined);
|
||||||
|
}
|
||||||
|
console.log('undefined is ' + undefined);
|
||||||
|
return b === undefined;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function a(n){
|
||||||
|
try{
|
||||||
|
throw "Stuff"
|
||||||
|
} catch (undefined) {
|
||||||
|
console.log("caught: " + undefined)
|
||||||
|
}
|
||||||
|
console.log("undefined is " + undefined);
|
||||||
|
return n === undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
reduce_vars: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
ie8: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
var a;
|
||||||
|
try {
|
||||||
|
x();
|
||||||
|
} catch (a) {
|
||||||
|
y();
|
||||||
|
}
|
||||||
|
alert(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
var t;
|
||||||
|
try {
|
||||||
|
x();
|
||||||
|
} catch (t) {
|
||||||
|
y();
|
||||||
|
}
|
||||||
|
alert(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1586_1: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
try {
|
||||||
|
x();
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "function f(){try{x()}catch(c){console.log(c.message)}}"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1586_2: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
try {
|
||||||
|
x();
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "function f(){try{x()}catch(c){console.log(c.message)}}"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2120_1: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"aaaaaaaa";
|
||||||
|
var a = 1, b = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (c) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (a) {
|
||||||
|
if (c) b = "PASS";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"aaaaaaaa";
|
||||||
|
var a = 1, b = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (t) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (a) {
|
||||||
|
if (t) b = "PASS";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2120_2: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"aaaaaaaa";
|
||||||
|
var a = 1, b = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (c) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (a) {
|
||||||
|
if (c) b = "PASS";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"aaaaaaaa";
|
||||||
|
var a = 1, b = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (c) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (a) {
|
||||||
|
if (c) b = "PASS";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2254_1: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"eeeeee";
|
||||||
|
try {
|
||||||
|
console.log(f("PASS"));
|
||||||
|
} catch (e) {}
|
||||||
|
function f(s) {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} catch (e) {
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"eeeeee";
|
||||||
|
try {
|
||||||
|
console.log(f("PASS"));
|
||||||
|
} catch (e) {}
|
||||||
|
function f(t) {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} catch (e) {
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2254_2: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"eeeeee";
|
||||||
|
try {
|
||||||
|
console.log(f("PASS"));
|
||||||
|
} catch (e) {}
|
||||||
|
function f(s) {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} catch (e) {
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"eeeeee";
|
||||||
|
try {
|
||||||
|
console.log(f("PASS"));
|
||||||
|
} catch (e) {}
|
||||||
|
function f(t) {
|
||||||
|
try {
|
||||||
|
throw "FAIL";
|
||||||
|
} catch (e) {
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_24_1: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
console.log(typeof function f(){} === typeof a ? "FAIL" : "PASS");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(o) {
|
||||||
|
console.log(typeof function o(){} === typeof o ? "FAIL" : "PASS");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_24_2: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(a) {
|
||||||
|
console.log(typeof function f(){} === typeof a ? "FAIL" : "PASS");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(n) {
|
||||||
|
console.log(typeof function o(){} === typeof n ? "FAIL" : "PASS");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2976_1: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function f() {
|
||||||
|
var a;
|
||||||
|
return a === f ? "FAIL" : "PASS";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function n() {
|
||||||
|
var o;
|
||||||
|
return o === n ? "FAIL" : "PASS";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2976_2: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function f() {
|
||||||
|
var a;
|
||||||
|
return a === f ? "FAIL" : "PASS";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function n() {
|
||||||
|
var o;
|
||||||
|
return o === n ? "FAIL" : "PASS";
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3035: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var c = "FAIL";
|
||||||
|
(function(a) {
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (b) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (a) {
|
||||||
|
b && (c = "PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var c = "FAIL";
|
||||||
|
(function(o) {
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (t) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (o) {
|
||||||
|
t && (c = "PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_3035_ie8: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var c = "FAIL";
|
||||||
|
(function(a) {
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (b) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (a) {
|
||||||
|
b && (c = "PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var c = "FAIL";
|
||||||
|
(function(t) {
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (o) {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (t) {
|
||||||
|
o && (c = "PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
console.log(c);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
398
test/compress/if_return.js
Normal file
398
test/compress/if_return.js
Normal file
@@ -0,0 +1,398 @@
|
|||||||
|
if_return_1: {
|
||||||
|
options = {
|
||||||
|
if_return : true,
|
||||||
|
sequences : true,
|
||||||
|
conditionals : true,
|
||||||
|
comparisons : true,
|
||||||
|
evaluate : true,
|
||||||
|
booleans : true,
|
||||||
|
unused : true,
|
||||||
|
side_effects : true,
|
||||||
|
dead_code : true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(x) {
|
||||||
|
if (x) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(x){if(x)return!0}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if_return_2: {
|
||||||
|
options = {
|
||||||
|
if_return : true,
|
||||||
|
sequences : true,
|
||||||
|
conditionals : true,
|
||||||
|
comparisons : true,
|
||||||
|
evaluate : true,
|
||||||
|
booleans : true,
|
||||||
|
unused : true,
|
||||||
|
side_effects : true,
|
||||||
|
dead_code : true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(x, y) {
|
||||||
|
if (x)
|
||||||
|
return 3;
|
||||||
|
if (y)
|
||||||
|
return c();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(x,y){return x?3:y?c():void 0}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if_return_3: {
|
||||||
|
options = {
|
||||||
|
if_return : true,
|
||||||
|
sequences : true,
|
||||||
|
conditionals : true,
|
||||||
|
comparisons : true,
|
||||||
|
evaluate : true,
|
||||||
|
booleans : true,
|
||||||
|
unused : true,
|
||||||
|
side_effects : true,
|
||||||
|
dead_code : true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(x) {
|
||||||
|
a();
|
||||||
|
if (x) {
|
||||||
|
b();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(x){if(a(),x)return b(),!1}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if_return_4: {
|
||||||
|
options = {
|
||||||
|
if_return : true,
|
||||||
|
sequences : true,
|
||||||
|
conditionals : true,
|
||||||
|
comparisons : true,
|
||||||
|
evaluate : true,
|
||||||
|
booleans : true,
|
||||||
|
unused : true,
|
||||||
|
side_effects : true,
|
||||||
|
dead_code : true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(x, y) {
|
||||||
|
a();
|
||||||
|
if (x) return 3;
|
||||||
|
b();
|
||||||
|
if (y) return c();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(x,y){return a(),x?3:(b(),y?c():void 0)}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if_return_5: {
|
||||||
|
options = {
|
||||||
|
if_return : true,
|
||||||
|
sequences : true,
|
||||||
|
conditionals : true,
|
||||||
|
comparisons : true,
|
||||||
|
evaluate : true,
|
||||||
|
booleans : true,
|
||||||
|
unused : true,
|
||||||
|
side_effects : true,
|
||||||
|
dead_code : true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
if (x)
|
||||||
|
return;
|
||||||
|
return 7;
|
||||||
|
if (y)
|
||||||
|
return j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(){if(!x)return 7}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if_return_6: {
|
||||||
|
options = {
|
||||||
|
if_return : true,
|
||||||
|
sequences : true,
|
||||||
|
conditionals : true,
|
||||||
|
comparisons : true,
|
||||||
|
evaluate : true,
|
||||||
|
booleans : true,
|
||||||
|
unused : true,
|
||||||
|
side_effects : true,
|
||||||
|
dead_code : true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(x) {
|
||||||
|
return x ? true : void 0;
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
// suboptimal
|
||||||
|
function f(x){return!!x||void 0}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if_return_7: {
|
||||||
|
options = {
|
||||||
|
if_return : true,
|
||||||
|
sequences : true,
|
||||||
|
conditionals : true,
|
||||||
|
comparisons : true,
|
||||||
|
evaluate : true,
|
||||||
|
booleans : true,
|
||||||
|
unused : true,
|
||||||
|
side_effects : true,
|
||||||
|
dead_code : true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(x) {
|
||||||
|
if (x) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
foo();
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(x){if(x)return!0;foo(),bar()}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if_return_8: {
|
||||||
|
options = {
|
||||||
|
if_return: true,
|
||||||
|
sequences: true,
|
||||||
|
conditionals: true,
|
||||||
|
side_effects : true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(e) {
|
||||||
|
if (2 == e) return foo();
|
||||||
|
if (3 == e) return bar();
|
||||||
|
if (4 == e) return baz();
|
||||||
|
fail(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
function g(e) {
|
||||||
|
if (a(e)) return foo();
|
||||||
|
if (b(e)) return bar();
|
||||||
|
if (c(e)) return baz();
|
||||||
|
fail(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
function h(e) {
|
||||||
|
if (a(e)) return foo();
|
||||||
|
else if (b(e)) return bar();
|
||||||
|
else if (c(e)) return baz();
|
||||||
|
else fail(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
function i(e) {
|
||||||
|
if (a(e)) return foo();
|
||||||
|
else if (b(e)) return bar();
|
||||||
|
else if (c(e)) return baz();
|
||||||
|
fail(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(e){return 2==e?foo():3==e?bar():4==e?baz():void fail(e)}
|
||||||
|
function g(e){return a(e)?foo():b(e)?bar():c(e)?baz():void fail(e)}
|
||||||
|
function h(e){return a(e)?foo():b(e)?bar():c(e)?baz():void fail(e)}
|
||||||
|
function i(e){return a(e)?foo():b(e)?bar():c(e)?baz():void fail(e)}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1089: {
|
||||||
|
options = {
|
||||||
|
if_return : true,
|
||||||
|
sequences : true,
|
||||||
|
conditionals : true,
|
||||||
|
comparisons : true,
|
||||||
|
evaluate : true,
|
||||||
|
booleans : true,
|
||||||
|
unused : true,
|
||||||
|
side_effects : true,
|
||||||
|
dead_code : true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function x() {
|
||||||
|
var f = document.getElementById("fname");
|
||||||
|
if (f.files[0].size > 12345) {
|
||||||
|
alert("alert");
|
||||||
|
f.focus();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function x() {
|
||||||
|
var f = document.getElementById("fname");
|
||||||
|
if (12345 < f.files[0].size)
|
||||||
|
return alert("alert"), f.focus(), !1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1437: {
|
||||||
|
options = {
|
||||||
|
if_return : true,
|
||||||
|
sequences : true,
|
||||||
|
conditionals : false
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function x() {
|
||||||
|
if (a())
|
||||||
|
return b();
|
||||||
|
if (c())
|
||||||
|
return d();
|
||||||
|
else
|
||||||
|
e();
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function x() {
|
||||||
|
if (a())
|
||||||
|
return b();
|
||||||
|
if (c())
|
||||||
|
return d();
|
||||||
|
else
|
||||||
|
e()
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1437_conditionals: {
|
||||||
|
options = {
|
||||||
|
conditionals : true,
|
||||||
|
if_return : true,
|
||||||
|
sequences : true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function x() {
|
||||||
|
if (a())
|
||||||
|
return b();
|
||||||
|
if (c())
|
||||||
|
return d();
|
||||||
|
else
|
||||||
|
e();
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function x() {
|
||||||
|
return a() ? b() : c() ? d() : (e(), f(), void 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_512: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function a() {
|
||||||
|
if (b()) {
|
||||||
|
c();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function a() {
|
||||||
|
if (!b()) throw e;
|
||||||
|
c();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if_var_return: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
var a;
|
||||||
|
return;
|
||||||
|
var b;
|
||||||
|
}
|
||||||
|
function g() {
|
||||||
|
var a;
|
||||||
|
if (u()) {
|
||||||
|
var b;
|
||||||
|
return v();
|
||||||
|
var c;
|
||||||
|
}
|
||||||
|
var d;
|
||||||
|
if (w()) {
|
||||||
|
var e;
|
||||||
|
return x();
|
||||||
|
var f;
|
||||||
|
} else {
|
||||||
|
var g;
|
||||||
|
y();
|
||||||
|
var h;
|
||||||
|
}
|
||||||
|
var i;
|
||||||
|
z();
|
||||||
|
var j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
var a, b;
|
||||||
|
}
|
||||||
|
function g() {
|
||||||
|
var a, b, c, d, e, f, g, h, i, j;
|
||||||
|
return u() ? v() : w() ? x() : (y(), z(), void 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if_if_return_return: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
if (a) {
|
||||||
|
if (b)
|
||||||
|
return b;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
g();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
if (a)
|
||||||
|
return b || void 0;
|
||||||
|
g();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
256
test/compress/issue-1034.js
Normal file
256
test/compress/issue-1034.js
Normal file
@@ -0,0 +1,256 @@
|
|||||||
|
non_hoisted_function_after_return: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
||||||
|
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
||||||
|
if_return: true, join_vars: true, side_effects: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function foo(x) {
|
||||||
|
if (x) {
|
||||||
|
return bar();
|
||||||
|
not_called1();
|
||||||
|
} else {
|
||||||
|
return baz();
|
||||||
|
not_called2();
|
||||||
|
}
|
||||||
|
function bar() { return 7; }
|
||||||
|
return not_reached;
|
||||||
|
function UnusedFunction() {}
|
||||||
|
function baz() { return 8; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function foo(x) {
|
||||||
|
return x ? bar() : baz();
|
||||||
|
function bar() { return 7 }
|
||||||
|
function baz() { return 8 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_warnings: [
|
||||||
|
'WARN: Dropping unreachable code [test/compress/issue-1034.js:11,16]',
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:14,16]",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:17,12]",
|
||||||
|
"WARN: Dropping unused function UnusedFunction [test/compress/issue-1034.js:18,21]"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
non_hoisted_function_after_return_2a: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
||||||
|
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
||||||
|
if_return: true, join_vars: true, side_effects: true,
|
||||||
|
collapse_vars: false, passes: 2, warnings: "verbose"
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function foo(x) {
|
||||||
|
if (x) {
|
||||||
|
return bar(1);
|
||||||
|
var a = not_called(1);
|
||||||
|
} else {
|
||||||
|
return bar(2);
|
||||||
|
var b = not_called(2);
|
||||||
|
}
|
||||||
|
var c = bar(3);
|
||||||
|
function bar(x) { return 7 - x; }
|
||||||
|
function nope() {}
|
||||||
|
return b || c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function foo(x) {
|
||||||
|
return bar(x ? 1 : 2);
|
||||||
|
function bar(x) {
|
||||||
|
return 7 - x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_warnings: [
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:48,16]",
|
||||||
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:48,16]",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:51,16]",
|
||||||
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:51,16]",
|
||||||
|
"WARN: Dropping unused variable a [test/compress/issue-1034.js:48,20]",
|
||||||
|
"WARN: Dropping unused function nope [test/compress/issue-1034.js:55,21]",
|
||||||
|
"WARN: pass 0: last_count: Infinity, count: 37",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:53,12]",
|
||||||
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:53,12]",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:56,12]",
|
||||||
|
"WARN: Dropping unused variable b [test/compress/issue-1034.js:51,20]",
|
||||||
|
"WARN: Dropping unused variable c [test/compress/issue-1034.js:53,16]",
|
||||||
|
"WARN: pass 1: last_count: 37, count: 18",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
non_hoisted_function_after_return_2b: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
||||||
|
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
||||||
|
if_return: true, join_vars: true, side_effects: true,
|
||||||
|
collapse_vars: false
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function foo(x) {
|
||||||
|
if (x) {
|
||||||
|
return bar(1);
|
||||||
|
} else {
|
||||||
|
return bar(2);
|
||||||
|
var b;
|
||||||
|
}
|
||||||
|
var c = bar(3);
|
||||||
|
function bar(x) {
|
||||||
|
return 7 - x;
|
||||||
|
}
|
||||||
|
return b || c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function foo(x) {
|
||||||
|
return bar(x ? 1 : 2);
|
||||||
|
function bar(x) { return 7 - x; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_warnings: [
|
||||||
|
// duplicate warnings no longer emitted
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:97,16]",
|
||||||
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:97,16]",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:99,12]",
|
||||||
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:99,12]",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:103,12]",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
non_hoisted_function_after_return_strict: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
||||||
|
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
||||||
|
if_return: true, join_vars: true, side_effects: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
function foo(x) {
|
||||||
|
if (x) {
|
||||||
|
return bar();
|
||||||
|
not_called1();
|
||||||
|
} else {
|
||||||
|
return baz();
|
||||||
|
not_called2();
|
||||||
|
}
|
||||||
|
function bar() { return 7; }
|
||||||
|
return not_reached;
|
||||||
|
function UnusedFunction() {}
|
||||||
|
function baz() { return 8; }
|
||||||
|
}
|
||||||
|
console.log(foo(0), foo(1));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
function foo(x) {
|
||||||
|
return x ? bar() : baz();
|
||||||
|
function bar() { return 7 }
|
||||||
|
function baz() { return 8 }
|
||||||
|
}
|
||||||
|
console.log(foo(0), foo(1));
|
||||||
|
}
|
||||||
|
expect_stdout: "8 7"
|
||||||
|
expect_warnings: [
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:133,16]",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:136,16]",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:139,12]",
|
||||||
|
"WARN: Dropping unused function UnusedFunction [test/compress/issue-1034.js:140,21]",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
non_hoisted_function_after_return_2a_strict: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
||||||
|
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
||||||
|
if_return: true, join_vars: true, side_effects: true,
|
||||||
|
collapse_vars: false, passes: 2, warnings: "verbose"
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
function foo(x) {
|
||||||
|
if (x) {
|
||||||
|
return bar(1);
|
||||||
|
var a = not_called(1);
|
||||||
|
} else {
|
||||||
|
return bar(2);
|
||||||
|
var b = not_called(2);
|
||||||
|
}
|
||||||
|
var c = bar(3);
|
||||||
|
function bar(x) { return 7 - x; }
|
||||||
|
function nope() {}
|
||||||
|
return b || c;
|
||||||
|
}
|
||||||
|
console.log(foo(0), foo(1));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
function foo(x) {
|
||||||
|
return bar(x ? 1 : 2);
|
||||||
|
function bar(x) {
|
||||||
|
return 7 - x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(foo(0), foo(1));
|
||||||
|
}
|
||||||
|
expect_stdout: "5 6"
|
||||||
|
expect_warnings: [
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:175,16]",
|
||||||
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:175,16]",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:178,16]",
|
||||||
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:178,16]",
|
||||||
|
"WARN: Dropping unused variable a [test/compress/issue-1034.js:175,20]",
|
||||||
|
"WARN: Dropping unused function nope [test/compress/issue-1034.js:182,21]",
|
||||||
|
"WARN: pass 0: last_count: Infinity, count: 48",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:180,12]",
|
||||||
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:180,12]",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:183,12]",
|
||||||
|
"WARN: Dropping unused variable b [test/compress/issue-1034.js:178,20]",
|
||||||
|
"WARN: Dropping unused variable c [test/compress/issue-1034.js:180,16]",
|
||||||
|
"WARN: pass 1: last_count: 48, count: 29",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
non_hoisted_function_after_return_2b_strict: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: false, dead_code: true, conditionals: true, comparisons: true,
|
||||||
|
evaluate: true, booleans: true, loops: true, unused: true, keep_fargs: true,
|
||||||
|
if_return: true, join_vars: true, side_effects: true,
|
||||||
|
collapse_vars: false
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
function foo(x) {
|
||||||
|
if (x) {
|
||||||
|
return bar(1);
|
||||||
|
} else {
|
||||||
|
return bar(2);
|
||||||
|
var b;
|
||||||
|
}
|
||||||
|
var c = bar(3);
|
||||||
|
function bar(x) {
|
||||||
|
return 7 - x;
|
||||||
|
}
|
||||||
|
return b || c;
|
||||||
|
}
|
||||||
|
console.log(foo(0), foo(1));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
function foo(x) {
|
||||||
|
return bar(x ? 1 : 2);
|
||||||
|
function bar(x) { return 7 - x; }
|
||||||
|
}
|
||||||
|
console.log(foo(0), foo(1));
|
||||||
|
}
|
||||||
|
expect_stdout: "5 6"
|
||||||
|
expect_warnings: [
|
||||||
|
// duplicate warnings no longer emitted
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:229,16]",
|
||||||
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:229,16]",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:231,12]",
|
||||||
|
"WARN: Declarations in unreachable code! [test/compress/issue-1034.js:231,12]",
|
||||||
|
"WARN: Dropping unreachable code [test/compress/issue-1034.js:235,12]",
|
||||||
|
]
|
||||||
|
}
|
||||||
30
test/compress/issue-1041.js
Normal file
30
test/compress/issue-1041.js
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
const_pragma: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
input: {
|
||||||
|
/** @const */ var goog = goog || {};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var goog = goog || {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// for completeness' sake
|
||||||
|
not_const: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
input: {
|
||||||
|
var goog = goog || {};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var goog = goog || {};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
typeof_eq_undefined: {
|
|
||||||
options = {
|
|
||||||
comparisons: true
|
|
||||||
};
|
|
||||||
input: { a = typeof b.c != "undefined" }
|
|
||||||
expect: { a = "undefined" != typeof b.c }
|
|
||||||
}
|
|
||||||
|
|
||||||
typeof_eq_undefined_unsafe: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
unsafe: true
|
|
||||||
};
|
|
||||||
input: { a = typeof b.c != "undefined" }
|
|
||||||
expect: { a = void 0 !== b.c }
|
|
||||||
}
|
|
||||||
|
|
||||||
typeof_eq_undefined_unsafe2: {
|
|
||||||
options = {
|
|
||||||
comparisons: true,
|
|
||||||
unsafe: true
|
|
||||||
};
|
|
||||||
input: { a = "undefined" != typeof b.c }
|
|
||||||
expect: { a = void 0 !== b.c }
|
|
||||||
}
|
|
||||||
164
test/compress/issue-1052.js
Normal file
164
test/compress/issue-1052.js
Normal file
@@ -0,0 +1,164 @@
|
|||||||
|
multiple_functions: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: false,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
( function() {
|
||||||
|
if ( !window ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
function f() {}
|
||||||
|
function g() {}
|
||||||
|
} )();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
( function() {
|
||||||
|
// NOTE: other compression steps will reduce this
|
||||||
|
// down to just `window`.
|
||||||
|
if ( window );
|
||||||
|
function f() {}
|
||||||
|
function g() {}
|
||||||
|
} )();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
single_function: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: false,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
( function() {
|
||||||
|
if ( !window ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
function f() {}
|
||||||
|
} )();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
( function() {
|
||||||
|
if ( window );
|
||||||
|
function f() {}
|
||||||
|
} )();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
deeply_nested: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: false,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
( function() {
|
||||||
|
if ( !window ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
function f() {}
|
||||||
|
function g() {}
|
||||||
|
if ( !document ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
function h() {}
|
||||||
|
} )();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
( function() {
|
||||||
|
// NOTE: other compression steps will reduce this
|
||||||
|
// down to just `window`.
|
||||||
|
if ( window )
|
||||||
|
if (document);
|
||||||
|
function f() {}
|
||||||
|
function g() {}
|
||||||
|
function h() {}
|
||||||
|
} )();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
not_hoisted_when_already_nested: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: false,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
( function() {
|
||||||
|
if ( !window ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( foo ) function f() {}
|
||||||
|
} )();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
( function() {
|
||||||
|
if ( window )
|
||||||
|
if ( foo ) function f() {}
|
||||||
|
} )();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
defun_if_return: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: false,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function e() {
|
||||||
|
function f() {}
|
||||||
|
if (!window) return;
|
||||||
|
else function g() {}
|
||||||
|
function h() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function e() {
|
||||||
|
function f() {}
|
||||||
|
if (window) function g() {}
|
||||||
|
function h() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
defun_hoist_funs: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function e() {
|
||||||
|
function f() {}
|
||||||
|
if (!window) return;
|
||||||
|
else function g() {}
|
||||||
|
function h() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function e() {
|
||||||
|
function f() {}
|
||||||
|
function g() {}
|
||||||
|
function h() {}
|
||||||
|
if (window);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
defun_else_if_return: {
|
||||||
|
options = {
|
||||||
|
hoist_funs: false,
|
||||||
|
if_return: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function e() {
|
||||||
|
function f() {}
|
||||||
|
if (window) function g() {}
|
||||||
|
else return;
|
||||||
|
function h() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function e() {
|
||||||
|
function f() {}
|
||||||
|
if (window) function g() {}
|
||||||
|
function h() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
303
test/compress/issue-1105.js
Normal file
303
test/compress/issue-1105.js
Normal file
@@ -0,0 +1,303 @@
|
|||||||
|
with_in_global_scope: {
|
||||||
|
options = {
|
||||||
|
unused: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = 42;
|
||||||
|
with(o) {
|
||||||
|
var foo = 'something'
|
||||||
|
}
|
||||||
|
doSomething(o);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o=42;
|
||||||
|
with(o)
|
||||||
|
var foo = "something";
|
||||||
|
doSomething(o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
with_in_function_scope: {
|
||||||
|
options = {
|
||||||
|
unused: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function foo() {
|
||||||
|
var o = 42;
|
||||||
|
with(o) {
|
||||||
|
var foo = "something"
|
||||||
|
}
|
||||||
|
doSomething(o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function foo() {
|
||||||
|
var o=42;
|
||||||
|
with(o)
|
||||||
|
var foo = "something";
|
||||||
|
doSomething(o)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
compress_with_with_in_other_scope: {
|
||||||
|
options = {
|
||||||
|
unused: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function foo() {
|
||||||
|
var o = 42;
|
||||||
|
with(o) {
|
||||||
|
var foo = "something"
|
||||||
|
}
|
||||||
|
doSomething(o);
|
||||||
|
}
|
||||||
|
function bar() {
|
||||||
|
var unused = 42;
|
||||||
|
return something();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function foo() {
|
||||||
|
var o = 42;
|
||||||
|
with(o)
|
||||||
|
var foo = "something";
|
||||||
|
doSomething(o)
|
||||||
|
}
|
||||||
|
function bar() {
|
||||||
|
return something()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
with_using_existing_variable_outside_scope: {
|
||||||
|
options = {
|
||||||
|
unused: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
var o = {};
|
||||||
|
var unused = {}; // Doesn't get removed because upper scope uses with
|
||||||
|
function foo() {
|
||||||
|
with(o) {
|
||||||
|
var foo = "something"
|
||||||
|
}
|
||||||
|
doSomething(o);
|
||||||
|
}
|
||||||
|
foo()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
var o = {};
|
||||||
|
var unused = {};
|
||||||
|
function foo() {
|
||||||
|
with(o)
|
||||||
|
var foo = "something";
|
||||||
|
doSomething(o)
|
||||||
|
}
|
||||||
|
foo()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
check_drop_unused_in_peer_function: {
|
||||||
|
options = {
|
||||||
|
unused: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function outer() {
|
||||||
|
var o = {};
|
||||||
|
var unused = {}; // should be kept
|
||||||
|
function foo() { // should be kept
|
||||||
|
function not_in_use() {
|
||||||
|
var nested_unused = "foo"; // should be dropped
|
||||||
|
return 24;
|
||||||
|
}
|
||||||
|
var unused = {}; // should be kept
|
||||||
|
with (o) {
|
||||||
|
var foo = "something";
|
||||||
|
}
|
||||||
|
doSomething(o);
|
||||||
|
}
|
||||||
|
function bar() {
|
||||||
|
var unused = {}; // should be dropped
|
||||||
|
doSomethingElse();
|
||||||
|
}
|
||||||
|
foo();
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function outer() {
|
||||||
|
var o = {};
|
||||||
|
var unused = {}; // should be kept
|
||||||
|
function foo() { // should be kept
|
||||||
|
function not_in_use() {
|
||||||
|
return 24;
|
||||||
|
}
|
||||||
|
var unused = {}; // should be kept
|
||||||
|
with (o)
|
||||||
|
var foo = "something";
|
||||||
|
doSomething(o);
|
||||||
|
}
|
||||||
|
function bar() {
|
||||||
|
doSomethingElse();
|
||||||
|
}
|
||||||
|
foo();
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Infinity_not_in_with_scope: {
|
||||||
|
options = {
|
||||||
|
unused: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = { Infinity: 'oInfinity' };
|
||||||
|
var vInfinity = "Infinity";
|
||||||
|
vInfinity = Infinity;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = { Infinity: 'oInfinity' }
|
||||||
|
var vInfinity = "Infinity"
|
||||||
|
vInfinity = 1/0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Infinity_in_with_scope: {
|
||||||
|
options = {
|
||||||
|
unused: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = { Infinity: 'oInfinity' };
|
||||||
|
var vInfinity = "Infinity";
|
||||||
|
with (o) { vInfinity = Infinity; }
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var o = { Infinity: 'oInfinity' }
|
||||||
|
var vInfinity = "Infinity"
|
||||||
|
with (o) vInfinity = Infinity
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assorted_Infinity_NaN_undefined_in_with_scope: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
evaluate: true,
|
||||||
|
dead_code: true,
|
||||||
|
conditionals: true,
|
||||||
|
comparisons: true,
|
||||||
|
booleans: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
sequences: false,
|
||||||
|
keep_infinity: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f = console.log;
|
||||||
|
var o = {
|
||||||
|
undefined : 3,
|
||||||
|
NaN : 4,
|
||||||
|
Infinity : 5,
|
||||||
|
};
|
||||||
|
if (o) {
|
||||||
|
f(undefined, void 0);
|
||||||
|
f(NaN, 0/0);
|
||||||
|
f(Infinity, 1/0);
|
||||||
|
f(-Infinity, -(1/0));
|
||||||
|
f(2 + 7 + undefined, 2 + 7 + void 0);
|
||||||
|
}
|
||||||
|
with (o) {
|
||||||
|
f(undefined, void 0);
|
||||||
|
f(NaN, 0/0);
|
||||||
|
f(Infinity, 1/0);
|
||||||
|
f(-Infinity, -(1/0));
|
||||||
|
f(2 + 7 + undefined, 2 + 7 + void 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var f = console.log, o = {
|
||||||
|
undefined : 3,
|
||||||
|
NaN : 4,
|
||||||
|
Infinity : 5
|
||||||
|
};
|
||||||
|
if (o) {
|
||||||
|
f(void 0, void 0);
|
||||||
|
f(NaN, NaN);
|
||||||
|
f(1/0, 1/0);
|
||||||
|
f(-1/0, -1/0);
|
||||||
|
f(NaN, NaN);
|
||||||
|
}
|
||||||
|
with (o) {
|
||||||
|
f(undefined, void 0);
|
||||||
|
f(NaN, 0/0);
|
||||||
|
f(Infinity, 1/0);
|
||||||
|
f(-Infinity, -1/0);
|
||||||
|
f(9 + undefined, 9 + void 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
assorted_Infinity_NaN_undefined_in_with_scope_keep_infinity: {
|
||||||
|
options = {
|
||||||
|
unused: true,
|
||||||
|
evaluate: true,
|
||||||
|
dead_code: true,
|
||||||
|
conditionals: true,
|
||||||
|
comparisons: true,
|
||||||
|
booleans: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
sequences: false,
|
||||||
|
keep_infinity: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var f = console.log;
|
||||||
|
var o = {
|
||||||
|
undefined : 3,
|
||||||
|
NaN : 4,
|
||||||
|
Infinity : 5,
|
||||||
|
};
|
||||||
|
if (o) {
|
||||||
|
f(undefined, void 0);
|
||||||
|
f(NaN, 0/0);
|
||||||
|
f(Infinity, 1/0);
|
||||||
|
f(-Infinity, -(1/0));
|
||||||
|
f(2 + 7 + undefined, 2 + 7 + void 0);
|
||||||
|
}
|
||||||
|
with (o) {
|
||||||
|
f(undefined, void 0);
|
||||||
|
f(NaN, 0/0);
|
||||||
|
f(Infinity, 1/0);
|
||||||
|
f(-Infinity, -(1/0));
|
||||||
|
f(2 + 7 + undefined, 2 + 7 + void 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var f = console.log, o = {
|
||||||
|
undefined : 3,
|
||||||
|
NaN : 4,
|
||||||
|
Infinity : 5
|
||||||
|
};
|
||||||
|
if (o) {
|
||||||
|
f(void 0, void 0);
|
||||||
|
f(NaN, NaN);
|
||||||
|
f(Infinity, 1/0);
|
||||||
|
f(-Infinity, -1/0);
|
||||||
|
f(NaN, NaN);
|
||||||
|
}
|
||||||
|
with (o) {
|
||||||
|
f(undefined, void 0);
|
||||||
|
f(NaN, 0/0);
|
||||||
|
f(Infinity, 1/0);
|
||||||
|
f(-Infinity, -1/0);
|
||||||
|
f(9 + undefined, 9 + void 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
@@ -9,3 +9,50 @@ keep_name_of_setter: {
|
|||||||
input: { a = { set foo () {} } }
|
input: { a = { set foo () {} } }
|
||||||
expect: { a = { set foo () {} } }
|
expect: { a = { set foo () {} } }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setter_with_operator_keys: {
|
||||||
|
input: {
|
||||||
|
var tokenCodes = {
|
||||||
|
get instanceof(){
|
||||||
|
return test0;
|
||||||
|
},
|
||||||
|
set instanceof(value){
|
||||||
|
test0 = value;
|
||||||
|
},
|
||||||
|
set typeof(value){
|
||||||
|
test1 = value;
|
||||||
|
},
|
||||||
|
get typeof(){
|
||||||
|
return test1;
|
||||||
|
},
|
||||||
|
set else(value){
|
||||||
|
test2 = value;
|
||||||
|
},
|
||||||
|
get else(){
|
||||||
|
return test2;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var tokenCodes = {
|
||||||
|
get instanceof(){
|
||||||
|
return test0;
|
||||||
|
},
|
||||||
|
set instanceof(value){
|
||||||
|
test0 = value;
|
||||||
|
},
|
||||||
|
set typeof(value){
|
||||||
|
test1 = value;
|
||||||
|
},
|
||||||
|
get typeof(){
|
||||||
|
return test1;
|
||||||
|
},
|
||||||
|
set else(value){
|
||||||
|
test2 = value;
|
||||||
|
},
|
||||||
|
get else(){
|
||||||
|
return test2;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
51
test/compress/issue-1202.js
Normal file
51
test/compress/issue-1202.js
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
mangle_keep_fnames_false: {
|
||||||
|
options = {
|
||||||
|
keep_fnames : true,
|
||||||
|
keep_fargs : true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
keep_fnames : false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
function total() {
|
||||||
|
return function n(a, b, c) {
|
||||||
|
return a + b + c;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
function total() {
|
||||||
|
return function t(n, r, u) {
|
||||||
|
return n + r + u;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_keep_fnames_true: {
|
||||||
|
options = {
|
||||||
|
keep_fnames : true,
|
||||||
|
keep_fargs : true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
keep_fnames : true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"use strict";
|
||||||
|
function total() {
|
||||||
|
return function n(a, b, c) {
|
||||||
|
return a + b + c;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"use strict";
|
||||||
|
function total() {
|
||||||
|
return function n(t, r, u) {
|
||||||
|
return t + r + u;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
183
test/compress/issue-1261.js
Normal file
183
test/compress/issue-1261.js
Normal file
@@ -0,0 +1,183 @@
|
|||||||
|
pure_function_calls: {
|
||||||
|
options = {
|
||||||
|
evaluate : true,
|
||||||
|
conditionals : true,
|
||||||
|
comparisons : true,
|
||||||
|
side_effects : true,
|
||||||
|
booleans : true,
|
||||||
|
unused : true,
|
||||||
|
if_return : true,
|
||||||
|
join_vars : true,
|
||||||
|
negate_iife : true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
// pure top-level IIFE will be dropped
|
||||||
|
// @__PURE__ - comment
|
||||||
|
(function() {
|
||||||
|
console.log("iife0");
|
||||||
|
})();
|
||||||
|
|
||||||
|
// pure top-level IIFE assigned to unreferenced var will not be dropped
|
||||||
|
var iife1 = /*@__PURE__*/(function() {
|
||||||
|
console.log("iife1");
|
||||||
|
function iife1() {}
|
||||||
|
return iife1;
|
||||||
|
})();
|
||||||
|
|
||||||
|
(function(){
|
||||||
|
// pure IIFE in function scope assigned to unreferenced var will be dropped
|
||||||
|
var iife2 = /*#__PURE__*/(function() {
|
||||||
|
console.log("iife2");
|
||||||
|
function iife2() {}
|
||||||
|
return iife2;
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
|
||||||
|
// comment #__PURE__ comment
|
||||||
|
bar(), baz(), quux();
|
||||||
|
a.b(), /* @__PURE__ */ c.d.e(), f.g();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var iife1 = function() {
|
||||||
|
console.log("iife1");
|
||||||
|
function iife1() {}
|
||||||
|
return iife1;
|
||||||
|
}();
|
||||||
|
|
||||||
|
baz(), quux();
|
||||||
|
a.b(), f.g();
|
||||||
|
}
|
||||||
|
expect_warnings: [
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:16,8]",
|
||||||
|
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:16,8]",
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:29,37]",
|
||||||
|
"WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:29,16]",
|
||||||
|
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:27,8]",
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:37,8]",
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:38,31]",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
pure_function_calls_toplevel: {
|
||||||
|
options = {
|
||||||
|
evaluate : true,
|
||||||
|
conditionals : true,
|
||||||
|
comparisons : true,
|
||||||
|
side_effects : true,
|
||||||
|
booleans : true,
|
||||||
|
unused : true,
|
||||||
|
if_return : true,
|
||||||
|
join_vars : true,
|
||||||
|
negate_iife : true,
|
||||||
|
toplevel : true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
// pure top-level IIFE will be dropped
|
||||||
|
// @__PURE__ - comment
|
||||||
|
(function() {
|
||||||
|
console.log("iife0");
|
||||||
|
})();
|
||||||
|
|
||||||
|
// pure top-level IIFE assigned to unreferenced var will be dropped
|
||||||
|
var iife1 = /*@__PURE__*/(function() {
|
||||||
|
console.log("iife1");
|
||||||
|
function iife1() {}
|
||||||
|
return iife1;
|
||||||
|
})();
|
||||||
|
|
||||||
|
(function(){
|
||||||
|
// pure IIFE in function scope assigned to unreferenced var will be dropped
|
||||||
|
var iife2 = /*#__PURE__*/(function() {
|
||||||
|
console.log("iife2");
|
||||||
|
function iife2() {}
|
||||||
|
return iife2;
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
|
||||||
|
// pure top-level calls will be dropped regardless of the leading comments position
|
||||||
|
var MyClass = /*#__PURE__*//*@class*/(function(){
|
||||||
|
function MyClass() {}
|
||||||
|
MyClass.prototype.method = function() {};
|
||||||
|
return MyClass;
|
||||||
|
})();
|
||||||
|
|
||||||
|
// comment #__PURE__ comment
|
||||||
|
bar(), baz(), quux();
|
||||||
|
a.b(), /* @__PURE__ */ c.d.e(), f.g();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
baz(), quux();
|
||||||
|
a.b(), f.g();
|
||||||
|
}
|
||||||
|
expect_warnings: [
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:77,8]",
|
||||||
|
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:77,8]",
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:90,37]",
|
||||||
|
"WARN: Dropping unused variable iife2 [test/compress/issue-1261.js:90,16]",
|
||||||
|
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:88,8]",
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:105,8]",
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:106,31]",
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:82,33]",
|
||||||
|
"WARN: Dropping unused variable iife1 [test/compress/issue-1261.js:82,12]",
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:98,45]",
|
||||||
|
"WARN: Dropping unused variable MyClass [test/compress/issue-1261.js:98,12]",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
should_warn: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/* @__PURE__ */(function(){x})(), void/* @__PURE__ */(function(){y})();
|
||||||
|
/* @__PURE__ */(function(){x})() || true ? foo() : bar();
|
||||||
|
true || /* @__PURE__ */(function(){y})() ? foo() : bar();
|
||||||
|
/* @__PURE__ */(function(){x})() && false ? foo() : bar();
|
||||||
|
false && /* @__PURE__ */(function(){y})() ? foo() : bar();
|
||||||
|
/* @__PURE__ */(function(){x})() + "foo" ? bar() : baz();
|
||||||
|
"foo" + /* @__PURE__ */(function(){y})() ? bar() : baz();
|
||||||
|
/* @__PURE__ */(function(){x})() ? foo() : foo();
|
||||||
|
[/* @__PURE__ */(function(){x})()] ? foo() : bar();
|
||||||
|
!{ foo: /* @__PURE__ */(function(){x})() } ? bar() : baz();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
foo();
|
||||||
|
foo();
|
||||||
|
bar();
|
||||||
|
bar();
|
||||||
|
bar();
|
||||||
|
bar();
|
||||||
|
foo();
|
||||||
|
foo();
|
||||||
|
baz();
|
||||||
|
}
|
||||||
|
expect_warnings: [
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:135,61]",
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:135,23]",
|
||||||
|
"WARN: Dropping side-effect-free statement [test/compress/issue-1261.js:135,23]",
|
||||||
|
"WARN: Boolean || always true [test/compress/issue-1261.js:136,23]",
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:136,23]",
|
||||||
|
"WARN: Condition always true [test/compress/issue-1261.js:136,23]",
|
||||||
|
"WARN: Condition left of || always true [test/compress/issue-1261.js:137,8]",
|
||||||
|
"WARN: Condition always true [test/compress/issue-1261.js:137,8]",
|
||||||
|
"WARN: Boolean && always false [test/compress/issue-1261.js:138,23]",
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:138,23]",
|
||||||
|
"WARN: Condition always false [test/compress/issue-1261.js:138,23]",
|
||||||
|
"WARN: Condition left of && always false [test/compress/issue-1261.js:139,8]",
|
||||||
|
"WARN: Condition always false [test/compress/issue-1261.js:139,8]",
|
||||||
|
"WARN: + in boolean context always true [test/compress/issue-1261.js:140,23]",
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:140,23]",
|
||||||
|
"WARN: Condition always true [test/compress/issue-1261.js:140,23]",
|
||||||
|
"WARN: + in boolean context always true [test/compress/issue-1261.js:141,8]",
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:141,31]",
|
||||||
|
"WARN: Condition always true [test/compress/issue-1261.js:141,8]",
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:142,23]",
|
||||||
|
"WARN: Condition always true [test/compress/issue-1261.js:143,8]",
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:143,24]",
|
||||||
|
"WARN: Dropping __PURE__ call [test/compress/issue-1261.js:144,31]",
|
||||||
|
"WARN: Condition always false [test/compress/issue-1261.js:144,8]",
|
||||||
|
]
|
||||||
|
}
|
||||||
49
test/compress/issue-1275.js
Normal file
49
test/compress/issue-1275.js
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
string_plus_optimization: {
|
||||||
|
options = {
|
||||||
|
side_effects : true,
|
||||||
|
evaluate : true,
|
||||||
|
conditionals : true,
|
||||||
|
comparisons : true,
|
||||||
|
dead_code : true,
|
||||||
|
booleans : true,
|
||||||
|
unused : true,
|
||||||
|
if_return : true,
|
||||||
|
join_vars : true,
|
||||||
|
hoist_funs : true,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
function foo(anything) {
|
||||||
|
function throwing_function() {
|
||||||
|
throw "nope";
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
console.log('0' + throwing_function() ? "yes" : "no");
|
||||||
|
} catch (ex) {
|
||||||
|
console.log(ex);
|
||||||
|
}
|
||||||
|
console.log('0' + anything ? "yes" : "no");
|
||||||
|
console.log(anything + '0' ? "Yes" : "No");
|
||||||
|
console.log('' + anything);
|
||||||
|
console.log(anything + '');
|
||||||
|
}
|
||||||
|
foo();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function foo(anything) {
|
||||||
|
function throwing_function() {
|
||||||
|
throw "nope";
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
console.log((throwing_function(), "yes"));
|
||||||
|
} catch (ex) {
|
||||||
|
console.log(ex);
|
||||||
|
}
|
||||||
|
console.log("yes");
|
||||||
|
console.log("Yes");
|
||||||
|
console.log('' + anything);
|
||||||
|
console.log(anything + '');
|
||||||
|
}
|
||||||
|
foo();
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
63
test/compress/issue-1321.js
Normal file
63
test/compress/issue-1321.js
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
issue_1321_no_debug: {
|
||||||
|
mangle = {
|
||||||
|
properties: {
|
||||||
|
keep_quoted: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var x = {};
|
||||||
|
x.foo = 1;
|
||||||
|
x["a"] = 2 * x.foo;
|
||||||
|
console.log(x.foo, x["a"]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var x = {};
|
||||||
|
x.x = 1;
|
||||||
|
x["a"] = 2 * x.x;
|
||||||
|
console.log(x.x, x["a"]);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1321_debug: {
|
||||||
|
mangle = {
|
||||||
|
properties: {
|
||||||
|
debug: "",
|
||||||
|
keep_quoted: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var x = {};
|
||||||
|
x.foo = 1;
|
||||||
|
x["_$foo$_"] = 2 * x.foo;
|
||||||
|
console.log(x.foo, x["_$foo$_"]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var x = {};
|
||||||
|
x.x = 1;
|
||||||
|
x["_$foo$_"] = 2 * x.x;
|
||||||
|
console.log(x.x, x["_$foo$_"]);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1321_with_quoted: {
|
||||||
|
mangle = {
|
||||||
|
properties: {
|
||||||
|
keep_quoted: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var x = {};
|
||||||
|
x.foo = 1;
|
||||||
|
x["a"] = 2 * x.foo;
|
||||||
|
console.log(x.foo, x["a"]);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var x = {};
|
||||||
|
x.x = 1;
|
||||||
|
x["o"] = 2 * x.x;
|
||||||
|
console.log(x.x, x["o"]);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
151
test/compress/issue-1431.js
Normal file
151
test/compress/issue-1431.js
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
level_zero: {
|
||||||
|
options = {
|
||||||
|
keep_fnames: true
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
keep_fnames: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(x) {
|
||||||
|
function n(a) {
|
||||||
|
return a * a;
|
||||||
|
}
|
||||||
|
return function() {
|
||||||
|
return x;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(r) {
|
||||||
|
function n(n) {
|
||||||
|
return n * n;
|
||||||
|
}
|
||||||
|
return function() {
|
||||||
|
return r;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
level_one: {
|
||||||
|
options = {
|
||||||
|
keep_fnames: true
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
keep_fnames: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(x) {
|
||||||
|
return function() {
|
||||||
|
function n(a) {
|
||||||
|
return a * a;
|
||||||
|
}
|
||||||
|
return x(n);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(r) {
|
||||||
|
return function() {
|
||||||
|
function n(n) {
|
||||||
|
return n * n;
|
||||||
|
}
|
||||||
|
return r(n);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
level_two: {
|
||||||
|
options = {
|
||||||
|
keep_fnames: true
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
keep_fnames: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(x) {
|
||||||
|
return function() {
|
||||||
|
function r(a) {
|
||||||
|
return a * a;
|
||||||
|
}
|
||||||
|
return function() {
|
||||||
|
function n(a) {
|
||||||
|
return a * a;
|
||||||
|
}
|
||||||
|
return x(n);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(t) {
|
||||||
|
return function() {
|
||||||
|
function r(n) {
|
||||||
|
return n * n;
|
||||||
|
}
|
||||||
|
return function() {
|
||||||
|
function n(n) {
|
||||||
|
return n * n;
|
||||||
|
}
|
||||||
|
return t(n);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
level_three: {
|
||||||
|
options = {
|
||||||
|
keep_fnames: true
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
keep_fnames: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(x) {
|
||||||
|
return function() {
|
||||||
|
function r(a) {
|
||||||
|
return a * a;
|
||||||
|
}
|
||||||
|
return [
|
||||||
|
function() {
|
||||||
|
function t(a) {
|
||||||
|
return a * a;
|
||||||
|
}
|
||||||
|
return t;
|
||||||
|
},
|
||||||
|
function() {
|
||||||
|
function n(a) {
|
||||||
|
return a * a;
|
||||||
|
}
|
||||||
|
return x(n);
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(t) {
|
||||||
|
return function() {
|
||||||
|
function r(n) {
|
||||||
|
return n * n;
|
||||||
|
}
|
||||||
|
return [
|
||||||
|
function() {
|
||||||
|
function t(n) {
|
||||||
|
return n * n;
|
||||||
|
}
|
||||||
|
return t;
|
||||||
|
},
|
||||||
|
function() {
|
||||||
|
function n(n) {
|
||||||
|
return n * n;
|
||||||
|
}
|
||||||
|
return t(n);
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
61
test/compress/issue-1443.js
Normal file
61
test/compress/issue-1443.js
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
// tests assume that variable `undefined` not redefined and has `void 0` as value
|
||||||
|
|
||||||
|
unsafe_undefined: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
unsafe_undefined: true,
|
||||||
|
}
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
function f(undefined) {
|
||||||
|
return function() {
|
||||||
|
if (a)
|
||||||
|
return b;
|
||||||
|
if (c)
|
||||||
|
return d;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(n) {
|
||||||
|
return function() {
|
||||||
|
return a ? b : c ? d : n;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_fnames: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
unsafe_undefined: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
keep_fnames: true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(undefined) {
|
||||||
|
return function() {
|
||||||
|
function n(a) {
|
||||||
|
return a * a;
|
||||||
|
}
|
||||||
|
if (a)
|
||||||
|
return b;
|
||||||
|
if (c)
|
||||||
|
return d;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(r) {
|
||||||
|
return function() {
|
||||||
|
function n(n) {
|
||||||
|
return n * n;
|
||||||
|
}
|
||||||
|
return a ? b : c ? d : r;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
75
test/compress/issue-1446.js
Normal file
75
test/compress/issue-1446.js
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
typeof_eq_undefined: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
typeofs: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = typeof b != "undefined";
|
||||||
|
b = typeof a != "undefined";
|
||||||
|
var c = typeof d.e !== "undefined";
|
||||||
|
var f = "undefined" === typeof g;
|
||||||
|
g = "undefined" === typeof f;
|
||||||
|
var h = "undefined" == typeof i.j;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "undefined" != typeof b;
|
||||||
|
b = void 0 !== a;
|
||||||
|
var c = void 0 !== d.e;
|
||||||
|
var f = "undefined" == typeof g;
|
||||||
|
g = void 0 === f;
|
||||||
|
var h = void 0 === i.j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
typeof_eq_undefined_ie8: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
ie8: true,
|
||||||
|
typeofs: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = typeof b != "undefined";
|
||||||
|
b = typeof a != "undefined";
|
||||||
|
var c = typeof d.e !== "undefined";
|
||||||
|
var f = "undefined" === typeof g;
|
||||||
|
g = "undefined" === typeof f;
|
||||||
|
var h = "undefined" == typeof i.j;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = "undefined" != typeof b;
|
||||||
|
b = void 0 !== a;
|
||||||
|
var c = "undefined" != typeof d.e;
|
||||||
|
var f = "undefined" == typeof g;
|
||||||
|
g = void 0 === f;
|
||||||
|
var h = "undefined" == typeof i.j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
undefined_redefined: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
typeofs: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(undefined) {
|
||||||
|
var n = 1;
|
||||||
|
return typeof n == "undefined";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "function f(undefined){var n=1;return void 0===n}"
|
||||||
|
}
|
||||||
|
|
||||||
|
undefined_redefined_mangle: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
typeofs: true,
|
||||||
|
}
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
function f(undefined) {
|
||||||
|
var n = 1;
|
||||||
|
return typeof n == "undefined";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "function f(n){var r=1;return void 0===r}"
|
||||||
|
}
|
||||||
45
test/compress/issue-1447.js
Normal file
45
test/compress/issue-1447.js
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
else_with_empty_block: {
|
||||||
|
options = {}
|
||||||
|
input: {
|
||||||
|
if (x)
|
||||||
|
yes();
|
||||||
|
else {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "if(x)yes();"
|
||||||
|
}
|
||||||
|
|
||||||
|
else_with_empty_statement: {
|
||||||
|
options = {}
|
||||||
|
input: {
|
||||||
|
if (x)
|
||||||
|
yes();
|
||||||
|
else
|
||||||
|
;
|
||||||
|
}
|
||||||
|
expect_exact: "if(x)yes();"
|
||||||
|
}
|
||||||
|
|
||||||
|
conditional_false_stray_else_in_loop: {
|
||||||
|
options = {
|
||||||
|
evaluate : true,
|
||||||
|
comparisons : true,
|
||||||
|
booleans : true,
|
||||||
|
unused : true,
|
||||||
|
loops : true,
|
||||||
|
side_effects : true,
|
||||||
|
dead_code : true,
|
||||||
|
hoist_vars : true,
|
||||||
|
join_vars : true,
|
||||||
|
if_return : true,
|
||||||
|
conditionals : false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
for (var i = 1; i <= 4; ++i) {
|
||||||
|
if (i <= 2) continue;
|
||||||
|
console.log(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "for(var i=1;i<=4;++i)if(!(i<=2))console.log(i);"
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
19
test/compress/issue-1569.js
Normal file
19
test/compress/issue-1569.js
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
inner_reference: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
!function f(a) {
|
||||||
|
return a && f(a - 1) + a;
|
||||||
|
}(42);
|
||||||
|
!function g(a) {
|
||||||
|
return a;
|
||||||
|
}(42);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function f(a) {
|
||||||
|
return a && f(a - 1) + a;
|
||||||
|
}(42);
|
||||||
|
!void 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
87
test/compress/issue-1588.js
Normal file
87
test/compress/issue-1588.js
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
screw_ie8: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try { throw "foo"; } catch (x) { console.log(x); }
|
||||||
|
}
|
||||||
|
expect_exact: 'try{throw"foo"}catch(o){console.log(o)}'
|
||||||
|
expect_stdout: [
|
||||||
|
"foo"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
support_ie8: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try { throw "foo"; } catch (x) { console.log(x); }
|
||||||
|
}
|
||||||
|
expect_exact: 'try{throw"foo"}catch(x){console.log(x)}'
|
||||||
|
expect_stdout: "foo"
|
||||||
|
}
|
||||||
|
|
||||||
|
safe_undefined: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
unsafe: false,
|
||||||
|
}
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
var a, c;
|
||||||
|
console.log(function(undefined) {
|
||||||
|
return function() {
|
||||||
|
if (a)
|
||||||
|
return b;
|
||||||
|
if (c)
|
||||||
|
return d;
|
||||||
|
};
|
||||||
|
}(1)());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, c;
|
||||||
|
console.log(function(n) {
|
||||||
|
return function() {
|
||||||
|
return a ? b : c ? d : void 0;
|
||||||
|
};
|
||||||
|
}(1)());
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe_undefined: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
unsafe_undefined: true,
|
||||||
|
}
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
var a, c;
|
||||||
|
console.log(function(undefined) {
|
||||||
|
return function() {
|
||||||
|
if (a)
|
||||||
|
return b;
|
||||||
|
if (c)
|
||||||
|
return d;
|
||||||
|
};
|
||||||
|
}()());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, c;
|
||||||
|
console.log(function(n) {
|
||||||
|
return function() {
|
||||||
|
return a ? b : c ? d : n;
|
||||||
|
};
|
||||||
|
}()());
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
54
test/compress/issue-1609.js
Normal file
54
test/compress/issue-1609.js
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
chained_evaluation_1: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
var a = 1;
|
||||||
|
(function() {
|
||||||
|
var b = a, c;
|
||||||
|
c = f(b);
|
||||||
|
c.bar = b;
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
(function() {
|
||||||
|
f(1).bar = 1;
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
chained_evaluation_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
var a = "long piece of string";
|
||||||
|
(function() {
|
||||||
|
var b = a, c;
|
||||||
|
c = f(b);
|
||||||
|
c.bar = b;
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function() {
|
||||||
|
(function() {
|
||||||
|
var b = "long piece of string";
|
||||||
|
f(b).bar = b;
|
||||||
|
})();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
}
|
||||||
88
test/compress/issue-1639.js
Normal file
88
test/compress/issue-1639.js
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
|
||||||
|
issue_1639_1: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
join_vars: true,
|
||||||
|
loops: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 100, b = 10;
|
||||||
|
|
||||||
|
var L1 = 5;
|
||||||
|
while (--L1 > 0) {
|
||||||
|
if ((--b), false) {
|
||||||
|
if (b) {
|
||||||
|
var ignore = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for (var a = 100, b = 10, L1 = 5; --L1 > 0;)
|
||||||
|
if (--b, 0) var ignore = 0;
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1639_2: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
join_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 100, b = 10;
|
||||||
|
|
||||||
|
function f19() {
|
||||||
|
if (++a, false)
|
||||||
|
if (a)
|
||||||
|
if (++a);
|
||||||
|
}
|
||||||
|
f19();
|
||||||
|
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 100, b = 10;
|
||||||
|
function f19() {
|
||||||
|
++a, 0;
|
||||||
|
}
|
||||||
|
f19(),
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1639_3: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 100, b = 10;
|
||||||
|
a++ && false && a ? 0 : 0;
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 100, b = 10;
|
||||||
|
a++,
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
45
test/compress/issue-1656.js
Normal file
45
test/compress/issue-1656.js
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
f7: {
|
||||||
|
options = {
|
||||||
|
booleans: true,
|
||||||
|
collapse_vars: true,
|
||||||
|
comparisons: true,
|
||||||
|
conditionals: true,
|
||||||
|
dead_code: true,
|
||||||
|
drop_debugger: true,
|
||||||
|
evaluate: true,
|
||||||
|
hoist_funs: true,
|
||||||
|
if_return: true,
|
||||||
|
join_vars: true,
|
||||||
|
loops: true,
|
||||||
|
negate_iife: true,
|
||||||
|
passes: 3,
|
||||||
|
properties: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 100, b = 10;
|
||||||
|
function f22464() {
|
||||||
|
var brake146670 = 5;
|
||||||
|
while (((b = a) ? !a : ~a ? null : b += a) && --brake146670 > 0) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f22464();
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"var b = 10;",
|
||||||
|
"",
|
||||||
|
"!function() {",
|
||||||
|
" b = 100;",
|
||||||
|
"}(), console.log(100, b);",
|
||||||
|
]
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
166
test/compress/issue-1673.js
Normal file
166
test/compress/issue-1673.js
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
side_effects_catch: {
|
||||||
|
options = {
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
function g() {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
(function() {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (e) {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
side_effects_else: {
|
||||||
|
options = {
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(x) {
|
||||||
|
function g() {
|
||||||
|
if (x);
|
||||||
|
else console.log("PASS");
|
||||||
|
}
|
||||||
|
g();
|
||||||
|
}
|
||||||
|
f(0);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(x) {
|
||||||
|
(function() {
|
||||||
|
if (x);
|
||||||
|
else console.log("PASS");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
f(0);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
side_effects_finally: {
|
||||||
|
options = {
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
function g() {
|
||||||
|
try {
|
||||||
|
x();
|
||||||
|
} catch (e) {
|
||||||
|
} finally {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
(function() {
|
||||||
|
try {
|
||||||
|
x();
|
||||||
|
} catch (e) {
|
||||||
|
} finally {
|
||||||
|
console.log("PASS");
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
side_effects_label: {
|
||||||
|
options = {
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(x) {
|
||||||
|
function g() {
|
||||||
|
L: {
|
||||||
|
console.log("PASS");
|
||||||
|
break L;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g();
|
||||||
|
}
|
||||||
|
f(0);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(x) {
|
||||||
|
(function() {
|
||||||
|
L: {
|
||||||
|
console.log("PASS");
|
||||||
|
break L;
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
f(0);
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
side_effects_switch: {
|
||||||
|
options = {
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
function g() {
|
||||||
|
switch (0) {
|
||||||
|
default:
|
||||||
|
case console.log("PASS"):
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
(function() {
|
||||||
|
switch (0) {
|
||||||
|
default:
|
||||||
|
case console.log("PASS"):
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
439
test/compress/issue-1704.js
Normal file
439
test/compress/issue-1704.js
Normal file
@@ -0,0 +1,439 @@
|
|||||||
|
mangle_catch: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (args) {
|
||||||
|
a = "PASS";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a="FAIL";try{throw 1}catch(o){a="PASS"}console.log(a);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_ie8: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (args) {
|
||||||
|
a = "PASS";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a="FAIL";try{throw 1}catch(args){a="PASS"}console.log(a);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_var: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (args) {
|
||||||
|
var a = "PASS";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a="FAIL";try{throw 1}catch(o){var a="PASS"}console.log(a);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_var_ie8: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (args) {
|
||||||
|
var a = "PASS";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a="FAIL";try{throw 1}catch(args){var a="PASS"}console.log(a);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_toplevel: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (args) {
|
||||||
|
a = "PASS";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var c="FAIL";try{throw 1}catch(o){c="PASS"}console.log(c);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_ie8_toplevel: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (args) {
|
||||||
|
a = "PASS";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var o="FAIL";try{throw 1}catch(c){o="PASS"}console.log(o);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_var_toplevel: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (args) {
|
||||||
|
var a = "PASS";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var r="FAIL";try{throw 1}catch(o){var r="PASS"}console.log(r);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_var_ie8_toplevel: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "FAIL";
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (args) {
|
||||||
|
var a = "PASS";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var o="FAIL";try{throw 1}catch(r){var o="PASS"}console.log(o);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_1: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
try {
|
||||||
|
throw "FAIL1";
|
||||||
|
} catch (a) {
|
||||||
|
var a = "FAIL2";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a="PASS";try{throw"FAIL1"}catch(a){var a="FAIL2"}console.log(a);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_1_ie8: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
try {
|
||||||
|
throw "FAIL1";
|
||||||
|
} catch (a) {
|
||||||
|
var a = "FAIL2";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var a="PASS";try{throw"FAIL1"}catch(a){var a="FAIL2"}console.log(a);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_1_toplevel: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
try {
|
||||||
|
throw "FAIL1";
|
||||||
|
} catch (a) {
|
||||||
|
var a = "FAIL2";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var o="PASS";try{throw"FAIL1"}catch(o){var o="FAIL2"}console.log(o);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_1_ie8_toplevel: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = "PASS";
|
||||||
|
try {
|
||||||
|
throw "FAIL1";
|
||||||
|
} catch (a) {
|
||||||
|
var a = "FAIL2";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'var o="PASS";try{throw"FAIL1"}catch(o){var o="FAIL2"}console.log(o);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_2: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
throw "FAIL1";
|
||||||
|
} catch (a) {
|
||||||
|
var a = "FAIL2";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'try{throw"FAIL1"}catch(a){var a="FAIL2"}console.log(a);'
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_2_ie8: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
throw "FAIL1";
|
||||||
|
} catch (a) {
|
||||||
|
var a = "FAIL2";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'try{throw"FAIL1"}catch(a){var a="FAIL2"}console.log(a);'
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_2_toplevel: {
|
||||||
|
options = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
throw "FAIL1";
|
||||||
|
} catch (a) {
|
||||||
|
var a = "FAIL2";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'try{throw"FAIL1"}catch(o){var o="FAIL2"}console.log(o);'
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_2_ie8_toplevel: {
|
||||||
|
options = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
try {
|
||||||
|
throw "FAIL1";
|
||||||
|
} catch (a) {
|
||||||
|
var a = "FAIL2";
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: 'try{throw"FAIL1"}catch(o){var o="FAIL2"}console.log(o);'
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_3: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = "PASS";
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (o) {
|
||||||
|
(function() {
|
||||||
|
function f() {
|
||||||
|
o = "FAIL";
|
||||||
|
}
|
||||||
|
f(), f();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
expect_exact: 'var o="PASS";try{throw 0}catch(o){(function(){function c(){o="FAIL"}c(),c()})()}console.log(o);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_3_toplevel: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = "PASS";
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (o) {
|
||||||
|
(function() {
|
||||||
|
function f() {
|
||||||
|
o = "FAIL";
|
||||||
|
}
|
||||||
|
f(), f();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
expect_exact: 'var c="PASS";try{throw 0}catch(c){(function(){function o(){c="FAIL"}o(),o()})()}console.log(c);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_ie8_3: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = "PASS";
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (o) {
|
||||||
|
(function() {
|
||||||
|
function f() {
|
||||||
|
o = "FAIL";
|
||||||
|
}
|
||||||
|
f(), f();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
expect_exact: 'var o="PASS";try{throw 0}catch(o){(function(){function c(){o="FAIL"}c(),c()})()}console.log(o);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
|
|
||||||
|
mangle_catch_redef_3_ie8_toplevel: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
toplevel: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = "PASS";
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (o) {
|
||||||
|
(function() {
|
||||||
|
function f() {
|
||||||
|
o = "FAIL";
|
||||||
|
}
|
||||||
|
f(), f();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
expect_exact: 'var c="PASS";try{throw 0}catch(c){(function(){function o(){c="FAIL"}o(),o()})()}console.log(c);'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
97
test/compress/issue-1733.js
Normal file
97
test/compress/issue-1733.js
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
function_iife_catch: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(n) {
|
||||||
|
!function() {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (n) {
|
||||||
|
var a = 1;
|
||||||
|
console.log(n, a);
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_exact: "function f(o){!function(){try{throw 0}catch(o){var c=1;console.log(o,c)}}()}f();"
|
||||||
|
expect_stdout: "0 1"
|
||||||
|
}
|
||||||
|
|
||||||
|
function_iife_catch_ie8: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(n) {
|
||||||
|
!function() {
|
||||||
|
try {
|
||||||
|
throw 0;
|
||||||
|
} catch (n) {
|
||||||
|
var a = 1;
|
||||||
|
console.log(n, a);
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_exact: "function f(c){!function(){try{throw 0}catch(c){var o=1;console.log(c,o)}}()}f();"
|
||||||
|
expect_stdout: "0 1"
|
||||||
|
}
|
||||||
|
|
||||||
|
function_catch_catch: {
|
||||||
|
mangle = {
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = 0;
|
||||||
|
function f() {
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (c) {
|
||||||
|
try {
|
||||||
|
throw 2;
|
||||||
|
} catch (o) {
|
||||||
|
var o = 3;
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_exact: "var o=0;function f(){try{throw 1}catch(o){try{throw 2}catch(c){var c=3;console.log(c)}}console.log(c)}f();"
|
||||||
|
expect_stdout: [
|
||||||
|
"3",
|
||||||
|
"undefined",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
function_catch_catch_ie8: {
|
||||||
|
mangle = {
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var o = 0;
|
||||||
|
function f() {
|
||||||
|
try {
|
||||||
|
throw 1;
|
||||||
|
} catch (c) {
|
||||||
|
try {
|
||||||
|
throw 2;
|
||||||
|
} catch (o) {
|
||||||
|
var o = 3;
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect_exact: "var o=0;function f(){try{throw 1}catch(c){try{throw 2}catch(o){var o=3;console.log(o)}}console.log(o)}f();"
|
||||||
|
expect_stdout: [
|
||||||
|
"3",
|
||||||
|
"undefined",
|
||||||
|
]
|
||||||
|
}
|
||||||
54
test/compress/issue-1750.js
Normal file
54
test/compress/issue-1750.js
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
case_1: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0, b = 1;
|
||||||
|
switch (true) {
|
||||||
|
case a || true:
|
||||||
|
default:
|
||||||
|
b = 2;
|
||||||
|
case true:
|
||||||
|
}
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0, b = 1;
|
||||||
|
switch (true) {
|
||||||
|
case a || true:
|
||||||
|
b = 2;
|
||||||
|
}
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_stdout: "0 2"
|
||||||
|
}
|
||||||
|
|
||||||
|
case_2: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
switches: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 0, b = 1;
|
||||||
|
switch (0) {
|
||||||
|
default:
|
||||||
|
b = 2;
|
||||||
|
case a:
|
||||||
|
a = 3;
|
||||||
|
case 0:
|
||||||
|
}
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 0, b = 1;
|
||||||
|
switch (0) {
|
||||||
|
case a:
|
||||||
|
a = 3;
|
||||||
|
}
|
||||||
|
console.log(a, b);
|
||||||
|
}
|
||||||
|
expect_stdout: "3 1"
|
||||||
|
}
|
||||||
245
test/compress/issue-1770.js
Normal file
245
test/compress/issue-1770.js
Normal file
@@ -0,0 +1,245 @@
|
|||||||
|
mangle_props: {
|
||||||
|
mangle = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj = {
|
||||||
|
undefined: 1,
|
||||||
|
NaN: 2,
|
||||||
|
Infinity: 3,
|
||||||
|
"-Infinity": 4,
|
||||||
|
null: 5,
|
||||||
|
};
|
||||||
|
console.log(
|
||||||
|
obj[void 0],
|
||||||
|
obj[undefined],
|
||||||
|
obj["undefined"],
|
||||||
|
obj[0/0],
|
||||||
|
obj[NaN],
|
||||||
|
obj["NaN"],
|
||||||
|
obj[1/0],
|
||||||
|
obj[Infinity],
|
||||||
|
obj["Infinity"],
|
||||||
|
obj[-1/0],
|
||||||
|
obj[-Infinity],
|
||||||
|
obj["-Infinity"],
|
||||||
|
obj[null],
|
||||||
|
obj["null"]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var obj = {
|
||||||
|
undefined: 1,
|
||||||
|
NaN: 2,
|
||||||
|
Infinity: 3,
|
||||||
|
"-Infinity": 4,
|
||||||
|
null: 5,
|
||||||
|
};
|
||||||
|
console.log(
|
||||||
|
obj[void 0],
|
||||||
|
obj[void 0],
|
||||||
|
obj["undefined"],
|
||||||
|
obj[0/0],
|
||||||
|
obj[NaN],
|
||||||
|
obj["NaN"],
|
||||||
|
obj[1/0],
|
||||||
|
obj[1/0],
|
||||||
|
obj["Infinity"],
|
||||||
|
obj[-1/0],
|
||||||
|
obj[-1/0],
|
||||||
|
obj["-Infinity"],
|
||||||
|
obj[null],
|
||||||
|
obj["null"]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect_stdout: "1 1 1 2 2 2 3 3 3 4 4 4 5 5"
|
||||||
|
}
|
||||||
|
|
||||||
|
numeric_literal: {
|
||||||
|
mangle = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj = {
|
||||||
|
0: 0,
|
||||||
|
"-0": 1,
|
||||||
|
42: 2,
|
||||||
|
"42": 3,
|
||||||
|
0x25: 4,
|
||||||
|
"0x25": 5,
|
||||||
|
1E42: 6,
|
||||||
|
"1E42": 7,
|
||||||
|
"1e+42": 8,
|
||||||
|
};
|
||||||
|
console.log(obj[-0], obj[-""], obj["-0"]);
|
||||||
|
console.log(obj[42], obj["42"]);
|
||||||
|
console.log(obj[0x25], obj["0x25"], obj[37], obj["37"]);
|
||||||
|
console.log(obj[1E42], obj["1E42"], obj["1e+42"]);
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
'var obj = {',
|
||||||
|
' 0: 0,',
|
||||||
|
' "-0": 1,',
|
||||||
|
' 42: 2,',
|
||||||
|
' 42: 3,',
|
||||||
|
' 37: 4,',
|
||||||
|
' o: 5,',
|
||||||
|
' 1e42: 6,',
|
||||||
|
' b: 7,',
|
||||||
|
' 1e42: 8',
|
||||||
|
'};',
|
||||||
|
'',
|
||||||
|
'console.log(obj[-0], obj[-""], obj["-0"]);',
|
||||||
|
'',
|
||||||
|
'console.log(obj[42], obj["42"]);',
|
||||||
|
'',
|
||||||
|
'console.log(obj[37], obj["o"], obj[37], obj["37"]);',
|
||||||
|
'',
|
||||||
|
'console.log(obj[1e42], obj["b"], obj["1e+42"]);',
|
||||||
|
]
|
||||||
|
expect_stdout: [
|
||||||
|
"0 0 1",
|
||||||
|
"3 3",
|
||||||
|
"4 5 4 4",
|
||||||
|
"8 7 8",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
identifier: {
|
||||||
|
mangle = {
|
||||||
|
properties: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var obj = {
|
||||||
|
abstract: 1,
|
||||||
|
boolean: 2,
|
||||||
|
byte: 3,
|
||||||
|
char: 4,
|
||||||
|
class: 5,
|
||||||
|
double: 6,
|
||||||
|
enum: 7,
|
||||||
|
export: 8,
|
||||||
|
extends: 9,
|
||||||
|
final: 10,
|
||||||
|
float: 11,
|
||||||
|
goto: 12,
|
||||||
|
implements: 13,
|
||||||
|
import: 14,
|
||||||
|
int: 15,
|
||||||
|
interface: 16,
|
||||||
|
let: 17,
|
||||||
|
long: 18,
|
||||||
|
native: 19,
|
||||||
|
package: 20,
|
||||||
|
private: 21,
|
||||||
|
protected: 22,
|
||||||
|
public: 23,
|
||||||
|
short: 24,
|
||||||
|
static: 25,
|
||||||
|
super: 26,
|
||||||
|
synchronized: 27,
|
||||||
|
this: 28,
|
||||||
|
throws: 29,
|
||||||
|
transient: 30,
|
||||||
|
volatile: 31,
|
||||||
|
yield: 32,
|
||||||
|
false: 33,
|
||||||
|
null: 34,
|
||||||
|
true: 35,
|
||||||
|
break: 36,
|
||||||
|
case: 37,
|
||||||
|
catch: 38,
|
||||||
|
const: 39,
|
||||||
|
continue: 40,
|
||||||
|
debugger: 41,
|
||||||
|
default: 42,
|
||||||
|
delete: 43,
|
||||||
|
do: 44,
|
||||||
|
else: 45,
|
||||||
|
finally: 46,
|
||||||
|
for: 47,
|
||||||
|
function: 48,
|
||||||
|
if: 49,
|
||||||
|
in: 50,
|
||||||
|
instanceof: 51,
|
||||||
|
new: 52,
|
||||||
|
return: 53,
|
||||||
|
switch: 54,
|
||||||
|
throw: 55,
|
||||||
|
try: 56,
|
||||||
|
typeof: 57,
|
||||||
|
var: 58,
|
||||||
|
void: 59,
|
||||||
|
while: 60,
|
||||||
|
with: 61,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var obj = {
|
||||||
|
e: 1,
|
||||||
|
t: 2,
|
||||||
|
n: 3,
|
||||||
|
a: 4,
|
||||||
|
i: 5,
|
||||||
|
o: 6,
|
||||||
|
r: 7,
|
||||||
|
l: 8,
|
||||||
|
s: 9,
|
||||||
|
c: 10,
|
||||||
|
f: 11,
|
||||||
|
u: 12,
|
||||||
|
d: 13,
|
||||||
|
h: 14,
|
||||||
|
p: 15,
|
||||||
|
b: 16,
|
||||||
|
v: 17,
|
||||||
|
w: 18,
|
||||||
|
y: 19,
|
||||||
|
g: 20,
|
||||||
|
m: 21,
|
||||||
|
k: 22,
|
||||||
|
x: 23,
|
||||||
|
j: 24,
|
||||||
|
z: 25,
|
||||||
|
q: 26,
|
||||||
|
A: 27,
|
||||||
|
B: 28,
|
||||||
|
C: 29,
|
||||||
|
D: 30,
|
||||||
|
F: 31,
|
||||||
|
G: 32,
|
||||||
|
false: 33,
|
||||||
|
null: 34,
|
||||||
|
true: 35,
|
||||||
|
H: 36,
|
||||||
|
I: 37,
|
||||||
|
J: 38,
|
||||||
|
K: 39,
|
||||||
|
L: 40,
|
||||||
|
M: 41,
|
||||||
|
N: 42,
|
||||||
|
O: 43,
|
||||||
|
P: 44,
|
||||||
|
Q: 45,
|
||||||
|
R: 46,
|
||||||
|
S: 47,
|
||||||
|
T: 48,
|
||||||
|
U: 49,
|
||||||
|
V: 50,
|
||||||
|
W: 51,
|
||||||
|
X: 52,
|
||||||
|
Y: 53,
|
||||||
|
Z: 54,
|
||||||
|
$: 55,
|
||||||
|
_: 56,
|
||||||
|
ee: 57,
|
||||||
|
te: 58,
|
||||||
|
ne: 59,
|
||||||
|
ae: 60,
|
||||||
|
ie: 61,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
17
test/compress/issue-1787.js
Normal file
17
test/compress/issue-1787.js
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
unary_prefix: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
var x = -(2 / 3);
|
||||||
|
return x;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(-2/3);"
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
138
test/compress/issue-1833.js
Normal file
138
test/compress/issue-1833.js
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
iife_for: {
|
||||||
|
options = {
|
||||||
|
negate_iife: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
function g() {
|
||||||
|
L: for (;;) break L;
|
||||||
|
}
|
||||||
|
g();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function() {
|
||||||
|
!function() {
|
||||||
|
L: for (;;) break L;
|
||||||
|
}();
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iife_for_in: {
|
||||||
|
options = {
|
||||||
|
negate_iife: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
function g() {
|
||||||
|
L: for (var a in x) break L;
|
||||||
|
}
|
||||||
|
g();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function() {
|
||||||
|
!function() {
|
||||||
|
L: for (var a in x) break L;
|
||||||
|
}();
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iife_do: {
|
||||||
|
options = {
|
||||||
|
negate_iife: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
function g() {
|
||||||
|
L: do {
|
||||||
|
break L;
|
||||||
|
} while (1);
|
||||||
|
}
|
||||||
|
g();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function() {
|
||||||
|
!function() {
|
||||||
|
L: do {
|
||||||
|
break L;
|
||||||
|
} while (1);
|
||||||
|
}();
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iife_while: {
|
||||||
|
options = {
|
||||||
|
negate_iife: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
function g() {
|
||||||
|
L: while (1) break L;
|
||||||
|
}
|
||||||
|
g();
|
||||||
|
}
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function() {
|
||||||
|
!function() {
|
||||||
|
L: while (1) break L;
|
||||||
|
}();
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
label_do: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
L: do {
|
||||||
|
continue L;
|
||||||
|
} while (0);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
L: do {
|
||||||
|
continue L;
|
||||||
|
} while (0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
label_while: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
dead_code: true,
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
L: while (0) continue L;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "function f(){L:0}"
|
||||||
|
}
|
||||||
31
test/compress/issue-1943.js
Normal file
31
test/compress/issue-1943.js
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
operator: {
|
||||||
|
input: {
|
||||||
|
a. //comment
|
||||||
|
typeof
|
||||||
|
}
|
||||||
|
expect_exact: "a.typeof;"
|
||||||
|
}
|
||||||
|
|
||||||
|
name: {
|
||||||
|
input: {
|
||||||
|
a. //comment
|
||||||
|
b
|
||||||
|
}
|
||||||
|
expect_exact: "a.b;"
|
||||||
|
}
|
||||||
|
|
||||||
|
keyword: {
|
||||||
|
input: {
|
||||||
|
a. //comment
|
||||||
|
default
|
||||||
|
}
|
||||||
|
expect_exact: "a.default;"
|
||||||
|
}
|
||||||
|
|
||||||
|
atom: {
|
||||||
|
input: {
|
||||||
|
a. //comment
|
||||||
|
true
|
||||||
|
}
|
||||||
|
expect_exact: "a.true;"
|
||||||
|
}
|
||||||
70
test/compress/issue-208.js
Normal file
70
test/compress/issue-208.js
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
do_not_update_lhs: {
|
||||||
|
options = {
|
||||||
|
global_defs: { DEBUG: 0 }
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
DEBUG++;
|
||||||
|
DEBUG += 1;
|
||||||
|
DEBUG = 1;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
DEBUG++;
|
||||||
|
DEBUG += 1;
|
||||||
|
DEBUG = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
do_update_rhs: {
|
||||||
|
options = {
|
||||||
|
global_defs: { DEBUG: 0 }
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
MY_DEBUG = DEBUG;
|
||||||
|
MY_DEBUG += DEBUG;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
MY_DEBUG = 0;
|
||||||
|
MY_DEBUG += 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mixed: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
global_defs: {
|
||||||
|
DEBUG: 0,
|
||||||
|
ENV: 1,
|
||||||
|
FOO: 2,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var ENV = 3;
|
||||||
|
var FOO = 4;
|
||||||
|
f(ENV * 10);
|
||||||
|
--FOO;
|
||||||
|
DEBUG = 1;
|
||||||
|
DEBUG++;
|
||||||
|
DEBUG += 1;
|
||||||
|
f(DEBUG);
|
||||||
|
x = DEBUG;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var ENV = 3;
|
||||||
|
var FOO = 4;
|
||||||
|
f(10);
|
||||||
|
--FOO;
|
||||||
|
DEBUG = 1;
|
||||||
|
DEBUG++;
|
||||||
|
DEBUG += 1;
|
||||||
|
f(0);
|
||||||
|
x = 0;
|
||||||
|
}
|
||||||
|
expect_warnings: [
|
||||||
|
'WARN: global_defs ENV redefined [test/compress/issue-208.js:41,12]',
|
||||||
|
'WARN: global_defs FOO redefined [test/compress/issue-208.js:42,12]',
|
||||||
|
'WARN: global_defs FOO redefined [test/compress/issue-208.js:44,10]',
|
||||||
|
'WARN: global_defs DEBUG redefined [test/compress/issue-208.js:45,8]',
|
||||||
|
'WARN: global_defs DEBUG redefined [test/compress/issue-208.js:46,8]',
|
||||||
|
'WARN: global_defs DEBUG redefined [test/compress/issue-208.js:47,8]',
|
||||||
|
]
|
||||||
|
}
|
||||||
33
test/compress/issue-2652.js
Normal file
33
test/compress/issue-2652.js
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
insert_semicolon: {
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a
|
||||||
|
/* foo */ var b
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"var a",
|
||||||
|
"/* foo */;",
|
||||||
|
"",
|
||||||
|
"var b;",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
unary_postfix: {
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
a
|
||||||
|
/* foo */++b
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"a",
|
||||||
|
"/* foo */;",
|
||||||
|
"",
|
||||||
|
"++b;",
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -64,3 +64,27 @@ strings_concat: {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
regexp: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
RegExp("foo");
|
||||||
|
RegExp("bar", "ig");
|
||||||
|
RegExp(foo);
|
||||||
|
RegExp("bar", ig);
|
||||||
|
RegExp("should", "fail");
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
/foo/;
|
||||||
|
/bar/ig;
|
||||||
|
RegExp(foo);
|
||||||
|
RegExp("bar", ig);
|
||||||
|
RegExp("should", "fail");
|
||||||
|
}
|
||||||
|
expect_warnings: [
|
||||||
|
'WARN: Error converting RegExp("should","fail") [test/compress/issue-269.js:78,2]',
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|||||||
32
test/compress/issue-2719.js
Normal file
32
test/compress/issue-2719.js
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
warn: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
properties: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
return g();
|
||||||
|
}
|
||||||
|
function g() {
|
||||||
|
return g["call" + "er"].arguments;
|
||||||
|
}
|
||||||
|
// 3
|
||||||
|
console.log(f(1, 2, 3).length);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
// TypeError: Cannot read property 'arguments' of null
|
||||||
|
console.log(function g() {
|
||||||
|
return g.caller.arguments;
|
||||||
|
}().length);
|
||||||
|
}
|
||||||
|
expect_warnings: [
|
||||||
|
"WARN: Function.protoype.caller not supported [test/compress/issue-2719.js:17,19]",
|
||||||
|
"WARN: Function.protoype.arguments not supported [test/compress/issue-2719.js:17,19]",
|
||||||
|
]
|
||||||
|
}
|
||||||
498
test/compress/issue-281.js
Normal file
498
test/compress/issue-281.js
Normal file
@@ -0,0 +1,498 @@
|
|||||||
|
collapse_vars_constants: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f1(x) {
|
||||||
|
var a = 4, b = x.prop, c = 5, d = sideeffect1(), e = sideeffect2();
|
||||||
|
return b + (function() { return d - a * e - c; })();
|
||||||
|
}
|
||||||
|
function f2(x) {
|
||||||
|
var a = 4, b = x.prop, c = 5, not_used = sideeffect1(), e = sideeffect2();
|
||||||
|
return b + (function() { return -a * e - c; })();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f1(x) {
|
||||||
|
var b = x.prop, d = sideeffect1(), e = sideeffect2();
|
||||||
|
return b + (d - 4 * e - 5);
|
||||||
|
}
|
||||||
|
function f2(x) {
|
||||||
|
var b = x.prop;
|
||||||
|
sideeffect1();
|
||||||
|
return b + (-4 * sideeffect2() - 5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
modified: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f5(b) {
|
||||||
|
var a = function() {
|
||||||
|
return b;
|
||||||
|
}();
|
||||||
|
return b++ + a;
|
||||||
|
}
|
||||||
|
console.log(f5(1));
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f5(b) {
|
||||||
|
var a = b;
|
||||||
|
return b++ + a;
|
||||||
|
}
|
||||||
|
console.log(f5(1));
|
||||||
|
}
|
||||||
|
expect_stdout: "2"
|
||||||
|
}
|
||||||
|
|
||||||
|
ref_scope: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function() {
|
||||||
|
var a = 1, b = 2, c = 3;
|
||||||
|
var a = c++, b = b /= a;
|
||||||
|
return function() {
|
||||||
|
return a;
|
||||||
|
}() + b;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function() {
|
||||||
|
var a = 1, b = 2, c = 3;
|
||||||
|
b = b /= a = c++;
|
||||||
|
return a + b;
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
safe_undefined: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
if_return: true,
|
||||||
|
inline: true,
|
||||||
|
unsafe: false,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
mangle = {}
|
||||||
|
input: {
|
||||||
|
var a, c;
|
||||||
|
console.log(function(undefined) {
|
||||||
|
return function() {
|
||||||
|
if (a)
|
||||||
|
return b;
|
||||||
|
if (c)
|
||||||
|
return d;
|
||||||
|
};
|
||||||
|
}(1)());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a, c;
|
||||||
|
console.log(a ? b : c ? d : void 0);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_3: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
expression: true,
|
||||||
|
inline: true,
|
||||||
|
negate_iife: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
t ? console.log(true) : console.log(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_3_off: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
expression: true,
|
||||||
|
inline: true,
|
||||||
|
negate_iife: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
t ? console.log(true) : console.log(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_4: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
expression: true,
|
||||||
|
inline: true,
|
||||||
|
negate_iife: true,
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
|
(function(){
|
||||||
|
console.log("something");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
t ? console.log(true) : console.log(false), void console.log("something");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_5: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
expression: true,
|
||||||
|
inline: true,
|
||||||
|
negate_iife: true,
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if ((function(){ return t })()) {
|
||||||
|
foo(true);
|
||||||
|
} else {
|
||||||
|
bar(false);
|
||||||
|
}
|
||||||
|
(function(){
|
||||||
|
console.log("something");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
t ? foo(true) : bar(false), void console.log("something");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_5_off: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
expression: true,
|
||||||
|
inline: true,
|
||||||
|
negate_iife: false,
|
||||||
|
sequences: true,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
if ((function(){ return t })()) {
|
||||||
|
foo(true);
|
||||||
|
} else {
|
||||||
|
bar(false);
|
||||||
|
}
|
||||||
|
(function(){
|
||||||
|
console.log("something");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
t ? foo(true) : bar(false), void console.log("something");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1254_negate_iife_true: {
|
||||||
|
options = {
|
||||||
|
expression: true,
|
||||||
|
inline: true,
|
||||||
|
negate_iife: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
return function() {
|
||||||
|
console.log('test')
|
||||||
|
};
|
||||||
|
})()();
|
||||||
|
}
|
||||||
|
expect_exact: 'void console.log("test");'
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1254_negate_iife_nested: {
|
||||||
|
options = {
|
||||||
|
expression: true,
|
||||||
|
inline: true,
|
||||||
|
negate_iife: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
return function() {
|
||||||
|
console.log('test')
|
||||||
|
};
|
||||||
|
})()()()()();
|
||||||
|
}
|
||||||
|
expect_exact: '(void console.log("test"))()()();'
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_issue_1073: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
negate_iife: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
unused: true,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
new (function(a) {
|
||||||
|
return function Foo() {
|
||||||
|
this.x = a;
|
||||||
|
console.log(this);
|
||||||
|
};
|
||||||
|
}(7))();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
new function() {
|
||||||
|
this.x = 7,
|
||||||
|
console.log(this);
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1288_side_effects: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
negate_iife: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
if (w) ;
|
||||||
|
else {
|
||||||
|
(function f() {})();
|
||||||
|
}
|
||||||
|
if (!x) {
|
||||||
|
(function() {
|
||||||
|
x = {};
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
if (y)
|
||||||
|
(function() {})();
|
||||||
|
else
|
||||||
|
(function(z) {
|
||||||
|
return z;
|
||||||
|
})(0);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
w;
|
||||||
|
x || (x = {});
|
||||||
|
y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inner_var_for_in_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
var a = 1, b = 2;
|
||||||
|
for (b in (function() {
|
||||||
|
return x(a, b, c);
|
||||||
|
})()) {
|
||||||
|
var c = 3, d = 4;
|
||||||
|
x(a, b, c, d);
|
||||||
|
}
|
||||||
|
x(a, b, c, d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
var a = 1, b = 2;
|
||||||
|
for (b in x(1, b, c)) {
|
||||||
|
var c = 3, d = 4;
|
||||||
|
x(1, b, c, d);
|
||||||
|
}
|
||||||
|
x(1, b, c, d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1595_3: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
passes: 2,
|
||||||
|
reduce_funcs: true,
|
||||||
|
reduce_vars: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function f(a) {
|
||||||
|
return g(a + 1);
|
||||||
|
})(2);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
g(3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1758: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(function(c) {
|
||||||
|
var undefined = 42;
|
||||||
|
return function() {
|
||||||
|
c--;
|
||||||
|
c--, c.toString();
|
||||||
|
return;
|
||||||
|
}();
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(function(c) {
|
||||||
|
var undefined = 42;
|
||||||
|
return c--, c--, void c.toString();
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_stdout: "undefined"
|
||||||
|
}
|
||||||
|
wrap_iife: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
negate_iife: false,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
wrap_iife: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
return function() {
|
||||||
|
console.log('test')
|
||||||
|
};
|
||||||
|
})()();
|
||||||
|
}
|
||||||
|
expect_exact: 'void console.log("test");'
|
||||||
|
}
|
||||||
|
|
||||||
|
wrap_iife_in_expression: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
negate_iife: false,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
wrap_iife: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
foo = (function () {
|
||||||
|
return bar();
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect_exact: 'foo=bar();'
|
||||||
|
}
|
||||||
|
|
||||||
|
wrap_iife_in_return_call: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
negate_iife: false,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
wrap_iife: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
return (function() {
|
||||||
|
console.log('test')
|
||||||
|
})();
|
||||||
|
})()();
|
||||||
|
}
|
||||||
|
expect_exact: '(void console.log("test"))();'
|
||||||
|
}
|
||||||
|
|
||||||
|
pure_annotation_1: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/(function() {
|
||||||
|
console.log("hello");
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect_exact: ""
|
||||||
|
}
|
||||||
|
|
||||||
|
pure_annotation_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/(function(n) {
|
||||||
|
console.log("hello", n);
|
||||||
|
}(42));
|
||||||
|
}
|
||||||
|
expect_exact: ""
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_fargs: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
keep_fargs: false,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
!function(a_1) {
|
||||||
|
a++;
|
||||||
|
}(a++ + (a && a.var));
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
++a && a.var, a++;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "3"
|
||||||
|
}
|
||||||
|
|
||||||
|
keep_fargs: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
inline: true,
|
||||||
|
keep_fargs: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
!function(a_1) {
|
||||||
|
a++;
|
||||||
|
}(a++ + (a && a.var));
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = 1;
|
||||||
|
++a && a.var, a++;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "3"
|
||||||
|
}
|
||||||
37
test/compress/issue-2871.js
Normal file
37
test/compress/issue-2871.js
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
comparison_with_undefined: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
a == undefined;
|
||||||
|
a != undefined;
|
||||||
|
a === undefined;
|
||||||
|
a !== undefined;
|
||||||
|
|
||||||
|
undefined == a;
|
||||||
|
undefined != a;
|
||||||
|
undefined === a;
|
||||||
|
undefined !== a;
|
||||||
|
|
||||||
|
void 0 == a;
|
||||||
|
void 0 != a;
|
||||||
|
void 0 === a;
|
||||||
|
void 0 !== a;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
null == a;
|
||||||
|
null != a;
|
||||||
|
void 0 === a;
|
||||||
|
void 0 !== a;
|
||||||
|
|
||||||
|
null == a;
|
||||||
|
null != a;
|
||||||
|
void 0 === a;
|
||||||
|
void 0 !== a;
|
||||||
|
|
||||||
|
null == a;
|
||||||
|
null != a;
|
||||||
|
void 0 === a;
|
||||||
|
void 0 !== a;
|
||||||
|
}
|
||||||
|
}
|
||||||
21
test/compress/issue-2989.js
Normal file
21
test/compress/issue-2989.js
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
inline_script_off: {
|
||||||
|
beautify = {
|
||||||
|
inline_script: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log("</sCrIpT>");
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log("</sCrIpT>");'
|
||||||
|
expect_stdout: "</sCrIpT>"
|
||||||
|
}
|
||||||
|
|
||||||
|
inline_script_on: {
|
||||||
|
beautify = {
|
||||||
|
inline_script: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log("</sCrIpT>");
|
||||||
|
}
|
||||||
|
expect_exact: 'console.log("<\\/sCrIpT>");'
|
||||||
|
expect_stdout: "</sCrIpT>"
|
||||||
|
}
|
||||||
55
test/compress/issue-368.js
Normal file
55
test/compress/issue-368.js
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
collapse: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f1() {
|
||||||
|
var a;
|
||||||
|
a = typeof b === 'function' ? b() : b;
|
||||||
|
return a !== undefined && c();
|
||||||
|
}
|
||||||
|
function f2(b) {
|
||||||
|
var a;
|
||||||
|
b = c();
|
||||||
|
a = typeof b === 'function' ? b() : b;
|
||||||
|
return 'stirng' == typeof a && d();
|
||||||
|
}
|
||||||
|
function f3(c) {
|
||||||
|
var a;
|
||||||
|
a = b(a / 2);
|
||||||
|
if (a < 0) {
|
||||||
|
a++;
|
||||||
|
++c;
|
||||||
|
return c / 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function f4(c) {
|
||||||
|
var a;
|
||||||
|
a = b(a / 2);
|
||||||
|
if (a < 0) {
|
||||||
|
a++;
|
||||||
|
c++;
|
||||||
|
return c / 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f1() {
|
||||||
|
return void 0 !== ('function' === typeof b ? b() : b) && c();
|
||||||
|
}
|
||||||
|
function f2(b) {
|
||||||
|
return 'stirng' == typeof ('function' === typeof (b = c()) ? b() : b) && d();
|
||||||
|
}
|
||||||
|
function f3(c) {
|
||||||
|
var a;
|
||||||
|
if ((a = b(a / 2)) < 0) return a++, ++c / 2;
|
||||||
|
}
|
||||||
|
function f4(c) {
|
||||||
|
var a;
|
||||||
|
if ((a = b(a / 2)) < 0) return a++, ++c / 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
157
test/compress/issue-597.js
Normal file
157
test/compress/issue-597.js
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
NaN_and_Infinity_must_have_parens: {
|
||||||
|
options = {};
|
||||||
|
input: {
|
||||||
|
Infinity.toString();
|
||||||
|
NaN.toString();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(1/0).toString();
|
||||||
|
NaN.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NaN_and_Infinity_should_not_be_replaced_when_they_are_redefined: {
|
||||||
|
options = {};
|
||||||
|
input: {
|
||||||
|
var Infinity, NaN;
|
||||||
|
Infinity.toString();
|
||||||
|
NaN.toString();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var Infinity, NaN;
|
||||||
|
Infinity.toString();
|
||||||
|
NaN.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NaN_and_Infinity_must_have_parens_evaluate: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(123456789 / 0).toString();
|
||||||
|
(+"foo").toString();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(1/0).toString();
|
||||||
|
NaN.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NaN_and_Infinity_should_not_be_replaced_when_they_are_redefined_evaluate: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var Infinity, NaN;
|
||||||
|
(123456789 / 0).toString();
|
||||||
|
(+"foo").toString();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var Infinity, NaN;
|
||||||
|
(1/0).toString();
|
||||||
|
(0/0).toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
beautify_off_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
beautify: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var NaN;
|
||||||
|
console.log(
|
||||||
|
null,
|
||||||
|
undefined,
|
||||||
|
Infinity,
|
||||||
|
NaN,
|
||||||
|
Infinity * undefined,
|
||||||
|
Infinity.toString(),
|
||||||
|
NaN.toString(),
|
||||||
|
(Infinity * undefined).toString()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect_exact: "var NaN;console.log(null,void 0,1/0,NaN,0/0,(1/0).toString(),NaN.toString(),(0/0).toString());"
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
beautify_off_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
beautify: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(
|
||||||
|
null.toString(),
|
||||||
|
undefined.toString()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(null.toString(),(void 0).toString());"
|
||||||
|
}
|
||||||
|
|
||||||
|
beautify_on_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var NaN;
|
||||||
|
console.log(
|
||||||
|
null,
|
||||||
|
undefined,
|
||||||
|
Infinity,
|
||||||
|
NaN,
|
||||||
|
Infinity * undefined,
|
||||||
|
Infinity.toString(),
|
||||||
|
NaN.toString(),
|
||||||
|
(Infinity * undefined).toString()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"var NaN;",
|
||||||
|
"",
|
||||||
|
"console.log(null, void 0, 1 / 0, NaN, 0 / 0, (1 / 0).toString(), NaN.toString(), (0 / 0).toString());",
|
||||||
|
]
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
beautify_on_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(
|
||||||
|
null.toString(),
|
||||||
|
undefined.toString()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(null.toString(), (void 0).toString());"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1724: {
|
||||||
|
input: {
|
||||||
|
var a = 0;
|
||||||
|
++a % Infinity | Infinity ? a++ : 0;
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_exact: "var a=0;++a%(1/0)|1/0?a++:0;console.log(a);"
|
||||||
|
expect_stdout: "2"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1725: {
|
||||||
|
input: {
|
||||||
|
([].length === 0) % Infinity ? console.log("PASS") : console.log("FAIL");
|
||||||
|
}
|
||||||
|
expect_exact: '(0===[].length)%(1/0)?console.log("PASS"):console.log("FAIL");'
|
||||||
|
expect_stdout: "PASS"
|
||||||
|
}
|
||||||
21
test/compress/issue-611.js
Normal file
21
test/compress/issue-611.js
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
issue_611: {
|
||||||
|
options = {
|
||||||
|
sequences: true,
|
||||||
|
side_effects: true
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
define(function() {
|
||||||
|
function fn() {}
|
||||||
|
if (fn()) {
|
||||||
|
fn();
|
||||||
|
return void 0;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
define(function() {
|
||||||
|
function fn(){}
|
||||||
|
if (fn()) return void fn();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
22
test/compress/issue-637.js
Normal file
22
test/compress/issue-637.js
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
wrongly_optimized: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
function func() {
|
||||||
|
foo();
|
||||||
|
}
|
||||||
|
if (func() || true) {
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function func() {
|
||||||
|
foo();
|
||||||
|
}
|
||||||
|
// TODO: optimize to `func(), bar()`
|
||||||
|
(func(), 1) && bar();
|
||||||
|
}
|
||||||
|
}
|
||||||
320
test/compress/issue-640.js
Normal file
320
test/compress/issue-640.js
Normal file
@@ -0,0 +1,320 @@
|
|||||||
|
cond_5: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
expression: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (some_condition()) {
|
||||||
|
if (some_other_condition()) {
|
||||||
|
do_something();
|
||||||
|
} else {
|
||||||
|
alternate();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
alternate();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (some_condition()) {
|
||||||
|
if (some_other_condition()) {
|
||||||
|
do_something();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
some_condition() && some_other_condition() ? do_something() : alternate();
|
||||||
|
if (some_condition() && some_other_condition()) do_something();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dead_code_const_annotation_regex: {
|
||||||
|
options = {
|
||||||
|
booleans : true,
|
||||||
|
conditionals : true,
|
||||||
|
dead_code : true,
|
||||||
|
evaluate : true,
|
||||||
|
expression : true,
|
||||||
|
loops : true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var unused;
|
||||||
|
// @constraint this shouldn't be a constant
|
||||||
|
var CONST_FOO_ANN = false;
|
||||||
|
if (CONST_FOO_ANN) {
|
||||||
|
console.log("reachable");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var unused;
|
||||||
|
var CONST_FOO_ANN = !1;
|
||||||
|
if (CONST_FOO_ANN) console.log('reachable');
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_console_2: {
|
||||||
|
options = {
|
||||||
|
drop_console: true,
|
||||||
|
expression: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log('foo');
|
||||||
|
console.log.apply(console, arguments);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
// with regular compression these will be stripped out as well
|
||||||
|
void 0;
|
||||||
|
void 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_value: {
|
||||||
|
options = {
|
||||||
|
expression: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(1, [2, foo()], 3, {a:1, b:bar()});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
foo(), {a:1, b:bar()};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wrongly_optimized: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
booleans: true,
|
||||||
|
evaluate: true,
|
||||||
|
expression: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function func() {
|
||||||
|
foo();
|
||||||
|
}
|
||||||
|
if (func() || true) {
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function func() {
|
||||||
|
foo();
|
||||||
|
}
|
||||||
|
// TODO: optimize to `func(), bar()`
|
||||||
|
if (func(), 1) bar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_1: {
|
||||||
|
options = {
|
||||||
|
expression: true,
|
||||||
|
negate_iife: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(){ stuff() })();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(){ stuff() })();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_3: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
expression: true,
|
||||||
|
negate_iife: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_3_off: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
expression: true,
|
||||||
|
negate_iife: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_4: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
expression: true,
|
||||||
|
negate_iife: true,
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
|
(function(){
|
||||||
|
console.log("something");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function(){ return t }() ? console.log(false) : console.log(true), function(){
|
||||||
|
console.log("something");
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_5: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
expression: true,
|
||||||
|
negate_iife: true,
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if ((function(){ return t })()) {
|
||||||
|
foo(true);
|
||||||
|
} else {
|
||||||
|
bar(false);
|
||||||
|
}
|
||||||
|
(function(){
|
||||||
|
console.log("something");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function(){ return t }() ? bar(false) : foo(true), function(){
|
||||||
|
console.log("something");
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_5_off: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
expression: true,
|
||||||
|
negate_iife: false,
|
||||||
|
sequences: true,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
if ((function(){ return t })()) {
|
||||||
|
foo(true);
|
||||||
|
} else {
|
||||||
|
bar(false);
|
||||||
|
}
|
||||||
|
(function(){
|
||||||
|
console.log("something");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function(){ return t }() ? bar(false) : foo(true), function(){
|
||||||
|
console.log("something");
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1254_negate_iife_true: {
|
||||||
|
options = {
|
||||||
|
expression: true,
|
||||||
|
negate_iife: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
return function() {
|
||||||
|
console.log('test')
|
||||||
|
};
|
||||||
|
})()();
|
||||||
|
}
|
||||||
|
expect_exact: '(function(){return function(){console.log("test")}})()();'
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1254_negate_iife_nested: {
|
||||||
|
options = {
|
||||||
|
expression: true,
|
||||||
|
negate_iife: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
return function() {
|
||||||
|
console.log('test')
|
||||||
|
};
|
||||||
|
})()()()()();
|
||||||
|
}
|
||||||
|
expect_exact: '(function(){return function(){console.log("test")}})()()()()();'
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
conditional: {
|
||||||
|
options = {
|
||||||
|
expression: true,
|
||||||
|
pure_funcs: [ "pure" ],
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
pure(1 | a() ? 2 & b() : 7 ^ c());
|
||||||
|
pure(1 | a() ? 2 & b() : 5);
|
||||||
|
pure(1 | a() ? 4 : 7 ^ c());
|
||||||
|
pure(1 | a() ? 4 : 5);
|
||||||
|
pure(3 ? 2 & b() : 7 ^ c());
|
||||||
|
pure(3 ? 2 & b() : 5);
|
||||||
|
pure(3 ? 4 : 7 ^ c());
|
||||||
|
pure(3 ? 4 : 5);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
1 | a() ? b() : c();
|
||||||
|
1 | a() && b();
|
||||||
|
1 | a() || c();
|
||||||
|
a();
|
||||||
|
3 ? b() : c();
|
||||||
|
3 && b();
|
||||||
|
3 || c();
|
||||||
|
pure(3 ? 4 : 5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
limit_1: {
|
||||||
|
options = {
|
||||||
|
expression: true,
|
||||||
|
sequences: 3,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
a;
|
||||||
|
b;
|
||||||
|
c;
|
||||||
|
d;
|
||||||
|
e;
|
||||||
|
f;
|
||||||
|
g;
|
||||||
|
h;
|
||||||
|
i;
|
||||||
|
j;
|
||||||
|
k;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
// Turned into a single return statement
|
||||||
|
// so it can no longer be split into lines
|
||||||
|
a,b,c,d,e,f,g,h,i,j,k;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iife: {
|
||||||
|
options = {
|
||||||
|
expression: true,
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
x = 42;
|
||||||
|
(function a() {})();
|
||||||
|
!function b() {}();
|
||||||
|
~function c() {}();
|
||||||
|
+function d() {}();
|
||||||
|
-function e() {}();
|
||||||
|
void function f() {}();
|
||||||
|
typeof function g() {}();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
x = 42, function a() {}(), function b() {}(), function c() {}(),
|
||||||
|
function d() {}(), function e() {}(), function f() {}(), typeof function g() {}();
|
||||||
|
}
|
||||||
|
}
|
||||||
45
test/compress/issue-747.js
Normal file
45
test/compress/issue-747.js
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
dont_reuse_prop: {
|
||||||
|
mangle = {
|
||||||
|
properties: {
|
||||||
|
regex: /asd/,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"aaaaaaaaaabbbbb";
|
||||||
|
var obj = {};
|
||||||
|
obj.a = 123;
|
||||||
|
obj.asd = 256;
|
||||||
|
console.log(obj.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"aaaaaaaaaabbbbb";
|
||||||
|
var obj = {};
|
||||||
|
obj.a = 123;
|
||||||
|
obj.b = 256;
|
||||||
|
console.log(obj.a);
|
||||||
|
}
|
||||||
|
expect_stdout: "123"
|
||||||
|
}
|
||||||
|
|
||||||
|
unmangleable_props_should_always_be_reserved: {
|
||||||
|
mangle = {
|
||||||
|
properties: {
|
||||||
|
regex: /asd/,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
"aaaaaaaaaabbbbb";
|
||||||
|
var obj = {};
|
||||||
|
obj.asd = 256;
|
||||||
|
obj.a = 123;
|
||||||
|
console.log(obj.a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
"aaaaaaaaaabbbbb";
|
||||||
|
var obj = {};
|
||||||
|
obj.b = 256;
|
||||||
|
obj.a = 123;
|
||||||
|
console.log(obj.a);
|
||||||
|
}
|
||||||
|
expect_stdout: "123"
|
||||||
|
}
|
||||||
29
test/compress/issue-751.js
Normal file
29
test/compress/issue-751.js
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
negate_booleans_1: {
|
||||||
|
options = {
|
||||||
|
comparisons: true
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
var a = !a || !b || !c || !d || !e || !f;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a = !(a && b && c && d && e && f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_booleans_2: {
|
||||||
|
options = {
|
||||||
|
comparisons: true
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
var match = !x && // should not touch this one
|
||||||
|
(!z || c) &&
|
||||||
|
(!k || d) &&
|
||||||
|
the_stuff();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var match = !x &&
|
||||||
|
(!z || c) &&
|
||||||
|
(!k || d) &&
|
||||||
|
the_stuff();
|
||||||
|
}
|
||||||
|
}
|
||||||
27
test/compress/issue-782.js
Normal file
27
test/compress/issue-782.js
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
remove_redundant_sequence_items: {
|
||||||
|
options = { side_effects: true };
|
||||||
|
input: {
|
||||||
|
(0, 1, eval)();
|
||||||
|
(0, 1, logThis)();
|
||||||
|
(0, 1, _decorators.logThis)();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(0, eval)();
|
||||||
|
logThis();
|
||||||
|
(0, _decorators.logThis)();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dont_remove_this_binding_sequence: {
|
||||||
|
options = { side_effects: true };
|
||||||
|
input: {
|
||||||
|
(0, eval)();
|
||||||
|
(0, logThis)();
|
||||||
|
(0, _decorators.logThis)();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(0, eval)();
|
||||||
|
logThis();
|
||||||
|
(0, _decorators.logThis)();
|
||||||
|
}
|
||||||
|
}
|
||||||
32
test/compress/issue-892.js
Normal file
32
test/compress/issue-892.js
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
dont_mangle_arguments: {
|
||||||
|
mangle = {
|
||||||
|
};
|
||||||
|
options = {
|
||||||
|
sequences : true,
|
||||||
|
properties : true,
|
||||||
|
dead_code : true,
|
||||||
|
drop_debugger : true,
|
||||||
|
conditionals : true,
|
||||||
|
comparisons : true,
|
||||||
|
evaluate : true,
|
||||||
|
booleans : true,
|
||||||
|
loops : true,
|
||||||
|
unused : true,
|
||||||
|
hoist_funs : true,
|
||||||
|
keep_fargs : true,
|
||||||
|
keep_fnames : false,
|
||||||
|
hoist_vars : true,
|
||||||
|
if_return : true,
|
||||||
|
join_vars : true,
|
||||||
|
side_effects : true,
|
||||||
|
negate_iife : false
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
(function(){
|
||||||
|
var arguments = arguments, not_arguments = 9;
|
||||||
|
console.log(not_arguments, arguments);
|
||||||
|
})(5,6,7);
|
||||||
|
}
|
||||||
|
expect_exact: "(function(){var arguments=arguments,o=9;console.log(o,arguments)})(5,6,7);"
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
20
test/compress/issue-913.js
Normal file
20
test/compress/issue-913.js
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
keep_var_for_in: {
|
||||||
|
options = {
|
||||||
|
hoist_vars: true,
|
||||||
|
unused: true
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
(function(obj){
|
||||||
|
var foo = 5;
|
||||||
|
for (var i in obj)
|
||||||
|
return foo;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function(obj){
|
||||||
|
var i, foo = 5;
|
||||||
|
for (i in obj)
|
||||||
|
return foo;
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
}
|
||||||
99
test/compress/issue-973.js
Normal file
99
test/compress/issue-973.js
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
this_binding_conditionals: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
side_effects: true,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
(1 && a)();
|
||||||
|
(0 || a)();
|
||||||
|
(0 || 1 && a)();
|
||||||
|
(1 ? a : 0)();
|
||||||
|
|
||||||
|
(1 && a.b)();
|
||||||
|
(0 || a.b)();
|
||||||
|
(0 || 1 && a.b)();
|
||||||
|
(1 ? a.b : 0)();
|
||||||
|
|
||||||
|
(1 && a[b])();
|
||||||
|
(0 || a[b])();
|
||||||
|
(0 || 1 && a[b])();
|
||||||
|
(1 ? a[b] : 0)();
|
||||||
|
|
||||||
|
(1 && eval)();
|
||||||
|
(0 || eval)();
|
||||||
|
(0 || 1 && eval)();
|
||||||
|
(1 ? eval : 0)();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
a();
|
||||||
|
a();
|
||||||
|
a();
|
||||||
|
a();
|
||||||
|
|
||||||
|
(0, a.b)();
|
||||||
|
(0, a.b)();
|
||||||
|
(0, a.b)();
|
||||||
|
(0, a.b)();
|
||||||
|
|
||||||
|
(0, a[b])();
|
||||||
|
(0, a[b])();
|
||||||
|
(0, a[b])();
|
||||||
|
(0, a[b])();
|
||||||
|
|
||||||
|
(0, eval)();
|
||||||
|
(0, eval)();
|
||||||
|
(0, eval)();
|
||||||
|
(0, eval)();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this_binding_collapse_vars: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
var c = a; c();
|
||||||
|
var d = a.b; d();
|
||||||
|
var e = eval; e();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
a();
|
||||||
|
(0, a.b)();
|
||||||
|
(0, eval)();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this_binding_side_effects: {
|
||||||
|
options = {
|
||||||
|
side_effects : true
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
(function (foo) {
|
||||||
|
(0, foo)();
|
||||||
|
(0, foo.bar)();
|
||||||
|
(0, eval)('console.log(foo);');
|
||||||
|
}());
|
||||||
|
(function (foo) {
|
||||||
|
var eval = console;
|
||||||
|
(0, foo)();
|
||||||
|
(0, foo.bar)();
|
||||||
|
(0, eval)('console.log(foo);');
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(function (foo) {
|
||||||
|
foo();
|
||||||
|
(0, foo.bar)();
|
||||||
|
(0, eval)('console.log(foo);');
|
||||||
|
}());
|
||||||
|
(function (foo) {
|
||||||
|
var eval = console;
|
||||||
|
foo();
|
||||||
|
(0, foo.bar)();
|
||||||
|
(0, eval)('console.log(foo);');
|
||||||
|
}());
|
||||||
|
}
|
||||||
|
}
|
||||||
89
test/compress/issue-976.js
Normal file
89
test/compress/issue-976.js
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
eval_collapse_vars: {
|
||||||
|
options = {
|
||||||
|
collapse_vars:true, sequences:false, properties:true, dead_code:true, conditionals:true,
|
||||||
|
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
||||||
|
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
function f1() {
|
||||||
|
var e = 7;
|
||||||
|
var s = "abcdef";
|
||||||
|
var i = 2;
|
||||||
|
var eval = console.log.bind(console);
|
||||||
|
var x = s.charAt(i++);
|
||||||
|
var y = s.charAt(i++);
|
||||||
|
var z = s.charAt(i++);
|
||||||
|
eval(x, y, z, e);
|
||||||
|
}
|
||||||
|
function p1() { var a = foo(), b = bar(), eval = baz(); return a + b + eval; }
|
||||||
|
function p2() { var a = foo(), b = bar(), eval = baz; return a + b + eval(); }
|
||||||
|
(function f2(eval) {
|
||||||
|
var a = 2;
|
||||||
|
console.log(a - 5);
|
||||||
|
eval("console.log(a);");
|
||||||
|
})(eval);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f1() {
|
||||||
|
var e = 7,
|
||||||
|
s = "abcdef",
|
||||||
|
i = 2,
|
||||||
|
eval = console.log.bind(console),
|
||||||
|
x = s.charAt(i++),
|
||||||
|
y = s.charAt(i++),
|
||||||
|
z = s.charAt(i++);
|
||||||
|
eval(x, y, z, e);
|
||||||
|
}
|
||||||
|
function p1() { return foo() + bar() + baz(); }
|
||||||
|
function p2() { var a = foo(), b = bar(), eval = baz; return a + b + eval(); }
|
||||||
|
(function f2(eval) {
|
||||||
|
var a = 2;
|
||||||
|
console.log(a - 5);
|
||||||
|
eval("console.log(a);");
|
||||||
|
})(eval);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
eval_unused: {
|
||||||
|
options = { unused: true, keep_fargs: false };
|
||||||
|
input: {
|
||||||
|
function f1(a, eval, c, d, e) {
|
||||||
|
return a('c') + eval;
|
||||||
|
}
|
||||||
|
function f2(a, b, c, d, e) {
|
||||||
|
return a + eval('c');
|
||||||
|
}
|
||||||
|
function f3(a, eval, c, d, e) {
|
||||||
|
return a + eval('c');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f1(a, eval) {
|
||||||
|
return a('c') + eval;
|
||||||
|
}
|
||||||
|
function f2(a, b, c, d, e) {
|
||||||
|
return a + eval('c');
|
||||||
|
}
|
||||||
|
function f3(a, eval, c, d, e) {
|
||||||
|
return a + eval('c');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
eval_mangle: {
|
||||||
|
mangle = {
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
function f1(a, eval, c, d, e) {
|
||||||
|
return a('c') + eval;
|
||||||
|
}
|
||||||
|
function f2(a, b, c, d, e) {
|
||||||
|
return a + eval('c');
|
||||||
|
}
|
||||||
|
function f3(a, eval, c, d, e) {
|
||||||
|
return a + eval('c');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: 'function f1(n,c,e,a,f){return n("c")+c}function f2(a,b,c,d,e){return a+eval("c")}function f3(a,eval,c,d,e){return a+eval("c")}'
|
||||||
|
}
|
||||||
89
test/compress/issue-979.js
Normal file
89
test/compress/issue-979.js
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
issue979_reported: {
|
||||||
|
options = {
|
||||||
|
sequences:true, properties:true, dead_code:true, conditionals:true,
|
||||||
|
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
||||||
|
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f1() {
|
||||||
|
if (a == 1 || b == 2) {
|
||||||
|
foo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function f2() {
|
||||||
|
if (!(a == 1 || b == 2)) {
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
foo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f1() {
|
||||||
|
1!=a&&2!=b||foo();
|
||||||
|
}
|
||||||
|
function f2() {
|
||||||
|
1!=a&&2!=b||foo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue979_test_negated_is_best: {
|
||||||
|
options = {
|
||||||
|
sequences:true, properties:true, dead_code:true, conditionals:true,
|
||||||
|
comparisons:true, evaluate:true, booleans:true, loops:true, unused:true, hoist_funs:true,
|
||||||
|
keep_fargs:true, if_return:true, join_vars:true, side_effects:true
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f3() {
|
||||||
|
if (a == 1 | b == 2) {
|
||||||
|
foo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function f4() {
|
||||||
|
if (!(a == 1 | b == 2)) {
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
foo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function f5() {
|
||||||
|
if (a == 1 && b == 2) {
|
||||||
|
foo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function f6() {
|
||||||
|
if (!(a == 1 && b == 2)) {
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
foo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function f7() {
|
||||||
|
if (a == 1 || b == 2) {
|
||||||
|
foo();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return bar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f3() {
|
||||||
|
1==a|2==b&&foo();
|
||||||
|
}
|
||||||
|
function f4() {
|
||||||
|
1==a|2==b&&foo();
|
||||||
|
}
|
||||||
|
function f5() {
|
||||||
|
1==a&&2==b&&foo();
|
||||||
|
}
|
||||||
|
function f6() {
|
||||||
|
1!=a||2!=b||foo();
|
||||||
|
}
|
||||||
|
function f7() {
|
||||||
|
if(1!=a&&2!=b)return bar();foo()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -9,6 +9,7 @@ labels_1: {
|
|||||||
expect: {
|
expect: {
|
||||||
foo || console.log("bar");
|
foo || console.log("bar");
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
labels_2: {
|
labels_2: {
|
||||||
@@ -40,6 +41,7 @@ labels_3: {
|
|||||||
for (var i = 0; i < 5; ++i)
|
for (var i = 0; i < 5; ++i)
|
||||||
i < 3 || console.log(i);
|
i < 3 || console.log(i);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
labels_4: {
|
labels_4: {
|
||||||
@@ -54,6 +56,7 @@ labels_4: {
|
|||||||
for (var i = 0; i < 5; ++i)
|
for (var i = 0; i < 5; ++i)
|
||||||
i < 3 || console.log(i);
|
i < 3 || console.log(i);
|
||||||
}
|
}
|
||||||
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
labels_5: {
|
labels_5: {
|
||||||
|
|||||||
@@ -121,3 +121,504 @@ drop_if_else_break_4: {
|
|||||||
for (; bar() && (x(), y(), foo());) baz(), z(), k();
|
for (; bar() && (x(), y(), foo());) baz(), z(), k();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
parse_do_while_with_semicolon: {
|
||||||
|
options = { loops: false };
|
||||||
|
input: {
|
||||||
|
do {
|
||||||
|
x();
|
||||||
|
} while (false);y()
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
do x(); while (false);y();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
parse_do_while_without_semicolon: {
|
||||||
|
options = { loops: false };
|
||||||
|
input: {
|
||||||
|
do {
|
||||||
|
x();
|
||||||
|
} while (false)y()
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
do x(); while (false);y();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
evaluate: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
loops: true,
|
||||||
|
passes: 2,
|
||||||
|
side_effects: true,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
while (true) {
|
||||||
|
a();
|
||||||
|
}
|
||||||
|
while (false) {
|
||||||
|
b();
|
||||||
|
}
|
||||||
|
do {
|
||||||
|
c();
|
||||||
|
} while (true);
|
||||||
|
do {
|
||||||
|
d();
|
||||||
|
} while (false);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for(;;)
|
||||||
|
a();
|
||||||
|
for(;;)
|
||||||
|
c();
|
||||||
|
d();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1532: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(x, y) {
|
||||||
|
do {
|
||||||
|
if (x) break;
|
||||||
|
foo();
|
||||||
|
} while (false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(x, y) {
|
||||||
|
do {
|
||||||
|
if (x) break;
|
||||||
|
foo();
|
||||||
|
} while (false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_186: {
|
||||||
|
beautify = {
|
||||||
|
beautify: false,
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var x = 3;
|
||||||
|
if (foo())
|
||||||
|
do
|
||||||
|
do
|
||||||
|
alert(x);
|
||||||
|
while (--x);
|
||||||
|
while (x);
|
||||||
|
else
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
expect_exact: 'var x=3;if(foo())do{do{alert(x)}while(--x)}while(x);else bar();'
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_186_ie8: {
|
||||||
|
beautify = {
|
||||||
|
beautify: false,
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var x = 3;
|
||||||
|
if (foo())
|
||||||
|
do
|
||||||
|
do
|
||||||
|
alert(x);
|
||||||
|
while (--x);
|
||||||
|
while (x);
|
||||||
|
else
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
expect_exact: 'var x=3;if(foo()){do{do{alert(x)}while(--x)}while(x)}else bar();'
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_186_beautify: {
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var x = 3;
|
||||||
|
if (foo())
|
||||||
|
do
|
||||||
|
do
|
||||||
|
alert(x);
|
||||||
|
while (--x);
|
||||||
|
while (x);
|
||||||
|
else
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
'var x = 3;',
|
||||||
|
'',
|
||||||
|
'if (foo()) do {',
|
||||||
|
' do {',
|
||||||
|
' alert(x);',
|
||||||
|
' } while (--x);',
|
||||||
|
'} while (x); else bar();',
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_186_beautify_ie8: {
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var x = 3;
|
||||||
|
if (foo())
|
||||||
|
do
|
||||||
|
do
|
||||||
|
alert(x);
|
||||||
|
while (--x);
|
||||||
|
while (x);
|
||||||
|
else
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
'var x = 3;',
|
||||||
|
'',
|
||||||
|
'if (foo()) {',
|
||||||
|
' do {',
|
||||||
|
' do {',
|
||||||
|
' alert(x);',
|
||||||
|
' } while (--x);',
|
||||||
|
' } while (x);',
|
||||||
|
'} else bar();',
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_186_braces: {
|
||||||
|
beautify = {
|
||||||
|
beautify: false,
|
||||||
|
braces: true,
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var x = 3;
|
||||||
|
if (foo())
|
||||||
|
do
|
||||||
|
do
|
||||||
|
alert(x);
|
||||||
|
while (--x);
|
||||||
|
while (x);
|
||||||
|
else
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
expect_exact: 'var x=3;if(foo()){do{do{alert(x)}while(--x)}while(x)}else{bar()}'
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_186_braces_ie8: {
|
||||||
|
beautify = {
|
||||||
|
beautify: false,
|
||||||
|
braces: true,
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var x = 3;
|
||||||
|
if (foo())
|
||||||
|
do
|
||||||
|
do
|
||||||
|
alert(x);
|
||||||
|
while (--x);
|
||||||
|
while (x);
|
||||||
|
else
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
expect_exact: 'var x=3;if(foo()){do{do{alert(x)}while(--x)}while(x)}else{bar()}'
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_186_beautify_braces: {
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
braces: true,
|
||||||
|
ie8: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var x = 3;
|
||||||
|
if (foo())
|
||||||
|
do
|
||||||
|
do
|
||||||
|
alert(x);
|
||||||
|
while (--x);
|
||||||
|
while (x);
|
||||||
|
else
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
'var x = 3;',
|
||||||
|
'',
|
||||||
|
'if (foo()) {',
|
||||||
|
' do {',
|
||||||
|
' do {',
|
||||||
|
' alert(x);',
|
||||||
|
' } while (--x);',
|
||||||
|
' } while (x);',
|
||||||
|
'} else {',
|
||||||
|
' bar();',
|
||||||
|
'}',
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_186_beautify_braces_ie8: {
|
||||||
|
beautify = {
|
||||||
|
beautify: true,
|
||||||
|
braces: true,
|
||||||
|
ie8: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var x = 3;
|
||||||
|
if (foo())
|
||||||
|
do
|
||||||
|
do
|
||||||
|
alert(x);
|
||||||
|
while (--x);
|
||||||
|
while (x);
|
||||||
|
else
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
'var x = 3;',
|
||||||
|
'',
|
||||||
|
'if (foo()) {',
|
||||||
|
' do {',
|
||||||
|
' do {',
|
||||||
|
' alert(x);',
|
||||||
|
' } while (--x);',
|
||||||
|
' } while (x);',
|
||||||
|
'} else {',
|
||||||
|
' bar();',
|
||||||
|
'}',
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1648: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
loops: true,
|
||||||
|
passes: 2,
|
||||||
|
sequences: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
x();
|
||||||
|
var b = 1;
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: "function f(){for(x();1;);}"
|
||||||
|
}
|
||||||
|
|
||||||
|
do_switch: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
do {
|
||||||
|
switch (a) {
|
||||||
|
case b:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} while (false);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
do {
|
||||||
|
switch (a) {
|
||||||
|
case b:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} while (false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
in_parenthesis_1: {
|
||||||
|
input: {
|
||||||
|
for (("foo" in {});0;);
|
||||||
|
}
|
||||||
|
expect_exact: 'for(("foo"in{});0;);'
|
||||||
|
}
|
||||||
|
|
||||||
|
in_parenthesis_2: {
|
||||||
|
input: {
|
||||||
|
for ((function(){ "foo" in {}; });0;);
|
||||||
|
}
|
||||||
|
expect_exact: 'for(function(){"foo"in{}};0;);'
|
||||||
|
}
|
||||||
|
|
||||||
|
init_side_effects: {
|
||||||
|
options = {
|
||||||
|
loops: true,
|
||||||
|
side_effects: true,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
for (function() {}(), i = 0; i < 5; i++) console.log(i);
|
||||||
|
for (function() {}(); i < 10; i++) console.log(i);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for (i = 0; i < 5; i++) console.log(i);
|
||||||
|
for (; i < 10; i++) console.log(i);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
dead_code_condition: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
evaluate: true,
|
||||||
|
loops: true,
|
||||||
|
sequences: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
for (var a = 0, b = 5; (a += 1, 3) - 3 && b > 0; b--) {
|
||||||
|
var c = function() {
|
||||||
|
b--;
|
||||||
|
}(a++);
|
||||||
|
}
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var c;
|
||||||
|
var a = 0, b = 5;
|
||||||
|
a += 1, 0,
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2740_1: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
for (; ; ) break;
|
||||||
|
for (a(); ; ) break;
|
||||||
|
for (; b(); ) break;
|
||||||
|
for (c(); d(); ) break;
|
||||||
|
for (; ; e()) break;
|
||||||
|
for (f(); ; g()) break;
|
||||||
|
for (; h(); i()) break;
|
||||||
|
for (j(); k(); l()) break;
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
a();
|
||||||
|
b();
|
||||||
|
c();
|
||||||
|
d();
|
||||||
|
f();
|
||||||
|
h();
|
||||||
|
j();
|
||||||
|
k();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2740_2: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
loops: true,
|
||||||
|
passes: 2,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
L1: while (x()) {
|
||||||
|
break L1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
x();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2740_3: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
L1: for (var x = 0; x < 3; x++) {
|
||||||
|
L2: for (var y = 0; y < 2; y++) {
|
||||||
|
break L1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(x, y);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
L1: for (var x = 0; x < 3; x++)
|
||||||
|
for (var y = 0; y < 2; y++)
|
||||||
|
break L1;
|
||||||
|
console.log(x, y);
|
||||||
|
}
|
||||||
|
expect_stdout: "0 0"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2740_4: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
loops: true,
|
||||||
|
passes: 2,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
L1: for (var x = 0; x < 3; x++) {
|
||||||
|
L2: for (var y = 0; y < 2; y++) {
|
||||||
|
break L2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(x, y);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for (var x = 0; x < 3; x++) {
|
||||||
|
var y = 0;
|
||||||
|
y < 2;
|
||||||
|
}
|
||||||
|
console.log(x, y);
|
||||||
|
}
|
||||||
|
expect_stdout: "3 0"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2740_5: {
|
||||||
|
options = {
|
||||||
|
dead_code: true,
|
||||||
|
loops: true,
|
||||||
|
passes: 2,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
L1: for (var x = 0; x < 3; x++) {
|
||||||
|
break L1;
|
||||||
|
L2: for (var y = 0; y < 2; y++) {
|
||||||
|
break L2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(x, y);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var x = 0;
|
||||||
|
x < 3;
|
||||||
|
var y;
|
||||||
|
console.log(x,y);
|
||||||
|
}
|
||||||
|
expect_stdout: "0 undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2904: {
|
||||||
|
options = {
|
||||||
|
join_vars: true,
|
||||||
|
loops: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = 1;
|
||||||
|
do {
|
||||||
|
console.log(a);
|
||||||
|
} while (--a);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
for (var a = 1; console.log(a), --a;);
|
||||||
|
}
|
||||||
|
expect_stdout: "1"
|
||||||
|
}
|
||||||
|
|||||||
39
test/compress/max_line_len.js
Normal file
39
test/compress/max_line_len.js
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
too_short: {
|
||||||
|
beautify = {
|
||||||
|
max_line_len: 10,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
return { c: 42, d: a(), e: "foo"};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
'function f(a){',
|
||||||
|
'return{',
|
||||||
|
'c:42,',
|
||||||
|
'd:a(),',
|
||||||
|
'e:"foo"}}',
|
||||||
|
]
|
||||||
|
expect_warnings: [
|
||||||
|
"WARN: Output exceeds 10 characters"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
just_enough: {
|
||||||
|
beautify = {
|
||||||
|
max_line_len: 14,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a) {
|
||||||
|
return { c: 42, d: a(), e: "foo"};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
'function f(a){',
|
||||||
|
'return{c:42,',
|
||||||
|
'd:a(),e:"foo"}',
|
||||||
|
'}',
|
||||||
|
]
|
||||||
|
expect_warnings: [
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -10,56 +10,173 @@ negate_iife_1: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
negate_iife_2: {
|
negate_iife_1_off: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: true
|
negate_iife: false,
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
(function(){ return {} })().x = 10; // should not transform this one
|
(function(){ stuff() })();
|
||||||
}
|
}
|
||||||
expect: {
|
expect_exact: '(function(){stuff()})();'
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_2: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
negate_iife: true,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
(function(){ return {} })().x = 10;
|
(function(){ return {} })().x = 10;
|
||||||
}
|
}
|
||||||
|
expect_exact: "({}).x=10;"
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_2_side_effects: {
|
||||||
|
options = {
|
||||||
|
inline: true,
|
||||||
|
negate_iife: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(){ return {} })().x = 10;
|
||||||
|
}
|
||||||
|
expect_exact: "({}).x=10;"
|
||||||
}
|
}
|
||||||
|
|
||||||
negate_iife_3: {
|
negate_iife_3: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
|
conditionals: true
|
||||||
};
|
};
|
||||||
|
input: {
|
||||||
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function(){ return t }() ? console.log(false) : console.log(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_3_evaluate: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
negate_iife: true,
|
||||||
|
}
|
||||||
input: {
|
input: {
|
||||||
(function(){ return true })() ? console.log(true) : console.log(false);
|
(function(){ return true })() ? console.log(true) : console.log(false);
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
!function(){ return true }() ? console.log(false) : console.log(true);
|
true, console.log(true);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_3_side_effects: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
negate_iife: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function(){ return t }() ? console.log(false) : console.log(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
negate_iife_3: {
|
negate_iife_3_off: {
|
||||||
|
options = {
|
||||||
|
negate_iife: false,
|
||||||
|
conditionals: true,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function(){ return t }() ? console.log(false) : console.log(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_3_off_evaluate: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
evaluate: true,
|
||||||
|
inline: true,
|
||||||
|
negate_iife: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function(){ return true })() ? console.log(true) : console.log(false);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
true, console.log(true);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_4: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
|
conditionals: true,
|
||||||
sequences: true
|
sequences: true
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
(function(){ return true })() ? console.log(true) : console.log(false);
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
(function(){
|
(function(){
|
||||||
console.log("something");
|
console.log("something");
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
!function(){ return true }() ? console.log(false) : console.log(true), function(){
|
!function(){ return t }() ? console.log(false) : console.log(true), function(){
|
||||||
console.log("something");
|
console.log("something");
|
||||||
}();
|
}();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
negate_iife_4: {
|
sequence_off: {
|
||||||
|
options = {
|
||||||
|
negate_iife: false,
|
||||||
|
conditionals: true,
|
||||||
|
sequences: true,
|
||||||
|
passes: 2,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
function f() {
|
||||||
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
|
(function(){
|
||||||
|
console.log("something");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
function g() {
|
||||||
|
(function(){
|
||||||
|
console.log("something");
|
||||||
|
})();
|
||||||
|
(function(){ return t })() ? console.log(true) : console.log(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f() {
|
||||||
|
!function(){ return t }() ? console.log(false) : console.log(true), function(){
|
||||||
|
console.log("something");
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
function g() {
|
||||||
|
(function(){
|
||||||
|
console.log("something");
|
||||||
|
})(), function(){ return t }() ? console.log(true) : console.log(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_5: {
|
||||||
options = {
|
options = {
|
||||||
negate_iife: true,
|
negate_iife: true,
|
||||||
sequences: true,
|
sequences: true,
|
||||||
conditionals: true,
|
conditionals: true,
|
||||||
};
|
};
|
||||||
input: {
|
input: {
|
||||||
if ((function(){ return true })()) {
|
if ((function(){ return t })()) {
|
||||||
foo(true);
|
foo(true);
|
||||||
} else {
|
} else {
|
||||||
bar(false);
|
bar(false);
|
||||||
@@ -69,8 +186,233 @@ negate_iife_4: {
|
|||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
!function(){ return true }() ? bar(false) : foo(true), function(){
|
!function(){ return t }() ? bar(false) : foo(true), function(){
|
||||||
console.log("something");
|
console.log("something");
|
||||||
}();
|
}();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
negate_iife_5_off: {
|
||||||
|
options = {
|
||||||
|
negate_iife: false,
|
||||||
|
sequences: true,
|
||||||
|
conditionals: true,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
if ((function(){ return t })()) {
|
||||||
|
foo(true);
|
||||||
|
} else {
|
||||||
|
bar(false);
|
||||||
|
}
|
||||||
|
(function(){
|
||||||
|
console.log("something");
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
!function(){ return t }() ? bar(false) : foo(true), function(){
|
||||||
|
console.log("something");
|
||||||
|
}();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_nested: {
|
||||||
|
options = {
|
||||||
|
negate_iife: true,
|
||||||
|
sequences: true,
|
||||||
|
conditionals: true,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
function Foo(f) {
|
||||||
|
this.f = f;
|
||||||
|
}
|
||||||
|
new Foo(function() {
|
||||||
|
(function(x) {
|
||||||
|
(function(y) {
|
||||||
|
console.log(y);
|
||||||
|
})(x);
|
||||||
|
})(7);
|
||||||
|
}).f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function Foo(f) {
|
||||||
|
this.f = f;
|
||||||
|
}
|
||||||
|
new Foo(function() {
|
||||||
|
!function(x) {
|
||||||
|
!function(y) {
|
||||||
|
console.log(y);
|
||||||
|
}(x);
|
||||||
|
}(7);
|
||||||
|
}).f();
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_nested_off: {
|
||||||
|
options = {
|
||||||
|
negate_iife: false,
|
||||||
|
sequences: true,
|
||||||
|
conditionals: true,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
function Foo(f) {
|
||||||
|
this.f = f;
|
||||||
|
}
|
||||||
|
new Foo(function() {
|
||||||
|
(function(x) {
|
||||||
|
(function(y) {
|
||||||
|
console.log(y);
|
||||||
|
})(x);
|
||||||
|
})(7);
|
||||||
|
}).f();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function Foo(f) {
|
||||||
|
this.f = f;
|
||||||
|
}
|
||||||
|
new Foo(function() {
|
||||||
|
(function(x) {
|
||||||
|
(function(y) {
|
||||||
|
console.log(y);
|
||||||
|
})(x);
|
||||||
|
})(7);
|
||||||
|
}).f();
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
negate_iife_issue_1073: {
|
||||||
|
options = {
|
||||||
|
negate_iife: true,
|
||||||
|
sequences: true,
|
||||||
|
conditionals: true,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
new (function(a) {
|
||||||
|
return function Foo() {
|
||||||
|
this.x = a;
|
||||||
|
console.log(this);
|
||||||
|
};
|
||||||
|
}(7))();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
new (function(a) {
|
||||||
|
return function Foo() {
|
||||||
|
this.x = a,
|
||||||
|
console.log(this);
|
||||||
|
};
|
||||||
|
}(7))();
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1254_negate_iife_false: {
|
||||||
|
options = {
|
||||||
|
negate_iife: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
return function() {
|
||||||
|
console.log('test')
|
||||||
|
};
|
||||||
|
})()();
|
||||||
|
}
|
||||||
|
expect_exact: '(function(){return function(){console.log("test")}})()();'
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1254_negate_iife_true: {
|
||||||
|
options = {
|
||||||
|
negate_iife: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
return function() {
|
||||||
|
console.log('test')
|
||||||
|
};
|
||||||
|
})()();
|
||||||
|
}
|
||||||
|
expect_exact: '!function(){return function(){console.log("test")}}()();'
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1254_negate_iife_nested: {
|
||||||
|
options = {
|
||||||
|
negate_iife: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(function() {
|
||||||
|
return function() {
|
||||||
|
console.log('test')
|
||||||
|
};
|
||||||
|
})()()()()();
|
||||||
|
}
|
||||||
|
expect_exact: '!function(){return function(){console.log("test")}}()()()()();'
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1288: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
negate_iife: true,
|
||||||
|
side_effects: false,
|
||||||
|
};
|
||||||
|
input: {
|
||||||
|
if (w) ;
|
||||||
|
else {
|
||||||
|
(function f() {})();
|
||||||
|
}
|
||||||
|
if (!x) {
|
||||||
|
(function() {
|
||||||
|
x = {};
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
if (y)
|
||||||
|
(function() {})();
|
||||||
|
else
|
||||||
|
(function(z) {
|
||||||
|
return z;
|
||||||
|
})(0);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
w || !function f() {}();
|
||||||
|
x || !function() {
|
||||||
|
x = {};
|
||||||
|
}();
|
||||||
|
y ? !function() {}() : !function(z) {
|
||||||
|
return z;
|
||||||
|
}(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1288_side_effects: {
|
||||||
|
options = {
|
||||||
|
conditionals: true,
|
||||||
|
negate_iife: true,
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
if (w) ;
|
||||||
|
else {
|
||||||
|
(function f() {})();
|
||||||
|
}
|
||||||
|
if (!x) {
|
||||||
|
(function() {
|
||||||
|
x = {};
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
if (y)
|
||||||
|
(function() {})();
|
||||||
|
else
|
||||||
|
(function(z) {
|
||||||
|
return z;
|
||||||
|
})(0);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
w;
|
||||||
|
x || function() {
|
||||||
|
x = {};
|
||||||
|
}();
|
||||||
|
y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
100
test/compress/new.js
Normal file
100
test/compress/new.js
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
new_statement: {
|
||||||
|
input: {
|
||||||
|
new x(1);
|
||||||
|
new x(1)(2);
|
||||||
|
new x(1)(2)(3);
|
||||||
|
new new x(1);
|
||||||
|
new new x(1)(2);
|
||||||
|
new (new x(1))(2);
|
||||||
|
(new new x(1))(2);
|
||||||
|
}
|
||||||
|
expect_exact: "new x(1);new x(1)(2);new x(1)(2)(3);new new x(1);new new x(1)(2);new new x(1)(2);(new new x(1))(2);"
|
||||||
|
}
|
||||||
|
|
||||||
|
new_statements_2: {
|
||||||
|
input: {
|
||||||
|
new x;
|
||||||
|
new new x;
|
||||||
|
new new new x;
|
||||||
|
new true;
|
||||||
|
new (0);
|
||||||
|
new (!0);
|
||||||
|
new (bar = function(foo) {this.foo=foo;})(123);
|
||||||
|
new (bar = function(foo) {this.foo=foo;})();
|
||||||
|
}
|
||||||
|
expect_exact: "new x;new(new x);new(new(new x));new true;new 0;new(!0);new(bar=function(foo){this.foo=foo})(123);new(bar=function(foo){this.foo=foo});"
|
||||||
|
}
|
||||||
|
|
||||||
|
new_statements_3: {
|
||||||
|
input: {
|
||||||
|
new (function(foo){this.foo=foo;})(1);
|
||||||
|
new (function(foo){this.foo=foo;})();
|
||||||
|
new (function test(foo){this.foo=foo;})(1);
|
||||||
|
new (function test(foo){this.foo=foo;})();
|
||||||
|
}
|
||||||
|
expect_exact: "new function(foo){this.foo=foo}(1);new function(foo){this.foo=foo};new function test(foo){this.foo=foo}(1);new function test(foo){this.foo=foo};"
|
||||||
|
}
|
||||||
|
|
||||||
|
new_with_rewritten_true_value: {
|
||||||
|
options = { booleans: true }
|
||||||
|
input: {
|
||||||
|
new true;
|
||||||
|
}
|
||||||
|
expect_exact: "new(!0);"
|
||||||
|
}
|
||||||
|
|
||||||
|
new_with_many_parameters: {
|
||||||
|
input: {
|
||||||
|
new foo.bar("baz");
|
||||||
|
new x(/123/, 456);
|
||||||
|
}
|
||||||
|
expect_exact: 'new foo.bar("baz");new x(/123/,456);'
|
||||||
|
}
|
||||||
|
|
||||||
|
new_constructor_with_unary_arguments: {
|
||||||
|
input: {
|
||||||
|
new x();
|
||||||
|
new x(-1);
|
||||||
|
new x(-1, -2);
|
||||||
|
new x(void 1, +2, -3, ~4, !5, --a, ++b, c--, d++, typeof e, delete f);
|
||||||
|
new (-1); // should parse despite being invalid at runtime.
|
||||||
|
new (-1)(); // should parse despite being invalid at runtime.
|
||||||
|
new (-1)(-2); // should parse despite being invalid at runtime.
|
||||||
|
}
|
||||||
|
expect_exact: "new x;new x(-1);new x(-1,-2);new x(void 1,+2,-3,~4,!5,--a,++b,c--,d++,typeof e,delete f);new(-1);new(-1);new(-1)(-2);"
|
||||||
|
}
|
||||||
|
|
||||||
|
call_with_unary_arguments: {
|
||||||
|
input: {
|
||||||
|
x();
|
||||||
|
x(-1);
|
||||||
|
x(-1, -2);
|
||||||
|
x(void 1, +2, -3, ~4, !5, --a, ++b, c--, d++, typeof e, delete f);
|
||||||
|
(-1)(); // should parse despite being invalid at runtime.
|
||||||
|
(-1)(-2); // should parse despite being invalid at runtime.
|
||||||
|
}
|
||||||
|
expect_exact: "x();x(-1);x(-1,-2);x(void 1,+2,-3,~4,!5,--a,++b,c--,d++,typeof e,delete f);(-1)();(-1)(-2);"
|
||||||
|
}
|
||||||
|
|
||||||
|
new_with_unary_prefix: {
|
||||||
|
input: {
|
||||||
|
var bar = (+new Date()).toString(32);
|
||||||
|
}
|
||||||
|
expect_exact: 'var bar=(+new Date).toString(32);';
|
||||||
|
}
|
||||||
|
|
||||||
|
dot_parenthesis_1: {
|
||||||
|
input: {
|
||||||
|
console.log(new (Math.random().constructor) instanceof Number);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(new(Math.random().constructor)instanceof Number);"
|
||||||
|
expect_stdout: "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
dot_parenthesis_2: {
|
||||||
|
input: {
|
||||||
|
console.log(typeof new function(){Math.random()}.constructor);
|
||||||
|
}
|
||||||
|
expect_exact: "console.log(typeof new function(){Math.random()}.constructor);"
|
||||||
|
expect_stdout: "function"
|
||||||
|
}
|
||||||
38
test/compress/node_version.js
Normal file
38
test/compress/node_version.js
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
eval_let_6: {
|
||||||
|
input: {
|
||||||
|
eval("let a;");
|
||||||
|
console.log();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
eval("let a;");
|
||||||
|
console.log();
|
||||||
|
}
|
||||||
|
expect_stdout: ""
|
||||||
|
node_version: ">=6"
|
||||||
|
}
|
||||||
|
|
||||||
|
eval_let_4: {
|
||||||
|
input: {
|
||||||
|
eval("let a;");
|
||||||
|
console.log();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
eval("let a;");
|
||||||
|
console.log();
|
||||||
|
}
|
||||||
|
expect_stdout: SyntaxError("Block-scoped declarations (let, const, function, class) not yet supported outside strict mode")
|
||||||
|
node_version: "4"
|
||||||
|
}
|
||||||
|
|
||||||
|
eval_let_0: {
|
||||||
|
input: {
|
||||||
|
eval("let a;");
|
||||||
|
console.log();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
eval("let a;");
|
||||||
|
console.log();
|
||||||
|
}
|
||||||
|
expect_stdout: SyntaxError("Unexpected identifier")
|
||||||
|
node_version: "<=0.12"
|
||||||
|
}
|
||||||
204
test/compress/numbers.js
Normal file
204
test/compress/numbers.js
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
hex_numbers_in_parentheses_for_prototype_functions: {
|
||||||
|
input: {
|
||||||
|
(-2);
|
||||||
|
(-2).toFixed(0);
|
||||||
|
|
||||||
|
(2);
|
||||||
|
(2).toFixed(0);
|
||||||
|
|
||||||
|
(0.2);
|
||||||
|
(0.2).toFixed(0);
|
||||||
|
|
||||||
|
(0.00000002);
|
||||||
|
(0.00000002).toFixed(0);
|
||||||
|
|
||||||
|
(1000000000000000128);
|
||||||
|
(1000000000000000128).toFixed(0);
|
||||||
|
}
|
||||||
|
expect_exact: "-2;(-2).toFixed(0);2;2..toFixed(0);.2;.2.toFixed(0);2e-8;2e-8.toFixed(0);0xde0b6b3a7640080;(0xde0b6b3a7640080).toFixed(0);"
|
||||||
|
}
|
||||||
|
|
||||||
|
comparisons: {
|
||||||
|
options = {
|
||||||
|
comparisons: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(
|
||||||
|
~x === 42,
|
||||||
|
x % n === 42
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(
|
||||||
|
42 == ~x,
|
||||||
|
x % n == 42
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
evaluate_1: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe_math: false,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(
|
||||||
|
x + 1 + 2,
|
||||||
|
x * 1 * 2,
|
||||||
|
+x + 1 + 2,
|
||||||
|
1 + x + 2 + 3,
|
||||||
|
1 | x | 2 | 3,
|
||||||
|
1 + x-- + 2 + 3,
|
||||||
|
1 + (x*y + 2) + 3,
|
||||||
|
1 + (2 + x + 3),
|
||||||
|
1 + (2 + ~x + 3),
|
||||||
|
-y + (2 + ~x + 3),
|
||||||
|
1 & (2 & x & 3),
|
||||||
|
1 + (2 + (x |= 0) + 3)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(
|
||||||
|
x + 1 + 2,
|
||||||
|
1 * x * 2,
|
||||||
|
+x + 1 + 2,
|
||||||
|
1 + x + 2 + 3,
|
||||||
|
3 | x,
|
||||||
|
1 + x-- + 2 + 3,
|
||||||
|
x*y + 2 + 1 + 3,
|
||||||
|
1 + (2 + x + 3),
|
||||||
|
2 + ~x + 3 + 1,
|
||||||
|
-y + (2 + ~x + 3),
|
||||||
|
0 & x,
|
||||||
|
2 + (x |= 0) + 3 + 1
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
evaluate_2: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe_math: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(
|
||||||
|
x + 1 + 2,
|
||||||
|
x * 1 * 2,
|
||||||
|
+x + 1 + 2,
|
||||||
|
1 + x + 2 + 3,
|
||||||
|
1 | x | 2 | 3,
|
||||||
|
1 + x-- + 2 + 3,
|
||||||
|
1 + (x*y + 2) + 3,
|
||||||
|
1 + (2 + x + 3),
|
||||||
|
1 & (2 & x & 3),
|
||||||
|
1 + (2 + (x |= 0) + 3)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(
|
||||||
|
x + 1 + 2,
|
||||||
|
2 * x,
|
||||||
|
3 + +x,
|
||||||
|
1 + x + 2 + 3,
|
||||||
|
3 | x,
|
||||||
|
6 + x--,
|
||||||
|
6 + x*y,
|
||||||
|
1 + (2 + x + 3),
|
||||||
|
0 & x,
|
||||||
|
6 + (x |= 0)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
evaluate_3: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
unsafe: true,
|
||||||
|
unsafe_math: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(1 + Number(x) + 2);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(3 + +x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
evaluate_4: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
console.log(
|
||||||
|
1+ +a,
|
||||||
|
+a+1,
|
||||||
|
1+-a,
|
||||||
|
-a+1,
|
||||||
|
+a+ +b,
|
||||||
|
+a+-b,
|
||||||
|
-a+ +b,
|
||||||
|
-a+-b
|
||||||
|
);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
console.log(
|
||||||
|
+a+1,
|
||||||
|
+a+1,
|
||||||
|
1-a,
|
||||||
|
1-a,
|
||||||
|
+a+ +b,
|
||||||
|
+a-b,
|
||||||
|
-a+ +b,
|
||||||
|
-a-b
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_1710: {
|
||||||
|
options = {
|
||||||
|
evaluate: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var x = {};
|
||||||
|
console.log((x += 1) + -x);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var x = {};
|
||||||
|
console.log((x += 1) + -x);
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
|
|
||||||
|
unary_binary_parenthesis: {
|
||||||
|
input: {
|
||||||
|
var v = [ 0, 1, NaN, Infinity, null, undefined, true, false, "", "foo", /foo/ ];
|
||||||
|
v.forEach(function(x) {
|
||||||
|
v.forEach(function(y) {
|
||||||
|
console.log(
|
||||||
|
+(x*y),
|
||||||
|
+(x/y),
|
||||||
|
+(x%y),
|
||||||
|
-(x*y),
|
||||||
|
-(x/y),
|
||||||
|
-(x%y)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var v = [ 0, 1, NaN, 1/0, null, void 0, true, false, "", "foo", /foo/ ];
|
||||||
|
v.forEach(function(x) {
|
||||||
|
v.forEach(function(y) {
|
||||||
|
console.log(
|
||||||
|
+x*y,
|
||||||
|
+x/y,
|
||||||
|
+x%y,
|
||||||
|
-x*y,
|
||||||
|
-x/y,
|
||||||
|
-x%y
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
expect_stdout: true
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
537
test/compress/pure_funcs.js
Normal file
537
test/compress/pure_funcs.js
Normal file
@@ -0,0 +1,537 @@
|
|||||||
|
array: {
|
||||||
|
options = {
|
||||||
|
pure_funcs: [ "Math.floor" ],
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
function f(b) {
|
||||||
|
Math.floor(a / b);
|
||||||
|
Math.floor(c / b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
function f(b) {
|
||||||
|
c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func: {
|
||||||
|
options = {
|
||||||
|
pure_funcs: function(node) {
|
||||||
|
return !~node.args[0].print_to_string().indexOf("a");
|
||||||
|
},
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
Math.floor(a / b);
|
||||||
|
Math.floor(c / b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
Math.floor(c / b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
side_effects: {
|
||||||
|
options = {
|
||||||
|
pure_funcs: [ "console.log" ],
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function f(a, b) {
|
||||||
|
console.log(a());
|
||||||
|
console.log(b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function f(a, b) {
|
||||||
|
a();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unused: {
|
||||||
|
options = {
|
||||||
|
pure_funcs: [ "pure" ],
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function foo() {
|
||||||
|
var u = pure(1);
|
||||||
|
var x = pure(2);
|
||||||
|
var y = pure(x);
|
||||||
|
var z = pure(pure(side_effects()));
|
||||||
|
return pure(3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function foo() {
|
||||||
|
side_effects();
|
||||||
|
return pure(3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
babel: {
|
||||||
|
options = {
|
||||||
|
pure_funcs: [ "_classCallCheck" ],
|
||||||
|
side_effects: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
function _classCallCheck(instance, Constructor) {
|
||||||
|
if (!(instance instanceof Constructor))
|
||||||
|
throw new TypeError("Cannot call a class as a function");
|
||||||
|
}
|
||||||
|
var Foo = function Foo() {
|
||||||
|
_classCallCheck(this, Foo);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
function _classCallCheck(instance, Constructor) {
|
||||||
|
if (!(instance instanceof Constructor))
|
||||||
|
throw new TypeError("Cannot call a class as a function");
|
||||||
|
}
|
||||||
|
var Foo = function() {
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
conditional: {
|
||||||
|
options = {
|
||||||
|
pure_funcs: [ "pure" ],
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
pure(1 | a() ? 2 & b() : 7 ^ c());
|
||||||
|
pure(1 | a() ? 2 & b() : 5);
|
||||||
|
pure(1 | a() ? 4 : 7 ^ c());
|
||||||
|
pure(1 | a() ? 4 : 5);
|
||||||
|
pure(3 ? 2 & b() : 7 ^ c());
|
||||||
|
pure(3 ? 2 & b() : 5);
|
||||||
|
pure(3 ? 4 : 7 ^ c());
|
||||||
|
pure(3 ? 4 : 5);
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
1 | a() ? b() : c();
|
||||||
|
1 | a() && b();
|
||||||
|
1 | a() || c();
|
||||||
|
a();
|
||||||
|
3 ? b() : c();
|
||||||
|
3 && b();
|
||||||
|
3 || c();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
relational: {
|
||||||
|
options = {
|
||||||
|
pure_funcs: [ "foo" ],
|
||||||
|
side_effects :true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
foo() in foo();
|
||||||
|
foo() instanceof bar();
|
||||||
|
foo() < "bar";
|
||||||
|
bar() > foo();
|
||||||
|
bar() != bar();
|
||||||
|
bar() !== "bar";
|
||||||
|
"bar" == foo();
|
||||||
|
"bar" === bar();
|
||||||
|
"bar" >= "bar";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
bar();
|
||||||
|
bar();
|
||||||
|
bar(), bar();
|
||||||
|
bar();
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
arithmetic: {
|
||||||
|
options = {
|
||||||
|
pure_funcs: [ "foo" ],
|
||||||
|
side_effects :true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
foo() + foo();
|
||||||
|
foo() - bar();
|
||||||
|
foo() * "bar";
|
||||||
|
bar() / foo();
|
||||||
|
bar() & bar();
|
||||||
|
bar() | "bar";
|
||||||
|
"bar" >> foo();
|
||||||
|
"bar" << bar();
|
||||||
|
"bar" >>> "bar";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
bar();
|
||||||
|
bar();
|
||||||
|
bar(), bar();
|
||||||
|
bar();
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean_and: {
|
||||||
|
options = {
|
||||||
|
pure_funcs: [ "foo" ],
|
||||||
|
side_effects :true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
foo() && foo();
|
||||||
|
foo() && bar();
|
||||||
|
foo() && "bar";
|
||||||
|
bar() && foo();
|
||||||
|
bar() && bar();
|
||||||
|
bar() && "bar";
|
||||||
|
"bar" && foo();
|
||||||
|
"bar" && bar();
|
||||||
|
"bar" && "bar";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
foo() && bar();
|
||||||
|
bar();
|
||||||
|
bar() && bar();
|
||||||
|
bar();
|
||||||
|
"bar" && bar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean_or: {
|
||||||
|
options = {
|
||||||
|
pure_funcs: [ "foo" ],
|
||||||
|
side_effects :true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
foo() || foo();
|
||||||
|
foo() || bar();
|
||||||
|
foo() || "bar";
|
||||||
|
bar() || foo();
|
||||||
|
bar() || bar();
|
||||||
|
bar() || "bar";
|
||||||
|
"bar" || foo();
|
||||||
|
"bar" || bar();
|
||||||
|
"bar" || "bar";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
foo() || bar();
|
||||||
|
bar();
|
||||||
|
bar() || bar();
|
||||||
|
bar();
|
||||||
|
"bar" || bar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assign: {
|
||||||
|
options = {
|
||||||
|
pure_funcs: [ "foo" ],
|
||||||
|
side_effects :true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a;
|
||||||
|
function f(b) {
|
||||||
|
a = foo();
|
||||||
|
b *= 4 + foo();
|
||||||
|
c >>= 0 | foo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
var a;
|
||||||
|
function f(b) {
|
||||||
|
a = foo();
|
||||||
|
b *= 4 + foo();
|
||||||
|
c >>= 0 | foo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unary: {
|
||||||
|
options = {
|
||||||
|
pure_funcs: [ "foo" ],
|
||||||
|
side_effects :true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
typeof foo();
|
||||||
|
typeof bar();
|
||||||
|
typeof "bar";
|
||||||
|
void foo();
|
||||||
|
void bar();
|
||||||
|
void "bar";
|
||||||
|
delete a[foo()];
|
||||||
|
delete a[bar()];
|
||||||
|
delete a["bar"];
|
||||||
|
a[foo()]++;
|
||||||
|
a[bar()]++;
|
||||||
|
a["bar"]++;
|
||||||
|
--a[foo()];
|
||||||
|
--a[bar()];
|
||||||
|
--a["bar"];
|
||||||
|
~foo();
|
||||||
|
~bar();
|
||||||
|
~"bar";
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
bar();
|
||||||
|
bar();
|
||||||
|
delete a[foo()];
|
||||||
|
delete a[bar()];
|
||||||
|
delete a["bar"];
|
||||||
|
a[foo()]++;
|
||||||
|
a[bar()]++;
|
||||||
|
a["bar"]++;
|
||||||
|
--a[foo()];
|
||||||
|
--a[bar()];
|
||||||
|
--a["bar"];
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2629_1: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/ a();
|
||||||
|
/*@__PURE__*/ (b());
|
||||||
|
(/*@__PURE__*/ c)();
|
||||||
|
(/*@__PURE__*/ d());
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"/* */c();",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2629_2: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/ a(1)(2)(3);
|
||||||
|
/*@__PURE__*/ (b(1))(2)(3);
|
||||||
|
/*@__PURE__*/ (c(1)(2))(3);
|
||||||
|
/*@__PURE__*/ (d(1)(2)(3));
|
||||||
|
(/*@__PURE__*/ e)(1)(2)(3);
|
||||||
|
(/*@__PURE__*/ f(1))(2)(3);
|
||||||
|
(/*@__PURE__*/ g(1)(2))(3);
|
||||||
|
(/*@__PURE__*/ h(1)(2)(3));
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"/* */e(1)(2)(3);",
|
||||||
|
"/* */f(1)(2)(3);",
|
||||||
|
"/* */g(1)(2)(3);",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2629_3: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/ a.x(1).y(2).z(3);
|
||||||
|
/*@__PURE__*/ (b.x)(1).y(2).z(3);
|
||||||
|
/*@__PURE__*/ (c.x(1)).y(2).z(3);
|
||||||
|
/*@__PURE__*/ (d.x(1).y)(2).z(3);
|
||||||
|
/*@__PURE__*/ (e.x(1).y(2)).z(3);
|
||||||
|
/*@__PURE__*/ (f.x(1).y(2).z)(3);
|
||||||
|
/*@__PURE__*/ (g.x(1).y(2).z(3));
|
||||||
|
(/*@__PURE__*/ h).x(1).y(2).z(3);
|
||||||
|
(/*@__PURE__*/ i.x)(1).y(2).z(3);
|
||||||
|
(/*@__PURE__*/ j.x(1)).y(2).z(3);
|
||||||
|
(/*@__PURE__*/ k.x(1).y)(2).z(3);
|
||||||
|
(/*@__PURE__*/ l.x(1).y(2)).z(3);
|
||||||
|
(/*@__PURE__*/ m.x(1).y(2).z)(3);
|
||||||
|
(/*@__PURE__*/ n.x(1).y(2).z(3));
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"/* */h.x(1).y(2).z(3);",
|
||||||
|
"/* */i.x(1).y(2).z(3);",
|
||||||
|
"/* */j.x(1).y(2).z(3);",
|
||||||
|
"/* */k.x(1).y(2).z(3);",
|
||||||
|
"/* */l.x(1).y(2).z(3);",
|
||||||
|
"/* */m.x(1).y(2).z(3);",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2629_4: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(/*@__PURE__*/ x(), y());
|
||||||
|
(w(), /*@__PURE__*/ x(), y());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
y();
|
||||||
|
w(), y();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2629_5: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
[ /*@__PURE__*/ x() ];
|
||||||
|
[ /*@__PURE__*/ x(), y() ];
|
||||||
|
[ w(), /*@__PURE__*/ x(), y() ];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
y();
|
||||||
|
w(), y();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2638: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/(g() || h())(x(), y());
|
||||||
|
(/*@__PURE__*/ (a() || b()))(c(), d());
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"/* */x(),y();",
|
||||||
|
"/* */(a()||b())(c(),d());",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2705_1: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/ new a();
|
||||||
|
/*@__PURE__*/ (new b());
|
||||||
|
new (/*@__PURE__*/ c)();
|
||||||
|
(/*@__PURE__*/ new d());
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"new/* */c;",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2705_2: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/ new a(1)(2)(3);
|
||||||
|
/*@__PURE__*/ new (b(1))(2)(3);
|
||||||
|
/*@__PURE__*/ new (c(1)(2))(3);
|
||||||
|
/*@__PURE__*/ new (d(1)(2)(3));
|
||||||
|
new (/*@__PURE__*/ e)(1)(2)(3);
|
||||||
|
(/*@__PURE__*/ new f(1))(2)(3);
|
||||||
|
(/*@__PURE__*/ new g(1)(2))(3);
|
||||||
|
(/*@__PURE__*/ new h(1)(2)(3));
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"new/* */e(1)(2)(3);",
|
||||||
|
"/* */new f(1)(2)(3);",
|
||||||
|
"/* */new g(1)(2)(3);",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2705_3: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/ new a.x(1).y(2).z(3);
|
||||||
|
/*@__PURE__*/ new (b.x)(1).y(2).z(3);
|
||||||
|
/*@__PURE__*/ new (c.x(1)).y(2).z(3);
|
||||||
|
/*@__PURE__*/ new (d.x(1).y)(2).z(3);
|
||||||
|
/*@__PURE__*/ new (e.x(1).y(2)).z(3);
|
||||||
|
/*@__PURE__*/ new (f.x(1).y(2).z)(3);
|
||||||
|
/*@__PURE__*/ new (g.x(1).y(2).z(3));
|
||||||
|
new (/*@__PURE__*/ h).x(1).y(2).z(3);
|
||||||
|
/* */ new (/*@__PURE__*/ i.x)(1).y(2).z(3);
|
||||||
|
(/*@__PURE__*/ new j.x(1)).y(2).z(3);
|
||||||
|
(/*@__PURE__*/ new k.x(1).y)(2).z(3);
|
||||||
|
(/*@__PURE__*/ new l.x(1).y(2)).z(3);
|
||||||
|
(/*@__PURE__*/ new m.x(1).y(2).z)(3);
|
||||||
|
(/*@__PURE__*/ new n.x(1).y(2).z(3));
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"new/* */h.x(1).y(2).z(3);",
|
||||||
|
"/* */new/* */i.x(1).y(2).z(3);",
|
||||||
|
"/* */new j.x(1).y(2).z(3);",
|
||||||
|
"/* */new k.x(1).y(2).z(3);",
|
||||||
|
"/* */new l.x(1).y(2).z(3);",
|
||||||
|
"/* */new m.x(1).y(2).z(3);",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2705_4: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
(/*@__PURE__*/ new x(), y());
|
||||||
|
(w(), /*@__PURE__*/ new x(), y());
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
y();
|
||||||
|
w(), y();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2705_5: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
[ /*@__PURE__*/ new x() ];
|
||||||
|
[ /*@__PURE__*/ new x(), y() ];
|
||||||
|
[ w(), /*@__PURE__*/ new x(), y() ];
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
y();
|
||||||
|
w(), y();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
issue_2705_6: {
|
||||||
|
options = {
|
||||||
|
side_effects: true,
|
||||||
|
}
|
||||||
|
beautify = {
|
||||||
|
comments: "all",
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
/*@__PURE__*/new (g() || h())(x(), y());
|
||||||
|
/* */ new (/*@__PURE__*/ (a() || b()))(c(), d());
|
||||||
|
}
|
||||||
|
expect_exact: [
|
||||||
|
"/* */x(),y();",
|
||||||
|
"/* */new(/* */a()||b())(c(),d());",
|
||||||
|
]
|
||||||
|
}
|
||||||
1163
test/compress/pure_getters.js
Normal file
1163
test/compress/pure_getters.js
Normal file
File diff suppressed because it is too large
Load Diff
5584
test/compress/reduce_vars.js
Normal file
5584
test/compress/reduce_vars.js
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user