@@ -6648,49 +6648,58 @@ Compressor.prototype.compress = function(node) {
|
||||
|
||||
function walk_cond(condition, consequent, alternative) {
|
||||
var save = segment;
|
||||
var segments = scan_branches(condition, consequent, alternative);
|
||||
var segments = scan_branches(1, condition, consequent, alternative);
|
||||
if (consequent) {
|
||||
segment = segments[0];
|
||||
pop();
|
||||
segment = segments.consequent.segment;
|
||||
for (var i = segments.consequent.level; --i >= 0;) pop();
|
||||
if (segment !== save) return;
|
||||
}
|
||||
if (alternative) {
|
||||
segment = segments[1];
|
||||
pop();
|
||||
segment = segments.alternative.segment;
|
||||
for (var i = segments.alternative.level; --i >= 0;) pop();
|
||||
if (segment !== save) return;
|
||||
}
|
||||
segment = save;
|
||||
}
|
||||
|
||||
function scan_branches(condition, consequent, alternative) {
|
||||
var segments = [ segment, segment ];
|
||||
function scan_branches(level, condition, consequent, alternative) {
|
||||
var segments = {
|
||||
consequent: {
|
||||
segment: segment,
|
||||
level: level,
|
||||
},
|
||||
alternative: {
|
||||
segment: segment,
|
||||
level: level,
|
||||
},
|
||||
}
|
||||
if (condition instanceof AST_Binary) switch (condition.operator) {
|
||||
case "&&":
|
||||
segments[0] = scan_branches(condition.left, condition.right)[0];
|
||||
segments.consequent = scan_branches(level + 1, condition.left, condition.right).consequent;
|
||||
break;
|
||||
case "||":
|
||||
case "??":
|
||||
segments[1] = scan_branches(condition.left, null, condition.right)[1];
|
||||
segments.alternative = scan_branches(level + 1, condition.left, null, condition.right).alternative;
|
||||
break;
|
||||
default:
|
||||
condition.walk(tw);
|
||||
break;
|
||||
} else if (condition instanceof AST_Conditional) {
|
||||
scan_branches(condition.condition, condition.consequent, condition.alternative);
|
||||
scan_branches(level + 1, condition.condition, condition.consequent, condition.alternative);
|
||||
} else {
|
||||
condition.walk(tw);
|
||||
}
|
||||
if (consequent) {
|
||||
segment = segments[0];
|
||||
segment = segments.consequent.segment;
|
||||
push();
|
||||
consequent.walk(tw);
|
||||
segments[0] = segment;
|
||||
segments.consequent.segment = segment;
|
||||
}
|
||||
if (alternative) {
|
||||
segment = segments[1];
|
||||
segment = segments.alternative.segment;
|
||||
push();
|
||||
alternative.walk(tw);
|
||||
segments[1] = segment;
|
||||
segments.alternative.segment = segment;
|
||||
}
|
||||
return segments;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user