From 27b6d6dcd38557b2836a71d3933db8270ee7a343 Mon Sep 17 00:00:00 2001 From: nightwing Date: Sat, 15 Feb 2014 00:01:30 +0400 Subject: [PATCH] apply arguments max length also includes actual call stack --- lib/ace/document.js | 45 +++++++++++++++++++++++------------------- lib/ace/placeholder.js | 2 +- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/lib/ace/document.js b/lib/ace/document.js index 1abb95a2..99b7bb2d 100644 --- a/lib/ace/document.js +++ b/lib/ace/document.js @@ -302,9 +302,11 @@ var Document = function(textOrLines) { row = 0; } else if (row >= length) { row = length - 1; - column = undefined - } + column = undefined; + } var line = this.getLine(row); + if (column == undefined) + column = line.length; column = Math.min(Math.max(column, 0), line.length); return {row: row, column: column}; }; @@ -421,31 +423,33 @@ var Document = function(textOrLines) { **/ this.remove = function(range) { var start = this.clippedPos(range.start.row, range.start.column); + var end = this.clippedPos(range.end.row, range.end.column); this.applyDelta({ action: "remove", start: start, - end: this.clippedPos(range.end.row, range.end.column), - lines: this.getLinesForRange(range), + end: end, + lines: this.getLinesForRange({start: start, end: end}), }); return this.clonePos(start); }; /** - * Removes the specified columns from the `row`. This method also triggers the `"change"` event. - * @param {Number} row The row to remove from - * @param {Number} startColumn The column to start removing at - * @param {Number} endColumn The column to stop removing at - * @returns {Object} Returns an object containing `startRow` and `startColumn`, indicating the new row and column values.
If `startColumn` is equal to `endColumn`, this function returns nothing. - * - **/ + * Removes the specified columns from the `row`. This method also triggers a `"change"` event. + * @param {Number} row The row to remove from + * @param {Number} startColumn The column to start removing at + * @param {Number} endColumn The column to stop removing at + * @returns {Object} Returns an object containing `startRow` and `startColumn`, indicating the new row and column values.
If `startColumn` is equal to `endColumn`, this function returns nothing. + * + **/ this.removeInLine = function(row, startColumn, endColumn) { - var start = this.clippedPos(row, startColumn); + var start = this.clippedPos(row, startColumn); + var end = this.clippedPos(row, endColumn); this.applyDelta({ action: "remove", start: start, - end: this.clippedPos(row, endColumn), - lines: this.getLinesForRange(range), + end: end, + lines: this.getLinesForRange({start: start, end: end}), }, true); return this.clonePos(start); @@ -568,7 +572,7 @@ var Document = function(textOrLines) { : !Range.comparePoints(delta.start, delta.end)) return; - if (isInsert && delta.lines.length > 0xFFFF) + if (isInsert && delta.lines.length > 0xF000) this.$splitAndapplyLargeDelta(delta); // Apply. @@ -579,22 +583,23 @@ var Document = function(textOrLines) { this.$splitAndapplyLargeDelta = function(delta) { // Split large insert deltas. This is necessary because: // 1. We need to support splicing delta lines into the document via $lines.splice.apply(...) - // 2. fn.apply() doesn't work for a large number of params. The mallest threshold is on safari 0xFFFF. + // 2. fn.apply() doesn't work for a large number of params. The smallest threshold is on safari 0xFFFF. + // we use 0xF000 to leave some space for actual stack // // To Do: Ideally we'd be consistent and also split 'delete' deltas. We don't do this now, because delete // delta handling is too slow. If we make delete delta handling faster we can split all large deltas // as shown in https://gist.github.com/aldendaniels/8367109#file-document-snippet-js // If we do this, update validateDelta() to limit the number of lines in a delete delta. - while (delta.lines.length > 0xFFFF) { + while (delta.lines.length > 0xF000) { // Get split deltas. - var lines = delta.lines.splice(0, 0xFFFF); + var lines = delta.lines.splice(0, 0xF000); lines.push(""); var start = delta.start; this.applyDelta({ action: delta.action, lines: lines, - start: this.pos(start.row, start.column), - end: this.pos(start.row += 0xFFFF, start.column = 0) // Updates remaining delta. + start: this.pos(start.row, start.column), + end: this.pos(start.row += 0xF000, start.column = 0) // Updates remaining delta. }, true); } }; diff --git a/lib/ace/placeholder.js b/lib/ace/placeholder.js index 1d345a24..d7a2d6e9 100644 --- a/lib/ace/placeholder.js +++ b/lib/ace/placeholder.js @@ -150,7 +150,7 @@ var PlaceHolder = function(session, length, pos, others, mainClass, othersClass) **/ this.onUpdate = function(event) { var delta = event.data; - var range = delta.range; + var range = delta; if(range.start.row !== range.end.row) return; if(range.start.row !== this.pos.row) return; if (this.$updating) return;