| Index: src/handles.cc
|
| ===================================================================
|
| --- src/handles.cc (revision 3862)
|
| +++ src/handles.cc (working copy)
|
| @@ -477,25 +477,25 @@
|
| int GetScriptLineNumber(Handle<Script> script, int code_pos) {
|
| InitScriptLineEnds(script);
|
| AssertNoAllocation no_allocation;
|
| - FixedArray* line_ends_array =
|
| - FixedArray::cast(script->line_ends());
|
| + FixedArray* line_ends_array = FixedArray::cast(script->line_ends());
|
| const int line_ends_len = line_ends_array->length();
|
|
|
| - int line = -1;
|
| - if (line_ends_len > 0 &&
|
| - code_pos <= (Smi::cast(line_ends_array->get(0)))->value()) {
|
| - line = 0;
|
| - } else {
|
| - for (int i = 1; i < line_ends_len; ++i) {
|
| - if ((Smi::cast(line_ends_array->get(i - 1)))->value() < code_pos &&
|
| - code_pos <= (Smi::cast(line_ends_array->get(i)))->value()) {
|
| - line = i;
|
| - break;
|
| - }
|
| + if (!line_ends_len)
|
| + return -1;
|
| +
|
| + if ((Smi::cast(line_ends_array->get(0)))->value() >= code_pos)
|
| + return script->line_offset()->value();
|
| +
|
| + 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 line != -1 ? line + script->line_offset()->value() : line;
|
| + return right + script->line_offset()->value();
|
| }
|
|
|
|
|
|
|