| Index: src/runtime/runtime-debug.cc | 
| diff --git a/src/runtime/runtime-debug.cc b/src/runtime/runtime-debug.cc | 
| index 8e1abf249580e12171b84f1e4158734b693177af..4810b1ac0a7d30f1dc144e43638fe13f256bc605 100644 | 
| --- a/src/runtime/runtime-debug.cc | 
| +++ b/src/runtime/runtime-debug.cc | 
| @@ -1429,6 +1429,7 @@ RUNTIME_FUNCTION(Runtime_DebugGetPrototype) { | 
|  | 
|  | 
| // Patches script source (should be called upon BeforeCompile event). | 
| +// TODO(5530): Remove once uses in debug.js are gone. | 
| RUNTIME_FUNCTION(Runtime_DebugSetScriptSource) { | 
| HandleScope scope(isolate); | 
| DCHECK(args.length() == 2); | 
| @@ -1569,6 +1570,7 @@ RUNTIME_FUNCTION(Runtime_GetScript) { | 
| return *Script::GetWrapper(found); | 
| } | 
|  | 
| +// TODO(5530): Remove once uses in debug.js are gone. | 
| RUNTIME_FUNCTION(Runtime_ScriptLineCount) { | 
| HandleScope scope(isolate); | 
| DCHECK(args.length() == 1); | 
| @@ -1583,6 +1585,7 @@ RUNTIME_FUNCTION(Runtime_ScriptLineCount) { | 
| return Smi::FromInt(line_ends_array->length()); | 
| } | 
|  | 
| +// TODO(5530): Remove once uses in debug.js are gone. | 
| RUNTIME_FUNCTION(Runtime_ScriptLineStartPosition) { | 
| HandleScope scope(isolate); | 
| DCHECK(args.length() == 2); | 
| @@ -1609,6 +1612,7 @@ RUNTIME_FUNCTION(Runtime_ScriptLineStartPosition) { | 
| } | 
| } | 
|  | 
| +// TODO(5530): Remove once uses in debug.js are gone. | 
| RUNTIME_FUNCTION(Runtime_ScriptLineEndPosition) { | 
| HandleScope scope(isolate); | 
| DCHECK(args.length() == 2); | 
| @@ -1661,62 +1665,49 @@ static Handle<Object> GetJSPositionInfo(Handle<Script> script, int position, | 
| return jsinfo; | 
| } | 
|  | 
| -// Get information on a specific source line and column possibly offset by a | 
| -// fixed source position. This function is used to find a source position from | 
| -// a line and column position. The fixed source position offset is typically | 
| -// used to find a source position in a function based on a line and column in | 
| -// the source for the function alone. The offset passed will then be the | 
| -// start position of the source for the function within the full script source. | 
| -// Note that incoming line and column parameters may be undefined, and are | 
| -// assumed to be passed *with* offsets. | 
| -RUNTIME_FUNCTION(Runtime_ScriptLocationFromLine) { | 
| -  HandleScope scope(isolate); | 
| -  DCHECK(args.length() == 4); | 
| -  CONVERT_ARG_CHECKED(JSValue, script, 0); | 
| - | 
| -  CHECK(script->value()->IsScript()); | 
| -  Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); | 
| +namespace { | 
|  | 
| +Handle<Object> ScriptLocationFromLine(Isolate* isolate, Handle<Script> script, | 
| +                                      Handle<Object> opt_line, | 
| +                                      Handle<Object> opt_column, | 
| +                                      int32_t offset) { | 
| // Line and column are possibly undefined and we need to handle these cases, | 
| // additionally subtracting corresponding offsets. | 
|  | 
| int32_t line; | 
| -  if (args[1]->IsNull(isolate) || args[1]->IsUndefined(isolate)) { | 
| +  if (opt_line->IsNull(isolate) || opt_line->IsUndefined(isolate)) { | 
| line = 0; | 
| } else { | 
| -    CHECK(args[1]->IsNumber()); | 
| -    line = NumberToInt32(args[1]) - script_handle->line_offset(); | 
| +    CHECK(opt_line->IsNumber()); | 
| +    line = NumberToInt32(*opt_line) - script->line_offset(); | 
| } | 
|  | 
| int32_t column; | 
| -  if (args[2]->IsNull(isolate) || args[2]->IsUndefined(isolate)) { | 
| +  if (opt_column->IsNull(isolate) || opt_column->IsUndefined(isolate)) { | 
| column = 0; | 
| } else { | 
| -    CHECK(args[2]->IsNumber()); | 
| -    column = NumberToInt32(args[2]); | 
| -    if (line == 0) column -= script_handle->column_offset(); | 
| +    CHECK(opt_column->IsNumber()); | 
| +    column = NumberToInt32(*opt_column); | 
| +    if (line == 0) column -= script->column_offset(); | 
| } | 
|  | 
| -  CONVERT_NUMBER_CHECKED(int32_t, offset_position, Int32, args[3]); | 
| - | 
| -  if (line < 0 || column < 0 || offset_position < 0) { | 
| -    return isolate->heap()->null_value(); | 
| +  if (line < 0 || column < 0 || offset < 0) { | 
| +    return isolate->factory()->null_value(); | 
| } | 
|  | 
| -  Script::InitLineEnds(script_handle); | 
| +  Script::InitLineEnds(script); | 
|  | 
| -  FixedArray* line_ends_array = FixedArray::cast(script_handle->line_ends()); | 
| +  FixedArray* line_ends_array = FixedArray::cast(script->line_ends()); | 
| const int line_count = line_ends_array->length(); | 
|  | 
| int position; | 
| if (line == 0) { | 
| -    position = offset_position + column; | 
| +    position = offset + column; | 
| } else { | 
| Script::PositionInfo info; | 
| -    if (!script_handle->GetPositionInfo(offset_position, &info, | 
| -                                        Script::NO_OFFSET) || | 
| +    if (!script->GetPositionInfo(offset, &info, Script::NO_OFFSET) || | 
| info.line + line >= line_count) { | 
| -      return isolate->heap()->null_value(); | 
| +      return isolate->factory()->null_value(); | 
| } | 
|  | 
| const int offset_line = info.line + line; | 
| @@ -1727,10 +1718,65 @@ RUNTIME_FUNCTION(Runtime_ScriptLocationFromLine) { | 
| position = offset_line_position + column; | 
| } | 
|  | 
| -  return *GetJSPositionInfo(script_handle, position, Script::NO_OFFSET, | 
| -                            isolate); | 
| +  return GetJSPositionInfo(script, position, Script::NO_OFFSET, isolate); | 
| +} | 
| + | 
| +// Slow traversal over all scripts on the heap. | 
| +bool GetScriptById(Isolate* isolate, int needle, Handle<Script>* result) { | 
| +  Script::Iterator iterator(isolate); | 
| +  Script* script = NULL; | 
| +  while ((script = iterator.Next()) != NULL) { | 
| +    if (script->id() == needle) { | 
| +      *result = handle(script); | 
| +      return true; | 
| +    } | 
| +  } | 
| + | 
| +  return false; | 
| +} | 
| + | 
| +}  // namespace | 
| + | 
| +// Get information on a specific source line and column possibly offset by a | 
| +// fixed source position. This function is used to find a source position from | 
| +// a line and column position. The fixed source position offset is typically | 
| +// used to find a source position in a function based on a line and column in | 
| +// the source for the function alone. The offset passed will then be the | 
| +// start position of the source for the function within the full script source. | 
| +// Note that incoming line and column parameters may be undefined, and are | 
| +// assumed to be passed *with* offsets. | 
| +// TODO(5530): Remove once uses in debug.js are gone. | 
| +RUNTIME_FUNCTION(Runtime_ScriptLocationFromLine) { | 
| +  HandleScope scope(isolate); | 
| +  DCHECK(args.length() == 4); | 
| +  CONVERT_ARG_HANDLE_CHECKED(JSValue, script, 0); | 
| +  CONVERT_ARG_HANDLE_CHECKED(Object, opt_line, 1); | 
| +  CONVERT_ARG_HANDLE_CHECKED(Object, opt_column, 2); | 
| +  CONVERT_NUMBER_CHECKED(int32_t, offset, Int32, args[3]); | 
| + | 
| +  CHECK(script->value()->IsScript()); | 
| +  Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); | 
| + | 
| +  return *ScriptLocationFromLine(isolate, script_handle, opt_line, opt_column, | 
| +                                 offset); | 
| +} | 
| + | 
| +// TODO(5530): Rename once conflicting function has been deleted. | 
| +RUNTIME_FUNCTION(Runtime_ScriptLocationFromLine2) { | 
| +  HandleScope scope(isolate); | 
| +  DCHECK(args.length() == 4); | 
| +  CONVERT_NUMBER_CHECKED(int32_t, scriptid, Int32, args[0]); | 
| +  CONVERT_ARG_HANDLE_CHECKED(Object, opt_line, 1); | 
| +  CONVERT_ARG_HANDLE_CHECKED(Object, opt_column, 2); | 
| +  CONVERT_NUMBER_CHECKED(int32_t, offset, Int32, args[3]); | 
| + | 
| +  Handle<Script> script; | 
| +  CHECK(GetScriptById(isolate, scriptid, &script)); | 
| + | 
| +  return *ScriptLocationFromLine(isolate, script, opt_line, opt_column, offset); | 
| } | 
|  | 
| +// TODO(5530): Remove once uses in debug.js are gone. | 
| RUNTIME_FUNCTION(Runtime_ScriptPositionInfo) { | 
| HandleScope scope(isolate); | 
| DCHECK(args.length() == 3); | 
| @@ -1748,6 +1794,7 @@ RUNTIME_FUNCTION(Runtime_ScriptPositionInfo) { | 
|  | 
| // Returns the given line as a string, or null if line is out of bounds. | 
| // The parameter line is expected to include the script's line offset. | 
| +// TODO(5530): Remove once uses in debug.js are gone. | 
| RUNTIME_FUNCTION(Runtime_ScriptSourceLine) { | 
| HandleScope scope(isolate); | 
| DCHECK(args.length() == 2); | 
| @@ -1850,6 +1897,7 @@ RUNTIME_FUNCTION(Runtime_DebugBreakInOptimizedCode) { | 
| return NULL; | 
| } | 
|  | 
| +// TODO(5530): Remove once uses in debug.js are gone. | 
| RUNTIME_FUNCTION(Runtime_GetWasmFunctionOffsetTable) { | 
| DCHECK(args.length() == 1); | 
| HandleScope scope(isolate); | 
| @@ -1865,6 +1913,7 @@ RUNTIME_FUNCTION(Runtime_GetWasmFunctionOffsetTable) { | 
| return *isolate->factory()->NewJSArrayWithElements(elements); | 
| } | 
|  | 
| +// TODO(5530): Remove once uses in debug.js are gone. | 
| RUNTIME_FUNCTION(Runtime_DisassembleWasmFunction) { | 
| DCHECK(args.length() == 1); | 
| HandleScope scope(isolate); | 
|  |