JS/Inlining: introduce removal of expression statements without side effects
This commit is contained in:
Vendored
+67
@@ -0,0 +1,67 @@
|
||||
var global = 0;
|
||||
|
||||
function se() {
|
||||
return ++global;
|
||||
}
|
||||
|
||||
function se2(value) {
|
||||
++global;
|
||||
return value;
|
||||
}
|
||||
|
||||
function test1() {
|
||||
se(); se(); se(); se(); se();
|
||||
se(); se(); se(); se(); se();
|
||||
se(); se(); se(); se(); se();
|
||||
se(); se(); se(); se(); se();
|
||||
se(); se(); se(); se(); se();
|
||||
se(); se(); se(); se(); se();
|
||||
se(); se(); se();
|
||||
}
|
||||
|
||||
function test2() {
|
||||
try {
|
||||
se() in se();
|
||||
return "fail2a: `in` should not be removed"
|
||||
}
|
||||
catch (e) {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
try {
|
||||
se() instanceof se();
|
||||
return "fail2b: `instanceof` should not be removed"
|
||||
}
|
||||
catch (e) {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
return "OK"
|
||||
}
|
||||
|
||||
function test3() {
|
||||
var x = true;
|
||||
var y = false;
|
||||
|
||||
se2(true);
|
||||
x && se2(true);
|
||||
se2(true) && se2(true);
|
||||
|
||||
se2(false);
|
||||
y || se2(false);
|
||||
se2(false) || se2(false);
|
||||
}
|
||||
|
||||
function box() {
|
||||
test1();
|
||||
if (global != 33) return "fail1: " + global;
|
||||
|
||||
var result = test2();
|
||||
if (result !== "OK") return result;
|
||||
if (global != 37) return "fail2: " + global;
|
||||
|
||||
test3();
|
||||
if (global != 45) return "fail3: " + global;
|
||||
|
||||
return "OK";
|
||||
}
|
||||
Vendored
+76
@@ -0,0 +1,76 @@
|
||||
var global = 0;
|
||||
|
||||
function se() {
|
||||
return ++global;
|
||||
}
|
||||
|
||||
function se2(value) {
|
||||
++global;
|
||||
return value;
|
||||
}
|
||||
|
||||
function test1() {
|
||||
var $a = (se() - se() + se()) * se();
|
||||
var $b = se() % se() / se();
|
||||
var $c = se() >> se();
|
||||
var $d = se() << se();
|
||||
var $e = se() >>> se();
|
||||
var $f = se() | se() & se() ^ se();
|
||||
var $g1 = se() == se();
|
||||
var $g2 = se() === se();
|
||||
var $g3 = se() != se();
|
||||
var $g4 = se() !== se();
|
||||
var $h1 = se() > se();
|
||||
var $h2 = se() >= se();
|
||||
var $h3 = se() < se();
|
||||
var $h4 = se() <= se();
|
||||
}
|
||||
|
||||
function test2() {
|
||||
try {
|
||||
var $a = se() in se();
|
||||
return "fail2a: `in` should not be removed"
|
||||
}
|
||||
catch (e) {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
try {
|
||||
var $b = se() instanceof se();
|
||||
return "fail2b: `instanceof` should not be removed"
|
||||
}
|
||||
catch (e) {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
return "OK"
|
||||
}
|
||||
|
||||
function test3() {
|
||||
var x = true;
|
||||
var y = false;
|
||||
|
||||
var $a1 = se2(true) && x;
|
||||
var $a2 = x && se2(true);
|
||||
var $a3 = se2(true) && se2(true);
|
||||
var $a4 = x && x;
|
||||
|
||||
var $b1 = se2(false) || y;
|
||||
var $b2 = y || se2(false);
|
||||
var $b3 = se2(false) || se2(false);
|
||||
var $b4 = y || y;
|
||||
}
|
||||
|
||||
function box() {
|
||||
test1();
|
||||
if (global != 33) return "fail1: " + global;
|
||||
|
||||
var result = test2();
|
||||
if (result !== "OK") return result;
|
||||
if (global != 37) return "fail2: " + global;
|
||||
|
||||
test3();
|
||||
if (global != 45) return "fail3: " + global;
|
||||
|
||||
return "OK";
|
||||
}
|
||||
Vendored
+22
@@ -0,0 +1,22 @@
|
||||
var global = 0;
|
||||
|
||||
function se(value) {
|
||||
++global;
|
||||
return value;
|
||||
}
|
||||
|
||||
function test() {
|
||||
var x = true;
|
||||
se(x);
|
||||
x ? se("foo") : se("bar");
|
||||
x || se("bar");
|
||||
x && se("foo");
|
||||
se(x) ? se("foo") : se("bar");
|
||||
}
|
||||
|
||||
function box() {
|
||||
test();
|
||||
if (global != 5) return "fail1: " + global;
|
||||
|
||||
return "OK";
|
||||
}
|
||||
Vendored
+23
@@ -0,0 +1,23 @@
|
||||
var global = 0;
|
||||
|
||||
function se(value) {
|
||||
++global;
|
||||
return value;
|
||||
}
|
||||
|
||||
function test() {
|
||||
var x = true;
|
||||
var $a = se(x) ? "foo" : "bar";
|
||||
var $b = x ? "foo" : "bar";
|
||||
var $c = x ? se("foo") : se("bar");
|
||||
var $d = x ? "foo" : se("bar");
|
||||
var $e = x ? se("foo") : "bar";
|
||||
var $f = se(x) ? se("foo") : se("bar");
|
||||
}
|
||||
|
||||
function box() {
|
||||
test();
|
||||
if (global != 5) return "fail1: " + global;
|
||||
|
||||
return "OK";
|
||||
}
|
||||
Vendored
+23
@@ -0,0 +1,23 @@
|
||||
var global = 0;
|
||||
|
||||
function se(value) {
|
||||
++global;
|
||||
return value;
|
||||
}
|
||||
|
||||
function test() {
|
||||
se(2);
|
||||
se(3);
|
||||
se('foo');
|
||||
se('bar');
|
||||
se('y');
|
||||
se(3);
|
||||
se('null');
|
||||
}
|
||||
|
||||
function box() {
|
||||
test();
|
||||
if (global != 7) return "fail: " + test();
|
||||
|
||||
return "OK";
|
||||
}
|
||||
Vendored
+21
@@ -0,0 +1,21 @@
|
||||
var global = 0;
|
||||
|
||||
function se(value) {
|
||||
++global;
|
||||
return value;
|
||||
}
|
||||
|
||||
function test() {
|
||||
var $a = { x: se(2), y: se(3) };
|
||||
var $b = [se("foo"), se("bar")];
|
||||
var $c = "x" + se("y");
|
||||
var $d = 2 + se(3);
|
||||
var $e = se("null") + null;
|
||||
}
|
||||
|
||||
function box() {
|
||||
test();
|
||||
if (global != 7) return "fail: " + test();
|
||||
|
||||
return "OK";
|
||||
}
|
||||
Vendored
+41
@@ -0,0 +1,41 @@
|
||||
var global = 0;
|
||||
|
||||
function se(value) {
|
||||
++global;
|
||||
return value;
|
||||
}
|
||||
|
||||
function test1() {
|
||||
se(23);
|
||||
se(23);
|
||||
se(false);
|
||||
se(-1);
|
||||
se(23);
|
||||
se(23);
|
||||
}
|
||||
|
||||
function test2() {
|
||||
++global;
|
||||
global++;
|
||||
--global;
|
||||
global--;
|
||||
}
|
||||
|
||||
function test3() {
|
||||
var obj = { x: 2, y: 3};
|
||||
delete obj.x;
|
||||
return ("x" in obj) + ":" + ("y" in obj);
|
||||
}
|
||||
|
||||
function box() {
|
||||
test1();
|
||||
if (global != 6) return "fail1: " + global;
|
||||
|
||||
test2();
|
||||
if (global != 6) return "fail2: " + global;
|
||||
|
||||
var result = test3();
|
||||
if (result != "false:true") return "fail3: " + result;
|
||||
|
||||
return "OK";
|
||||
}
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
var global = 0;
|
||||
|
||||
function se(value) {
|
||||
++global;
|
||||
return value;
|
||||
}
|
||||
|
||||
function test1() {
|
||||
var $a = +se(23);
|
||||
var $b = -se(23);
|
||||
var $c = !se(false);
|
||||
var $d = ~se(-1);
|
||||
var $e = typeof se(23);
|
||||
var $f = void se(23);
|
||||
}
|
||||
|
||||
function test2() {
|
||||
var $a = ++global;
|
||||
var $b = global++;
|
||||
var $c = --global;
|
||||
var $d = global--;
|
||||
}
|
||||
|
||||
function test3() {
|
||||
var obj = { x: 2, y: 3};
|
||||
var $tmp = delete obj.x;
|
||||
return ("x" in obj) + ":" + ("y" in obj);
|
||||
}
|
||||
|
||||
function box() {
|
||||
test1();
|
||||
if (global != 6) return "fail1: " + global;
|
||||
|
||||
test2();
|
||||
if (global != 6) return "fail2: " + global;
|
||||
|
||||
var result = test3();
|
||||
if (result != "false:true") return "fail3: " + result;
|
||||
|
||||
return "OK";
|
||||
}
|
||||
Reference in New Issue
Block a user