in-place sequences

This commit is contained in:
alexlamsl 2017-06-16 15:08:40 +08:00
parent eca96f1905
commit bfbac53762

View File

@ -676,7 +676,7 @@ merge(Compressor.prototype, {
statements = handle_if_return(statements, compressor); statements = handle_if_return(statements, compressor);
} }
if (compressor.sequences_limit > 0) { if (compressor.sequences_limit > 0) {
statements = sequencesize(statements, compressor); sequencesize(statements, compressor);
} }
if (compressor.option("join_vars")) { if (compressor.option("join_vars")) {
join_consecutive_vars(statements, compressor); join_consecutive_vars(statements, compressor);
@ -1093,15 +1093,16 @@ merge(Compressor.prototype, {
}; };
function sequencesize(statements, compressor) { function sequencesize(statements, compressor) {
if (statements.length < 2) return statements; if (statements.length < 2) return;
var seq = [], ret = []; var seq = [], n = 0;
function push_seq() { function push_seq() {
if (!seq.length) return; if (!seq.length) return;
var body = make_sequence(seq[0], seq); var body = make_sequence(seq[0], seq);
ret.push(make_node(AST_SimpleStatement, body, { body: body })); statements[n++] = make_node(AST_SimpleStatement, body, { body: body });
seq = []; seq = [];
}; }
statements.forEach(function(stat){ for (var i = 0, len = statements.length; i < len; i++) {
var stat = statements[i];
if (stat instanceof AST_SimpleStatement) { if (stat instanceof AST_SimpleStatement) {
if (seq.length >= compressor.sequences_limit) push_seq(); if (seq.length >= compressor.sequences_limit) push_seq();
var body = stat.body; var body = stat.body;
@ -1109,18 +1110,18 @@ merge(Compressor.prototype, {
if (body) merge_sequence(seq, body); if (body) merge_sequence(seq, body);
} else { } else {
push_seq(); push_seq();
ret.push(stat); statements[n++] = stat;
} }
}); }
push_seq(); push_seq();
ret = sequencesize_2(ret, compressor); statements.length = n;
CHANGED = ret.length != statements.length; sequencesize_2(statements, compressor);
return ret; CHANGED = statements.length != len;
}; };
function sequencesize_2(statements, compressor) { function sequencesize_2(statements, compressor) {
function cons_seq(right) { function cons_seq(right) {
ret.pop(); n--;
var left = prev.body; var left = prev.body;
if (!(left instanceof AST_Sequence)) { if (!(left instanceof AST_Sequence)) {
left = make_node(AST_Sequence, left, { left = make_node(AST_Sequence, left, {
@ -1130,8 +1131,9 @@ merge(Compressor.prototype, {
merge_sequence(left.expressions, right); merge_sequence(left.expressions, right);
return left.transform(compressor); return left.transform(compressor);
}; };
var ret = [], prev = null; var n = 0, prev;
statements.forEach(function(stat){ for (var i = 0, len = statements.length; i < len; i++) {
var stat = statements[i];
if (prev) { if (prev) {
if (stat instanceof AST_For) { if (stat instanceof AST_For) {
try { try {
@ -1144,7 +1146,7 @@ merge(Compressor.prototype, {
} }
else if (!stat.init) { else if (!stat.init) {
stat.init = prev.body.drop_side_effect_free(compressor); stat.init = prev.body.drop_side_effect_free(compressor);
ret.pop(); n--;
} }
} catch(ex) { } catch(ex) {
if (ex !== cons_seq) throw ex; if (ex !== cons_seq) throw ex;
@ -1166,11 +1168,11 @@ merge(Compressor.prototype, {
stat.expression = cons_seq(stat.expression); stat.expression = cons_seq(stat.expression);
} }
} }
ret.push(stat); statements[n++] = stat;
prev = stat instanceof AST_SimpleStatement ? stat : null; prev = stat instanceof AST_SimpleStatement ? stat : null;
}); }
return ret; statements.length = n;
}; }
function join_consecutive_vars(statements, compressor) { function join_consecutive_vars(statements, compressor) {
for (var i = 0, j = -1, len = statements.length; i < len; i++) { for (var i = 0, j = -1, len = statements.length; i < len; i++) {
@ -1197,8 +1199,7 @@ merge(Compressor.prototype, {
} }
statements.length = j + 1; statements.length = j + 1;
}; };
}
};
function extract_functions_from_statement_array(statements) { function extract_functions_from_statement_array(statements) {
var funs = []; var funs = [];