diff --git a/src/path/Path.js b/src/path/Path.js index 4377f343..2dca56fe 100644 --- a/src/path/Path.js +++ b/src/path/Path.js @@ -404,8 +404,15 @@ var Path = PathItem.extend(/** @lends Path# */{ this._updateSelection(segment, 0, segment._selection); } if (append) { - // Append them all at the end by using push - segments.push.apply(segments, segs); + // Append them all at the end. + // Use a loop as the best way to handle big arrays (see #1493). + // Set future array length before the loop for better performances. + var originalLength = segments.length; + var offsetLength = segs.length; + segments.length += offsetLength; + for (var i = 0; i < offsetLength; i++) { + segments[originalLength + i] = segs[i]; + } } else { // Insert somewhere else segments.splice.apply(segments, [index, 0].concat(segs)); diff --git a/test/tests/Path.js b/test/tests/Path.js index 91a1eacf..ae190b10 100644 --- a/test/tests/Path.js +++ b/test/tests/Path.js @@ -611,3 +611,12 @@ test('Path#arcTo(from, through, to); where from, through and to all share the sa } equals(error != null, true, 'We expect this arcTo() command to throw an error'); }); + +test('#1493 Path#add with 1000000 segments', function() { + var path = new Path(); + for (var i = 0; i < 1000000; i++) { + path.add(new Point(0, 0)); + } + path.clone(); + expect(0); +});