Index: src/runtime/runtime-debug.cc |
diff --git a/src/runtime/runtime-debug.cc b/src/runtime/runtime-debug.cc |
index fea8d834e1af57b6f6295a3f44a9cc74cd941948..f6a020f042d59f4b6aa010b59996b54f85fe90b7 100644 |
--- a/src/runtime/runtime-debug.cc |
+++ b/src/runtime/runtime-debug.cc |
@@ -1595,12 +1595,41 @@ RUNTIME_FUNCTION(Runtime_ScriptLineCount) { |
CHECK(script->value()->IsScript()); |
Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); |
+ if (script_handle->type() == Script::TYPE_WASM) { |
+ // Return 0 for now; this function will disappear soon anyway. |
+ return Smi::FromInt(0); |
+ } |
+ |
Script::InitLineEnds(script_handle); |
FixedArray* line_ends_array = FixedArray::cast(script_handle->line_ends()); |
return Smi::FromInt(line_ends_array->length()); |
} |
+namespace { |
+ |
+int ScriptLinePosition(Handle<Script> script, int line) { |
+ if (line < 0) return -1; |
+ |
+ if (script->type() == Script::TYPE_WASM) { |
+ return WasmCompiledModule::cast(script->wasm_compiled_module()) |
+ ->GetFunctionOffset(line); |
+ } |
+ |
+ Script::InitLineEnds(script); |
+ |
+ FixedArray* line_ends_array = FixedArray::cast(script->line_ends()); |
+ const int line_count = line_ends_array->length(); |
+ DCHECK_LT(0, line_count); |
+ |
+ if (line == 0) return 0; |
+ // If line == line_count, we return the first position beyond the last line. |
+ if (line > line_count) return -1; |
+ return Smi::cast(line_ends_array->get(line - 1))->value() + 1; |
+} |
+ |
+} // namespace |
+ |
// TODO(5530): Remove once uses in debug.js are gone. |
RUNTIME_FUNCTION(Runtime_ScriptLineStartPosition) { |
HandleScope scope(isolate); |
@@ -1611,21 +1640,7 @@ RUNTIME_FUNCTION(Runtime_ScriptLineStartPosition) { |
CHECK(script->value()->IsScript()); |
Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); |
- Script::InitLineEnds(script_handle); |
- |
- FixedArray* line_ends_array = FixedArray::cast(script_handle->line_ends()); |
- const int line_count = line_ends_array->length(); |
- |
- // If line == line_count, we return the first position beyond the last line. |
- if (line < 0 || line > line_count) { |
- return Smi::FromInt(-1); |
- } else if (line == 0) { |
- return Smi::kZero; |
- } else { |
- DCHECK(0 < line && line <= line_count); |
- const int pos = Smi::cast(line_ends_array->get(line - 1))->value() + 1; |
- return Smi::FromInt(pos); |
- } |
+ return Smi::FromInt(ScriptLinePosition(script_handle, line)); |
} |
// TODO(5530): Remove once uses in debug.js are gone. |
@@ -1638,6 +1653,11 @@ RUNTIME_FUNCTION(Runtime_ScriptLineEndPosition) { |
CHECK(script->value()->IsScript()); |
Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); |
+ if (script_handle->type() == Script::TYPE_WASM) { |
+ // Return zero for now; this function will disappear soon anyway. |
+ return Smi::FromInt(0); |
+ } |
+ |
Script::InitLineEnds(script_handle); |
FixedArray* line_ends_array = FixedArray::cast(script_handle->line_ends()); |
@@ -1683,6 +1703,20 @@ static Handle<Object> GetJSPositionInfo(Handle<Script> script, int position, |
namespace { |
+int ScriptLinePositionWithOffset(Handle<Script> script, int line, int offset) { |
+ if (line < 0 || offset < 0) return -1; |
+ |
+ if (line == 0) return ScriptLinePosition(script, line) + offset; |
+ |
+ Script::PositionInfo info; |
+ if (!Script::GetPositionInfo(script, offset, &info, Script::NO_OFFSET)) { |
+ return -1; |
+ } |
+ |
+ const int total_line = info.line + line; |
+ return ScriptLinePosition(script, total_line); |
+} |
+ |
Handle<Object> ScriptLocationFromLine(Isolate* isolate, Handle<Script> script, |
Handle<Object> opt_line, |
Handle<Object> opt_column, |
@@ -1690,51 +1724,24 @@ Handle<Object> ScriptLocationFromLine(Isolate* isolate, Handle<Script> script, |
// Line and column are possibly undefined and we need to handle these cases, |
// additionally subtracting corresponding offsets. |
- int32_t line; |
- if (opt_line->IsNull(isolate) || opt_line->IsUndefined(isolate)) { |
- line = 0; |
- } else { |
+ int32_t line = 0; |
+ if (!opt_line->IsNull(isolate) && !opt_line->IsUndefined(isolate)) { |
CHECK(opt_line->IsNumber()); |
line = NumberToInt32(*opt_line) - script->line_offset(); |
} |
- int32_t column; |
- if (opt_column->IsNull(isolate) || opt_column->IsUndefined(isolate)) { |
- column = 0; |
- } else { |
+ int32_t column = 0; |
+ if (!opt_column->IsNull(isolate) && !opt_column->IsUndefined(isolate)) { |
CHECK(opt_column->IsNumber()); |
column = NumberToInt32(*opt_column); |
if (line == 0) column -= script->column_offset(); |
} |
- if (line < 0 || column < 0 || offset < 0) { |
- return isolate->factory()->null_value(); |
- } |
- |
- Script::InitLineEnds(script); |
+ int line_position = ScriptLinePositionWithOffset(script, line, offset); |
+ if (line_position < 0 || column < 0) return isolate->factory()->null_value(); |
- FixedArray* line_ends_array = FixedArray::cast(script->line_ends()); |
- const int line_count = line_ends_array->length(); |
- |
- int position; |
- if (line == 0) { |
- position = offset + column; |
- } else { |
- Script::PositionInfo info; |
- if (!Script::GetPositionInfo(script, offset, &info, Script::NO_OFFSET) || |
- info.line + line >= line_count) { |
- return isolate->factory()->null_value(); |
- } |
- |
- const int offset_line = info.line + line; |
- const int offset_line_position = |
- (offset_line == 0) |
- ? 0 |
- : Smi::cast(line_ends_array->get(offset_line - 1))->value() + 1; |
- position = offset_line_position + column; |
- } |
- |
- return GetJSPositionInfo(script, position, Script::NO_OFFSET, isolate); |
+ return GetJSPositionInfo(script, line_position + column, Script::NO_OFFSET, |
+ isolate); |
} |
// Slow traversal over all scripts on the heap. |
@@ -1820,6 +1827,11 @@ RUNTIME_FUNCTION(Runtime_ScriptSourceLine) { |
CHECK(script->value()->IsScript()); |
Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); |
+ if (script_handle->type() == Script::TYPE_WASM) { |
+ // Return null for now; this function will disappear soon anyway. |
+ return isolate->heap()->null_value(); |
+ } |
+ |
Script::InitLineEnds(script_handle); |
FixedArray* line_ends_array = FixedArray::cast(script_handle->line_ends()); |