| 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);
|
|
|