Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 096c5b3911c9759aa55318c903bc274916f9e08c..6f24eee0afeaab064e0051b737894db1ffe414bd 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -12378,93 +12378,42 @@ |
DCHECK(script->line_ends()->IsFixedArray()); |
} |
-#define SMI_VALUE(x) (Smi::cast(x)->value()) |
-bool Script::GetPositionInfo(int position, PositionInfo* info, |
- OffsetFlag offset_flag) { |
- Handle<Script> script(this); |
- InitLineEnds(script); |
+ |
+int Script::GetColumnNumber(Handle<Script> script, int code_pos) { |
+ int line_number = GetLineNumber(script, code_pos); |
+ if (line_number == -1) return -1; |
DisallowHeapAllocation no_allocation; |
- |
+ FixedArray* line_ends_array = FixedArray::cast(script->line_ends()); |
+ line_number = line_number - script->line_offset(); |
+ if (line_number == 0) return code_pos + script->column_offset(); |
+ int prev_line_end_pos = |
+ Smi::cast(line_ends_array->get(line_number - 1))->value(); |
+ return code_pos - (prev_line_end_pos + 1); |
+} |
+ |
+ |
+int Script::GetLineNumberWithArray(int code_pos) { |
+ DisallowHeapAllocation no_allocation; |
DCHECK(line_ends()->IsFixedArray()); |
- FixedArray* ends = FixedArray::cast(line_ends()); |
- |
- const int ends_len = ends->length(); |
- if (ends_len == 0) return false; |
- |
- // Return early on invalid positions. Negative positions behave as if 0 was |
- // passed, and positions beyond the end of the script return as failure. |
- if (position < 0) { |
- position = 0; |
- } else if (position > SMI_VALUE(ends->get(ends_len - 1))) { |
- return false; |
- } |
- |
- // Determine line number by doing a binary search on the line ends array. |
- if (SMI_VALUE(ends->get(0)) >= position) { |
- info->line = 0; |
- info->line_start = 0; |
- info->column = position; |
- } else { |
- int left = 0; |
- int right = ends_len - 1; |
- |
- while (right > 0) { |
- DCHECK_LE(left, right); |
- const int mid = (left + right) / 2; |
- if (position > SMI_VALUE(ends->get(mid))) { |
- left = mid + 1; |
- } else if (position <= SMI_VALUE(ends->get(mid - 1))) { |
- right = mid - 1; |
- } else { |
- info->line = mid; |
- break; |
- } |
- } |
- DCHECK(SMI_VALUE(ends->get(info->line)) >= position && |
- SMI_VALUE(ends->get(info->line - 1)) < position); |
- info->line_start = SMI_VALUE(ends->get(info->line - 1)) + 1; |
- info->column = position - info->line_start; |
- } |
- |
- // Line end is position of the linebreak character. |
- info->line_end = SMI_VALUE(ends->get(info->line)); |
- if (info->line_end > 0) { |
- DCHECK(source()->IsString()); |
- Handle<String> src(String::cast(source())); |
- if (src->Get(info->line_end - 1) == '\r') { |
- info->line_end--; |
- } |
- } |
- |
- // Add offsets if requested. |
- if (offset_flag == WITH_OFFSET) { |
- if (info->line == 0) { |
- info->column += column_offset(); |
- } |
- info->line += line_offset(); |
- } |
- |
- return true; |
-} |
-#undef SMI_VALUE |
- |
-int Script::GetColumnNumber(Handle<Script> script, int code_pos) { |
- PositionInfo info; |
- if (!script->GetPositionInfo(code_pos, &info, WITH_OFFSET)) { |
- return -1; |
- } |
- |
- return info.column; |
-} |
- |
-int Script::GetLineNumberWithArray(int code_pos) { |
- PositionInfo info; |
- if (!GetPositionInfo(code_pos, &info, WITH_OFFSET)) { |
- return -1; |
- } |
- |
- return info.line; |
+ FixedArray* line_ends_array = FixedArray::cast(line_ends()); |
+ int line_ends_len = line_ends_array->length(); |
+ if (line_ends_len == 0) return -1; |
+ |
+ if ((Smi::cast(line_ends_array->get(0)))->value() >= code_pos) { |
+ return line_offset(); |
+ } |
+ |
+ int left = 0; |
+ int right = line_ends_len; |
+ while (int half = (right - left) / 2) { |
+ if ((Smi::cast(line_ends_array->get(left + half)))->value() > code_pos) { |
+ right -= half; |
+ } else { |
+ left += half; |
+ } |
+ } |
+ return right + line_offset(); |
} |