Skip to content

Commit

Permalink
Stop using splice.appy() in ace
Browse files Browse the repository at this point in the history
Since .apply() can't handle more than 65535 parameters, splice.apply()
is brittle. It's also hard to read. This replaces splice.apply() calls
throughout ace code with lang.spliceIntoArray().
  • Loading branch information
aldendaniels committed Jan 4, 2014
1 parent b503e65 commit 8624ab8
Show file tree
Hide file tree
Showing 9 changed files with 53 additions and 37 deletions.
14 changes: 8 additions & 6 deletions lib/ace/background_tokenizer.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ define(function(require, exports, module) {
"use strict";

var oop = require("./lib/oop");
var lang = require("./lib/lang");
var EventEmitter = require("./lib/event_emitter").EventEmitter;


Expand Down Expand Up @@ -187,14 +188,15 @@ var BackgroundTokenizer = function(tokenizer, editor) {
this.lines.splice(startRow, len + 1, null);
this.states.splice(startRow, len + 1, null);
} else {
var args = Array(len + 1);
args.unshift(startRow, 1);
this.lines.splice.apply(this.lines, args);
this.states.splice.apply(this.states, args);
this.lines.splice( startRow, 1);
this.states.splice(startRow, 1);
var toInsert = Array(len + 1);
lang.spliceIntoArray(this.lines, startRow, toInsert);
lang.spliceIntoArray(this.states, startRow, toInsert);
}

this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength());

this.stop();
};

Expand Down
14 changes: 7 additions & 7 deletions lib/ace/edit_session.js
Original file line number Diff line number Diff line change
Expand Up @@ -1723,15 +1723,15 @@ var EditSession = function(text, mode) {
} else {
var args;
if (useWrapMode) {
args = [firstRow, 0];
for (var i = 0; i < len; i++) args.push([]);
this.$wrapData.splice.apply(this.$wrapData, args);
var toInsert = [];
for (var i = 0; i < len; i++)
toInsert.push([]);
lang.spliceIntoArray(this.$wrapData, firstRow, toInsert);
} else {
args = Array(len);
args.unshift(firstRow, 0);
this.$rowLengthCache.splice.apply(this.$rowLengthCache, args);
var toInsert = Array(len);
lang.spliceIntoArray(this.$rowLengthCache, firstRow, toInsert);
}

// If some new line is added inside of a foldLine, then split
// the fold line up.
var foldLines = this.$foldData;
Expand Down
6 changes: 3 additions & 3 deletions lib/ace/edit_session/folding.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
define(function(require, exports, module) {
"use strict";

var lang = require("../lib/lang");
var Range = require("../range").Range;
var FoldLine = require("./fold_line").FoldLine;
var Fold = require("./fold").Fold;
Expand Down Expand Up @@ -836,9 +837,8 @@ function Folding() {
} else if (delta.action == "delete") {
this.foldWidgets.splice(firstRow, len + 1, null);
} else {
var args = Array(len + 1);
args.unshift(firstRow, 1);
this.foldWidgets.splice.apply(this.foldWidgets, args);
this.foldWidgets.splice(firstRow, 1);
lang.spliceIntoArray(this.foldWidgets, firstRow, Array(len + 1));
}
};

Expand Down
5 changes: 2 additions & 3 deletions lib/ace/layer/gutter.js
Original file line number Diff line number Diff line change
Expand Up @@ -111,9 +111,8 @@ var Gutter = function(parentEl) {
} else if (delta.action == "delete") {
this.$annotations.splice(firstRow, len + 1, null);
} else {
var args = new Array(len + 1);
args.unshift(firstRow, 1);
this.$annotations.splice.apply(this.$annotations, args);
this.$annotations.splice(firstRow, 1);
lang.spliceIntoArray(this.$annotations, firstRow, new Array(len + 1));
}
};

Expand Down
14 changes: 14 additions & 0 deletions lib/ace/lib/lang.js
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,20 @@ exports.arrayRemove = function(array, value) {
}
};

/*
* Splice the items in `a2` into `a1` at position `offset`.
*/
exports.spliceIntoArray = function(a1, offset, a2) {

// Handle negative offsets.
if (offset < 0)
offset = Math.max(a1.length + offset, 0);

// Splice.
for (var i = 0; i < a2.length; i++)
a1.splice(i + offset, 0, a2[i]);
}

exports.escapeRegExp = function(str) {
return str.replace(/([.*+?^${}()|[\]\/\\])/g, '\\$1');
};
Expand Down
5 changes: 2 additions & 3 deletions lib/ace/line_widgets.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ define(function(require, exports, module) {
"use strict";

var oop = require("./lib/oop");
var lang = require("./lib/lang");
var dom = require("./lib/dom");
var Range = require("./range").Range;

Expand Down Expand Up @@ -130,9 +131,7 @@ function LineWidgets(session) {
}, this);
this.$updateRows();
} else {
var args = Array(len);
args.unshift(startRow, 0);
cells.splice.apply(cells, args);
lang.spliceIntoArray(cells, startRow, new Array(len));
this.$updateRows();
}
};
Expand Down
8 changes: 5 additions & 3 deletions lib/ace/mode/asciidoc_highlight_rules.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ define(function(require, exports, module) {
"use strict";

var oop = require("../lib/oop");
var lang = require("../lib/lang");
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;

var AsciidocHighlightRules = function() {
Expand Down Expand Up @@ -215,13 +216,14 @@ var AsciidocHighlightRules = function() {
for (var i = stateRules.length; i--; ) {
var rule = stateRules[i];
if (rule.include || typeof rule == "string") {
var args = [i, 1].concat(this.$rules[rule.include || rule]);
var toInsert = this.$rules[rule.include || rule];
if (rule.noEscape) {
args = args.filter(function(x) {
toInsert = toInsert.filter(function(x) {
return !x.next;
});
}
stateRules.splice.apply(stateRules, args);
stateRules.splice(i, 1);
lang.spliceIntoArray(stateRules, i, toInsert);
} else if (rule.token in tokenMap) {
rule.token = tokenMap[rule.token];
}
Expand Down
6 changes: 3 additions & 3 deletions lib/ace/mode/text_highlight_rules.js
Original file line number Diff line number Diff line change
Expand Up @@ -181,10 +181,10 @@ var TextHighlightRules = function() {
toInsert = rule;

if (toInsert) {
var args = [i, 1].concat(toInsert);
if (rule.noEscape)
args = args.filter(function(x) {return !x.next;});
state.splice.apply(state, args);
toInsert = toInsert.filter(function(x) {return !x.next;});
state.splice(i, 1);
lang.spliceIntoArray(state, i, toInsert);
// skip included rules since they are already processed
//i += args.length - 3;
i--;
Expand Down
18 changes: 9 additions & 9 deletions lib/ace/snippets.js
Original file line number Diff line number Diff line change
Expand Up @@ -335,12 +335,12 @@ var SnippetManager = function() {
}

var ts = tabstops[id];
var arg = typeof ts.value == "string" ? [ts.value] : copyValue(ts.value);
arg.unshift(i + 1, Math.max(0, i1 - i));
arg.push(p);
var toInsert = typeof ts.value == "string" ? [ts.value] : copyValue(ts.value);
toInsert.push(p);
expanding[id] = p;
tokens.splice.apply(tokens, arg);

tokens.splice(i + 1, Math.max(0, i1 - i));
lang.spliceIntoArray(tokens, i + 1, toInsert);

if (ts.indexOf(p) === -1)
ts.push(p);
};
Expand Down Expand Up @@ -755,7 +755,7 @@ var TabstopManager = function(editor) {
}

var i = this.index;
var arg = [i, 0];
var toInsert = [];
var ranges = this.ranges;
var editor = this.editor;
tabstops.forEach(function(ts) {
Expand All @@ -776,12 +776,12 @@ var TabstopManager = function(editor) {
}
if (!ts.firstNonLinked)
ts.hasLinkedRanges = false;
arg.push(ts);
toInsert.push(ts);
this.addTabstopMarkers(ts);
}, this);
// tabstop 0 is the last one
arg.push(arg.splice(2, 1)[0]);
this.tabstops.splice.apply(this.tabstops, arg);
toInsert.push(toInsert.splice(0, 1)[0]);
lang.spliceIntoArray(this.tabstops, this.index, toInsert);
};

this.addTabstopMarkers = function(ts) {
Expand Down

0 comments on commit 8624ab8

Please sign in to comment.