perform reduce_vars on safe literals (#2351)
- constant expression - single reference - same scope - not across loop body
This commit is contained in:
@@ -1268,22 +1268,21 @@ collapse_vars_short_circuited_conditions: {
|
||||
|
||||
collapse_vars_regexp: {
|
||||
options = {
|
||||
collapse_vars: true,
|
||||
loops: false,
|
||||
sequences: true,
|
||||
dead_code: true,
|
||||
conditionals: true,
|
||||
comparisons: true,
|
||||
evaluate: true,
|
||||
booleans: true,
|
||||
unused: true,
|
||||
hoist_funs: true,
|
||||
keep_fargs: true,
|
||||
cascade: true,
|
||||
collapse_vars: true,
|
||||
comparisons: true,
|
||||
conditionals: true,
|
||||
dead_code: true,
|
||||
evaluate: true,
|
||||
if_return: true,
|
||||
join_vars: true,
|
||||
cascade: true,
|
||||
side_effects: true,
|
||||
hoist_funs: true,
|
||||
keep_fargs: true,
|
||||
loops: false,
|
||||
reduce_vars: true,
|
||||
side_effects: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
function f1() {
|
||||
@@ -1292,12 +1291,12 @@ collapse_vars_regexp: {
|
||||
return [rx, k];
|
||||
}
|
||||
function f2() {
|
||||
var rx = /[abc123]+/;
|
||||
var rx = /ab*/g;
|
||||
return function(s) {
|
||||
return rx.exec(s);
|
||||
};
|
||||
}
|
||||
(function(){
|
||||
(function() {
|
||||
var result;
|
||||
var s = 'acdabcdeabbb';
|
||||
var rx = /ab*/g;
|
||||
@@ -1305,22 +1304,35 @@ collapse_vars_regexp: {
|
||||
console.log(result[0]);
|
||||
}
|
||||
})();
|
||||
(function() {
|
||||
var result;
|
||||
var s = 'acdabcdeabbb';
|
||||
var rx = f2();
|
||||
while (result = rx(s)) {
|
||||
console.log(result[0]);
|
||||
}
|
||||
})();
|
||||
}
|
||||
expect: {
|
||||
function f1() {
|
||||
return [/[A-Z]+/, 9];
|
||||
}
|
||||
function f2() {
|
||||
var rx = /[abc123]+/;
|
||||
var rx = /ab*/g;
|
||||
return function(s) {
|
||||
return rx.exec(s);
|
||||
};
|
||||
}
|
||||
(function(){
|
||||
(function() {
|
||||
var result, rx = /ab*/g;
|
||||
while (result = rx.exec("acdabcdeabbb"))
|
||||
console.log(result[0]);
|
||||
})();
|
||||
(function() {
|
||||
var result, rx = f2();
|
||||
while (result = rx("acdabcdeabbb"))
|
||||
console.log(result[0]);
|
||||
})();
|
||||
}
|
||||
expect_stdout: true
|
||||
}
|
||||
|
||||
@@ -751,12 +751,12 @@ issue_1583: {
|
||||
expect: {
|
||||
function m(t) {
|
||||
(function(e) {
|
||||
t = e();
|
||||
})(function() {
|
||||
return (function(a) {
|
||||
return a;
|
||||
})(function(a) {});
|
||||
});
|
||||
t = function() {
|
||||
return (function(a) {
|
||||
return function(a) {};
|
||||
})();
|
||||
}();
|
||||
})();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1021,6 +1021,7 @@ issue_1964_1: {
|
||||
input: {
|
||||
function f() {
|
||||
var long_variable_name = /\s/;
|
||||
console.log(long_variable_name.source);
|
||||
return "a b c".split(long_variable_name)[1];
|
||||
}
|
||||
console.log(f());
|
||||
@@ -1028,11 +1029,15 @@ issue_1964_1: {
|
||||
expect: {
|
||||
function f() {
|
||||
var long_variable_name = /\s/;
|
||||
console.log(long_variable_name.source);
|
||||
return "a b c".split(long_variable_name)[1];
|
||||
}
|
||||
console.log(f());
|
||||
}
|
||||
expect_stdout: "b"
|
||||
expect_stdout: [
|
||||
"\\s",
|
||||
"b",
|
||||
]
|
||||
}
|
||||
|
||||
issue_1964_2: {
|
||||
@@ -1045,17 +1050,22 @@ issue_1964_2: {
|
||||
input: {
|
||||
function f() {
|
||||
var long_variable_name = /\s/;
|
||||
console.log(long_variable_name.source);
|
||||
return "a b c".split(long_variable_name)[1];
|
||||
}
|
||||
console.log(f());
|
||||
}
|
||||
expect: {
|
||||
function f() {
|
||||
console.log(/\s/.source);
|
||||
return "a b c".split(/\s/)[1];
|
||||
}
|
||||
console.log(f());
|
||||
}
|
||||
expect_stdout: "b"
|
||||
expect_stdout: [
|
||||
"\\s",
|
||||
"b",
|
||||
]
|
||||
}
|
||||
|
||||
array_slice_index: {
|
||||
|
||||
@@ -172,6 +172,7 @@ unsafe_evaluate: {
|
||||
options = {
|
||||
evaluate : true,
|
||||
reduce_vars : true,
|
||||
side_effects : true,
|
||||
unsafe : true,
|
||||
unused : true
|
||||
}
|
||||
@@ -1898,10 +1899,7 @@ redefine_farg_3: {
|
||||
console.log(f([]), g([]), h([]));
|
||||
}
|
||||
expect: {
|
||||
console.log(function(a) {
|
||||
var a;
|
||||
return typeof a;
|
||||
}([]), "number", "undefined");
|
||||
console.log(typeof [], "number", "undefined");
|
||||
}
|
||||
expect_stdout: "object number undefined"
|
||||
}
|
||||
@@ -2629,3 +2627,190 @@ for_in_prop: {
|
||||
}
|
||||
expect_stdout: "1"
|
||||
}
|
||||
|
||||
obj_var_1: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
passes: 2,
|
||||
reduce_vars: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var C = 1;
|
||||
var obj = {
|
||||
bar: function() {
|
||||
return C + C;
|
||||
}
|
||||
};
|
||||
console.log(obj.bar());
|
||||
}
|
||||
expect: {
|
||||
console.log({
|
||||
bar: function() {
|
||||
return 2;
|
||||
}
|
||||
}.bar());
|
||||
}
|
||||
expect_stdout: "2"
|
||||
}
|
||||
|
||||
obj_var_2: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
inline: true,
|
||||
passes: 2,
|
||||
reduce_vars: true,
|
||||
side_effects: true,
|
||||
toplevel: true,
|
||||
unsafe: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var C = 1;
|
||||
var obj = {
|
||||
bar: function() {
|
||||
return C + C;
|
||||
}
|
||||
};
|
||||
console.log(obj.bar());
|
||||
}
|
||||
expect: {
|
||||
console.log(2);
|
||||
}
|
||||
expect_stdout: "2"
|
||||
}
|
||||
|
||||
obj_arg_1: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
inline: true,
|
||||
passes: 2,
|
||||
reduce_vars: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var C = 1;
|
||||
function f(obj) {
|
||||
return obj.bar();
|
||||
}
|
||||
console.log(f({
|
||||
bar: function() {
|
||||
return C + C;
|
||||
}
|
||||
}));
|
||||
}
|
||||
expect: {
|
||||
console.log({
|
||||
bar: function() {
|
||||
return 2;
|
||||
}
|
||||
}.bar());
|
||||
}
|
||||
expect_stdout: "2"
|
||||
}
|
||||
|
||||
obj_arg_2: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
inline: true,
|
||||
passes: 2,
|
||||
reduce_vars: true,
|
||||
side_effects: true,
|
||||
toplevel: true,
|
||||
unsafe: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var C = 1;
|
||||
function f(obj) {
|
||||
return obj.bar();
|
||||
}
|
||||
console.log(f({
|
||||
bar: function() {
|
||||
return C + C;
|
||||
}
|
||||
}));
|
||||
}
|
||||
expect: {
|
||||
console.log(2);
|
||||
}
|
||||
expect_stdout: "2"
|
||||
}
|
||||
|
||||
func_arg_1: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
inline: true,
|
||||
passes: 2,
|
||||
reduce_vars: true,
|
||||
side_effects: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var a = 42;
|
||||
!function(a) {
|
||||
console.log(a());
|
||||
}(function() {
|
||||
return a;
|
||||
});
|
||||
}
|
||||
expect: {
|
||||
console.log(42);
|
||||
}
|
||||
expect_stdout: "42"
|
||||
}
|
||||
|
||||
func_arg_2: {
|
||||
options = {
|
||||
evaluate: true,
|
||||
inline: true,
|
||||
passes: 2,
|
||||
reduce_vars: true,
|
||||
side_effects: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
var a = 42;
|
||||
!function(a) {
|
||||
console.log(a());
|
||||
}(function(a) {
|
||||
return a;
|
||||
});
|
||||
}
|
||||
expect: {
|
||||
console.log(void 0);
|
||||
}
|
||||
expect_stdout: "undefined"
|
||||
}
|
||||
|
||||
regex_loop: {
|
||||
options = {
|
||||
reduce_vars: true,
|
||||
toplevel: true,
|
||||
unused: true,
|
||||
}
|
||||
input: {
|
||||
function f(x) {
|
||||
for (var r, s = "acdabcdeabbb"; r = x().exec(s);)
|
||||
console.log(r[0]);
|
||||
}
|
||||
var a = /ab*/g;
|
||||
f(function() {
|
||||
return a;
|
||||
});
|
||||
}
|
||||
expect: {
|
||||
var a = /ab*/g;
|
||||
(function(x) {
|
||||
for (var r, s = "acdabcdeabbb"; r = x().exec(s);)
|
||||
console.log(r[0]);
|
||||
})(function() {
|
||||
return a;
|
||||
});
|
||||
}
|
||||
expect_stdout: true
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user