162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Copyright 2016 the V8 project authors. All rights reserved.
262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// found in the LICENSE file.
462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#ifndef V8_INSPECTOR_WASMTRANSLATION_H_
662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define V8_INSPECTOR_WASMTRANSLATION_H_
762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include <unordered_map>
962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "include/v8.h"
1162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/base/macros.h"
1262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/debug/debug-interface.h"
1362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/inspector/string-16.h"
1462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace v8_inspector {
1662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Forward declarations.
1862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass V8DebuggerAgentImpl;
1962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
2062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass WasmTranslation {
2162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public:
2262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  enum Mode { Raw, Disassemble };
2362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
2462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  explicit WasmTranslation(v8::Isolate* isolate);
2562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  ~WasmTranslation();
2662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
2762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Set translation mode.
2862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void SetMode(Mode mode) { mode_ = mode; }
2962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
3062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Make a wasm script known to the translation. This will trigger a number of
3162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // didParseScript calls to the given debugger agent.
3262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Only locations referencing a registered script will be translated by the
3362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Translate functions below.
3462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void AddScript(v8::Local<v8::debug::WasmScript> script,
3562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                 V8DebuggerAgentImpl* agent);
3662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
3762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Clear all registered scripts.
3862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void Clear();
3962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
4062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Translate a location as generated by V8 to a location that should be sent
4162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // over protocol.
4262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Does nothing for locations referencing a script which was not registered
4362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // before via AddScript.
4462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Line and column are 0-based.
4562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Returns true if the location was translated, false otherwise.
4662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool TranslateWasmScriptLocationToProtocolLocation(String16* script_id,
4762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                                     int* line_number,
4862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                                     int* column_number);
4962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
5062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Translate back from protocol locations (potentially referencing artificial
5162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // scripts for individual wasm functions) to locations that make sense to V8.
5262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Does nothing if the location was not generated by the translate method
5362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // above.
5462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Returns true if the location was translated, false otherwise.
5562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool TranslateProtocolLocationToWasmScriptLocation(String16* script_id,
5662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                                     int* line_number,
5762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                                     int* column_number);
5862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
5962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch private:
6062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  class TranslatorImpl;
6162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  friend class TranslatorImpl;
6262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
6362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void AddFakeScript(const String16& scriptId, TranslatorImpl* translator);
6462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
6562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  v8::Isolate* isolate_;
6662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  std::unordered_map<int, std::unique_ptr<TranslatorImpl>> wasm_translators_;
6762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  std::unordered_map<String16, TranslatorImpl*> fake_scripts_;
6862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Mode mode_;
6962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
7062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DISALLOW_COPY_AND_ASSIGN(WasmTranslation);
7162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
7262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
7362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}  // namespace v8_inspector
7462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
7562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#endif  // V8_INSPECTOR_WASMTRANSLATION_H_
76