Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3008)

Unified Diff: src/messages.js

Issue 1155683010: Revert of Only record one in n line endings to save space. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/macros.py ('k') | src/objects.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/messages.js
diff --git a/src/messages.js b/src/messages.js
index 3ff69fb61d2377db7760f2ff5076dd2740badaad..8d79dac43225931eb1800bde5f2b54feead2f92b 100644
--- a/src/messages.js
+++ b/src/messages.js
@@ -40,7 +40,6 @@
var ObjectDefineProperty = utils.ObjectDefineProperty;
var ArrayJoin;
-var MathFloor;
var ObjectToString;
var StringCharAt;
var StringIndexOf;
@@ -48,7 +47,6 @@
utils.Import(function(from) {
ArrayJoin = from.ArrayJoin;
- MathFloor = from.MathFloor;
ObjectToString = from.ObjectToString;
StringCharAt = from.StringCharAt;
StringIndexOf = from.StringIndexOf;
@@ -205,94 +203,41 @@
return location.sourceText();
}
-
-function Newlines(source, from, to, reduction) {
- var newLines = new InternalArray();
- if (!IS_STRING(source)) return newLines;
-
- var length = source.length;
- for (; from < to && from < length && newLines.length < reduction - 1
- ; ++from) {
- var c = %_StringCharCodeAt(source, from);
- if (c == ASCII_CR) {
- if (from < length - 1) {
- var c2 = %_StringCharCodeAt(source, from + 1);
- if (c2 == ASCII_NL) {
- from++; // CR-LF counts as one newline.
- }
- }
- newLines.push(from);
- } else if (c == ASCII_NL) {
- newLines.push(from);
- }
- }
- // End-of-file virtual end-of-line.
- if (to >= length) {
- var last = length != 0 ? %_StringCharCodeAt(source, length - 1) : 0;
- if (last != ASCII_NL && last != ASCII_CR) newLines.push(source.length - 1);
- }
- return newLines;
-}
-
-
-function ScriptLineEnd(line) {
- if (line < 0) return -1;
- var source = this.source;
- if (!IS_STRING(source)) return -1;
- var line_ends = this.line_ends;
- var reduction = line_ends[REDUCTION_INDEX];
- var index = MathFloor(line / reduction) + FIRST_LINE_END_INDEX;
- if (index >= line_ends.length) return -1;
- var position = line_ends[index];
- if (line % reduction == 0) return position;
- var lines = Newlines(source, position + 1, source.length, reduction);
- return lines[line % reduction - 1];
-}
-
-
/**
* Find a line number given a specific source position.
* @param {number} position The source position.
- * @return {number} -1 if position too large, else the 0-based line number.
+ * @return {number} 0 if input too small, -1 if input too large,
+ else the line number.
*/
function ScriptLineFromPosition(position) {
- var source = this.source;
- if (!IS_STRING(source)) return -1;
-
+ var lower = 0;
+ var upper = this.lineCount() - 1;
var line_ends = this.line_ends;
- var lower = FIRST_LINE_END_INDEX;
- var upper = line_ends.length - 1;
-
- var reduction = line_ends[REDUCTION_INDEX];
- // This '>' would normally be a '>=', but due to {}-less 'with' statements in
- // top-level code we sometimes encounter code positions that are one character
- // after the end of the source. See comment in Rewriter::Rewrite.
- if (position > source.length) return -1;
-
- var index = 0;
+
+ // We'll never find invalid positions so bail right away.
+ if (position > line_ends[upper]) {
+ return -1;
+ }
+
+ // This means we don't have to safe-guard indexing line_ends[i - 1].
+ if (position <= line_ends[0]) {
+ return 0;
+ }
// Binary search to find line # from position range.
- if (position > line_ends[upper]) {
- index = upper;
- } else {
- // Invariant: position > line_ends[lower]
- // Invariant: position <= line_ends[upper]
- while (lower + 1 < upper) {
- // Since they differ by at least 2, i must be different from both
- // upper or lower.
- var i = (lower + upper) >> 1;
- if (position > line_ends[i]) {
- lower = i;
- } else {
- upper = i;
- }
- }
- index = lower;
- }
-
- var line = (index - FIRST_LINE_END_INDEX) * reduction;
- return line +
- Newlines(source, line_ends[index] + 1, position, reduction).length;
+ while (upper >= 1) {
+ var i = (lower + upper) >> 1;
+
+ if (position > line_ends[i]) {
+ lower = i + 1;
+ } else if (position <= line_ends[i - 1]) {
+ upper = i - 1;
+ } else {
+ return i;
+ }
+ }
+
+ return -1;
}
/**
@@ -305,19 +250,14 @@
*/
function ScriptLocationFromPosition(position,
include_resource_offset) {
- // Get zero-based line number.
var line = this.lineFromPosition(position);
if (line == -1) return null;
// Determine start, end and column.
- var start = this.lineEnd(line) + 1;
- // End will be used for substr, so make it non-inclusive.
- var end = this.lineEnd(line + 1) + 1;
- if (end > this.source.length) end = this.source.length;
- // But trim the newline if there is one (there might not be at EOF).
- while (end > start) {
- var trim_char = %_CallFunction(this.source, end - 1, StringCharAt);
- if (trim_char != '\n' && trim_char != '\r') break;
+ var line_ends = this.line_ends;
+ var start = line == 0 ? 0 : line_ends[line - 1] + 1;
+ var end = line_ends[line];
+ if (end > 0 && %_CallFunction(this.source, end - 1, StringCharAt) == '\r') {
end--;
}
var column = position - start;
@@ -377,7 +317,7 @@
}
return this.locationFromPosition(
- this.lineEnd(offset_line + line) + 1 + column); // line > 0 here.
+ this.line_ends[offset_line + line - 1] + 1 + column); // line > 0 here.
}
}
@@ -411,14 +351,15 @@
return null;
}
- var from_position = this.lineEnd(from_line) + 1;
- var to_position = this.lineEnd(to_line) + 1;
+ var line_ends = this.line_ends;
+ var from_position = from_line == 0 ? 0 : line_ends[from_line - 1] + 1;
+ var to_position = to_line == 0 ? 0 : line_ends[to_line - 1] + 1;
// Return a source slice with line numbers re-adjusted to the resource.
return new SourceSlice(this,
from_line + this.line_offset,
to_line + this.line_offset,
- from_position, to_position);
+ from_position, to_position);
}
@@ -436,8 +377,9 @@
}
// Return the source line.
- var start = this.lineEnd(line) + 1;
- var end = this.lineEnd(line + 1);
+ var line_ends = this.line_ends;
+ var start = line == 0 ? 0 : line_ends[line - 1] + 1;
+ var end = line_ends[line];
return %_CallFunction(this.source, start, end, StringSubstring);
}
@@ -449,7 +391,7 @@
*/
function ScriptLineCount() {
// Return number of source lines.
- return this.line_ends[NUMBER_OF_LINES_INDEX];
+ return this.line_ends.length;
}
@@ -484,8 +426,7 @@
"sourceSlice", ScriptSourceSlice,
"sourceLine", ScriptSourceLine,
"lineCount", ScriptLineCount,
- "nameOrSourceURL", ScriptNameOrSourceURL,
- "lineEnd", ScriptLineEnd
+ "nameOrSourceURL", ScriptNameOrSourceURL
]
);
« no previous file with comments | « src/macros.py ('k') | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698