@@ -4222,16 +4222,48 @@ Compressor.prototype.compress = function(node) {
4222
4222
if (value.left instanceof AST_SymbolRef) names.set(value.left.name, true);
4223
4223
value = value.right;
4224
4224
}
4225
- if (!(value instanceof AST_Object)) return;
4226
- var trimmed = false;
4227
- do {
4228
- if (!try_join(exprs[0])) break;
4229
- exprs.shift();
4230
- trimmed = true;
4231
- } while (exprs.length);
4232
- return trimmed;
4225
+ if (value instanceof AST_Array) {
4226
+ var trimmed = false;
4227
+ do {
4228
+ if (!try_join_array(exprs[0])) break;
4229
+ exprs.shift();
4230
+ trimmed = true;
4231
+ } while (exprs.length);
4232
+ return trimmed;
4233
+ } else if (value instanceof AST_Object) {
4234
+ var trimmed = false;
4235
+ do {
4236
+ if (!try_join_object(exprs[0])) break;
4237
+ exprs.shift();
4238
+ trimmed = true;
4239
+ } while (exprs.length);
4240
+ return trimmed;
4241
+ }
4242
+
4243
+ function try_join_array(node) {
4244
+ if (!(node instanceof AST_Assign)) return;
4245
+ if (node.operator != "=") return;
4246
+ if (!(node.left instanceof AST_PropAccess)) return;
4247
+ var sym = node.left.expression;
4248
+ if (!(sym instanceof AST_SymbolRef)) return;
4249
+ if (!names.has(sym.name)) return;
4250
+ if (!node.right.is_constant_expression(scope)) return;
4251
+ var prop = node.left.property;
4252
+ if (prop instanceof AST_Node) {
4253
+ if (try_join_array(prop)) prop = node.left.property = prop.right.clone();
4254
+ prop = prop.evaluate(compressor);
4255
+ }
4256
+ if (prop instanceof AST_Node) return;
4257
+ if (!RE_POSITIVE_INTEGER.test("" + prop)) return;
4258
+ prop = +prop;
4259
+ var len = value.elements.length;
4260
+ if (prop > len + 4) return;
4261
+ while (len < prop) value.elements[len++] = make_node(AST_Hole, value);
4262
+ value.elements[prop] = node.right;
4263
+ return true;
4264
+ }
4233
4265
4234
- function try_join (node) {
4266
+ function try_join_object (node) {
4235
4267
if (!(node instanceof AST_Assign)) return;
4236
4268
if (node.operator != "=") return;
4237
4269
if (!(node.left instanceof AST_PropAccess)) return;
@@ -4241,7 +4273,7 @@ Compressor.prototype.compress = function(node) {
4241
4273
if (!node.right.is_constant_expression(scope)) return;
4242
4274
var prop = node.left.property;
4243
4275
if (prop instanceof AST_Node) {
4244
- if (try_join (prop)) prop = node.left.property = prop.right.clone();
4276
+ if (try_join_object (prop)) prop = node.left.property = prop.right.clone();
4245
4277
prop = prop.evaluate(compressor);
4246
4278
}
4247
4279
if (prop instanceof AST_Node) return;
0 commit comments