Index: src/inspector/wasm-translation.cc |
diff --git a/src/inspector/wasm-translation.cc b/src/inspector/wasm-translation.cc |
index 825341e122d06ec0efa9377d5c53da77a8df93b2..c545b9b6853324de04ee3783820f2a1f45529f22 100644 |
--- a/src/inspector/wasm-translation.cc |
+++ b/src/inspector/wasm-translation.cc |
@@ -21,11 +21,11 @@ using namespace v8; |
class WasmTranslation::TranslatorImpl { |
public: |
struct TransLocation { |
- WasmTranslation *translation; |
+ WasmTranslation* translation; |
String16 script_id; |
int line; |
int column; |
- TransLocation(WasmTranslation *translation, String16 script_id, int line, |
+ TransLocation(WasmTranslation* translation, String16 script_id, int line, |
int column) |
: translation(translation), |
script_id(script_id), |
@@ -33,8 +33,9 @@ class WasmTranslation::TranslatorImpl { |
column(column) {} |
}; |
- virtual void Translate(TransLocation *loc) = 0; |
- virtual void TranslateBack(TransLocation *loc) = 0; |
+ virtual void Init(Isolate*, WasmTranslation*, V8DebuggerAgentImpl*) = 0; |
+ virtual void Translate(TransLocation*) = 0; |
+ virtual void TranslateBack(TransLocation*) = 0; |
class RawTranslator; |
class DisassemblingTranslator; |
@@ -43,8 +44,9 @@ class WasmTranslation::TranslatorImpl { |
class WasmTranslation::TranslatorImpl::RawTranslator |
: public WasmTranslation::TranslatorImpl { |
public: |
- void Translate(TransLocation *loc) {} |
- void TranslateBack(TransLocation *loc) {} |
+ void Init(Isolate*, WasmTranslation*, V8DebuggerAgentImpl*) {} |
+ void Translate(TransLocation*) {} |
+ void TranslateBack(TransLocation*) {} |
}; |
class WasmTranslation::TranslatorImpl::DisassemblingTranslator |
@@ -52,11 +54,13 @@ class WasmTranslation::TranslatorImpl::DisassemblingTranslator |
using OffsetTable = debug::WasmDisassembly::OffsetTable; |
public: |
- DisassemblingTranslator(Isolate *isolate, Local<debug::WasmScript> script, |
- WasmTranslation *translation, |
- V8DebuggerAgentImpl *agent) |
- : script_(isolate, script) { |
+ DisassemblingTranslator(Isolate* isolate, Local<debug::WasmScript> script) |
+ : script_(isolate, script) {} |
+ |
+ void Init(Isolate* isolate, WasmTranslation* translation, |
+ V8DebuggerAgentImpl* agent) override { |
// Register fake scripts for each function in this wasm module/script. |
+ Handle<debug::WasmScript> script = script_.Get(isolate); |
int num_functions = script->NumFunctions(); |
int num_imported_functions = script->NumImportedFunctions(); |
DCHECK_LE(0, num_imported_functions); |
@@ -69,8 +73,8 @@ class WasmTranslation::TranslatorImpl::DisassemblingTranslator |
} |
} |
- void Translate(TransLocation *loc) { |
- const OffsetTable &offset_table = GetOffsetTable(loc); |
+ void Translate(TransLocation* loc) override { |
+ const OffsetTable& offset_table = GetOffsetTable(loc); |
DCHECK(!offset_table.empty()); |
uint32_t byte_offset = static_cast<uint32_t>(loc->column); |
@@ -96,18 +100,19 @@ class WasmTranslation::TranslatorImpl::DisassemblingTranslator |
} |
} |
- void TranslateBack(TransLocation *loc) { |
+ void TranslateBack(TransLocation* loc) override { |
int func_index = GetFunctionIndexFromFakeScriptId(loc->script_id); |
- const OffsetTable *reverse_table = GetReverseTable(func_index); |
+ const OffsetTable* reverse_table = GetReverseTable(func_index); |
if (!reverse_table) return; |
DCHECK(!reverse_table->empty()); |
+ v8::Isolate* isolate = loc->translation->isolate_; |
// Binary search for the given line and column. |
unsigned left = 0; // inclusive |
unsigned right = static_cast<unsigned>(reverse_table->size()); // exclusive |
while (right - left > 1) { |
unsigned mid = (left + right) / 2; |
- auto &entry = (*reverse_table)[mid]; |
+ auto& entry = (*reverse_table)[mid]; |
if (entry.line < loc->line || |
(entry.line == loc->line && entry.column <= loc->column)) { |
left = mid; |
@@ -119,22 +124,31 @@ class WasmTranslation::TranslatorImpl::DisassemblingTranslator |
int found_byte_offset = 0; |
// If we found an exact match, use it. Otherwise check whether the next |
// bigger entry is still in the same line. Report that one then. |
+ // Otherwise we might have hit the special case of pointing after the last |
+ // line, which is translated to the end of the function (one byte after the |
+ // last function byte). |
if ((*reverse_table)[left].line == loc->line && |
(*reverse_table)[left].column == loc->column) { |
found_byte_offset = (*reverse_table)[left].byte_offset; |
} else if (left + 1 < reverse_table->size() && |
(*reverse_table)[left + 1].line == loc->line) { |
found_byte_offset = (*reverse_table)[left + 1].byte_offset; |
+ } else if (left == reverse_table->size() - 1 && |
+ (*reverse_table)[left].line == loc->line - 1 && |
+ loc->column == 0) { |
+ std::pair<int, int> func_range = |
+ script_.Get(isolate)->GetFunctionRange(func_index); |
+ DCHECK_LE(func_range.first, func_range.second); |
+ found_byte_offset = func_range.second - func_range.first; |
} |
- v8::Isolate *isolate = loc->translation->isolate_; |
loc->script_id = String16::fromInteger(script_.Get(isolate)->Id()); |
loc->line = func_index; |
loc->column = found_byte_offset; |
} |
private: |
- String16 GetFakeScriptUrl(v8::Isolate *isolate, int func_index) { |
+ String16 GetFakeScriptUrl(v8::Isolate* isolate, int func_index) { |
Local<debug::WasmScript> script = script_.Get(isolate); |
String16 script_name = toProtocolString(script->Name().ToLocalChecked()); |
int numFunctions = script->NumFunctions(); |
@@ -157,13 +171,13 @@ class WasmTranslation::TranslatorImpl::DisassemblingTranslator |
String16 GetFakeScriptId(const String16 script_id, int func_index) { |
return String16::concat(script_id, '-', String16::fromInteger(func_index)); |
} |
- String16 GetFakeScriptId(const TransLocation *loc) { |
+ String16 GetFakeScriptId(const TransLocation* loc) { |
return GetFakeScriptId(loc->script_id, loc->line); |
} |
- void AddFakeScript(v8::Isolate *isolate, const String16 &underlyingScriptId, |
- int func_idx, WasmTranslation *translation, |
- V8DebuggerAgentImpl *agent) { |
+ void AddFakeScript(v8::Isolate* isolate, const String16& underlyingScriptId, |
+ int func_idx, WasmTranslation* translation, |
+ V8DebuggerAgentImpl* agent) { |
String16 fake_script_id = GetFakeScriptId(underlyingScriptId, func_idx); |
String16 fake_script_url = GetFakeScriptUrl(isolate, func_idx); |
@@ -177,14 +191,15 @@ class WasmTranslation::TranslatorImpl::DisassemblingTranslator |
String16 source(disassembly.disassembly.data(), |
disassembly.disassembly.length()); |
std::unique_ptr<V8DebuggerScript> fake_script = |
- V8DebuggerScript::CreateWasm(isolate, script, fake_script_id, |
- std::move(fake_script_url), source); |
+ V8DebuggerScript::CreateWasm(isolate, translation, script, |
+ fake_script_id, std::move(fake_script_url), |
+ source); |
translation->AddFakeScript(fake_script->scriptId(), this); |
agent->didParseSource(std::move(fake_script), true); |
} |
- int GetFunctionIndexFromFakeScriptId(const String16 &fake_script_id) { |
+ int GetFunctionIndexFromFakeScriptId(const String16& fake_script_id) { |
size_t last_dash_pos = fake_script_id.reverseFind('-'); |
DCHECK_GT(fake_script_id.length(), last_dash_pos); |
bool ok = true; |
@@ -193,7 +208,7 @@ class WasmTranslation::TranslatorImpl::DisassemblingTranslator |
return func_index; |
} |
- const OffsetTable &GetOffsetTable(const TransLocation *loc) { |
+ const OffsetTable& GetOffsetTable(const TransLocation* loc) { |
int func_index = loc->line; |
auto it = offset_tables_.find(func_index); |
// TODO(clemensh): Once we load disassembly lazily, the offset table |
@@ -202,7 +217,7 @@ class WasmTranslation::TranslatorImpl::DisassemblingTranslator |
return it->second; |
} |
- const OffsetTable *GetReverseTable(int func_index) { |
+ const OffsetTable* GetReverseTable(int func_index) { |
auto it = reverse_tables_.find(func_index); |
if (it != reverse_tables_.end()) return &it->second; |
@@ -233,27 +248,29 @@ class WasmTranslation::TranslatorImpl::DisassemblingTranslator |
std::unordered_map<int, const OffsetTable> reverse_tables_; |
}; |
-WasmTranslation::WasmTranslation(v8::Isolate *isolate) |
+WasmTranslation::WasmTranslation(v8::Isolate* isolate) |
: isolate_(isolate), mode_(Disassemble) {} |
WasmTranslation::~WasmTranslation() { Clear(); } |
void WasmTranslation::AddScript(Local<debug::WasmScript> script, |
- V8DebuggerAgentImpl *agent) { |
- int script_id = script->Id(); |
- DCHECK_EQ(0, wasm_translators_.count(script_id)); |
+ V8DebuggerAgentImpl* agent) { |
std::unique_ptr<TranslatorImpl> impl; |
switch (mode_) { |
case Raw: |
impl.reset(new TranslatorImpl::RawTranslator()); |
break; |
case Disassemble: |
- impl.reset(new TranslatorImpl::DisassemblingTranslator(isolate_, script, |
- this, agent)); |
+ impl.reset(new TranslatorImpl::DisassemblingTranslator(isolate_, script)); |
break; |
} |
DCHECK(impl); |
- wasm_translators_.insert(std::make_pair(script_id, std::move(impl))); |
+ auto inserted = |
+ wasm_translators_.insert(std::make_pair(script->Id(), std::move(impl))); |
+ // Check that no mapping for this script id existed before. |
+ DCHECK(inserted.second); |
+ // impl has been moved, use the returned iterator to call Init. |
+ inserted.first->second->Init(isolate_, this, agent); |
} |
void WasmTranslation::Clear() { |
@@ -263,7 +280,7 @@ void WasmTranslation::Clear() { |
// Translation "forward" (to artificial scripts). |
bool WasmTranslation::TranslateWasmScriptLocationToProtocolLocation( |
- String16 *script_id, int *line_number, int *column_number) { |
+ String16* script_id, int* line_number, int* column_number) { |
DCHECK(script_id && line_number && column_number); |
bool ok = true; |
int script_id_int = script_id->toInteger(&ok); |
@@ -271,7 +288,7 @@ bool WasmTranslation::TranslateWasmScriptLocationToProtocolLocation( |
auto it = wasm_translators_.find(script_id_int); |
if (it == wasm_translators_.end()) return false; |
- TranslatorImpl *translator = it->second.get(); |
+ TranslatorImpl* translator = it->second.get(); |
TranslatorImpl::TransLocation trans_loc(this, std::move(*script_id), |
*line_number, *column_number); |
@@ -286,10 +303,10 @@ bool WasmTranslation::TranslateWasmScriptLocationToProtocolLocation( |
// Translation "backward" (from artificial to real scripts). |
bool WasmTranslation::TranslateProtocolLocationToWasmScriptLocation( |
- String16 *script_id, int *line_number, int *column_number) { |
+ String16* script_id, int* line_number, int* column_number) { |
auto it = fake_scripts_.find(*script_id); |
if (it == fake_scripts_.end()) return false; |
- TranslatorImpl *translator = it->second; |
+ TranslatorImpl* translator = it->second; |
TranslatorImpl::TransLocation trans_loc(this, std::move(*script_id), |
*line_number, *column_number); |
@@ -302,8 +319,8 @@ bool WasmTranslation::TranslateProtocolLocationToWasmScriptLocation( |
return true; |
} |
-void WasmTranslation::AddFakeScript(const String16 &scriptId, |
- TranslatorImpl *translator) { |
+void WasmTranslation::AddFakeScript(const String16& scriptId, |
+ TranslatorImpl* translator) { |
DCHECK_EQ(0, fake_scripts_.count(scriptId)); |
fake_scripts_.insert(std::make_pair(scriptId, translator)); |
} |