Chromium Code Reviews| Index: src/inspector/v8-debugger-script.cc |
| diff --git a/src/inspector/v8-debugger-script.cc b/src/inspector/v8-debugger-script.cc |
| index 229c32a38895df4ed0badd5b06f1c9d79944571f..fc2ed02cb44cf884ddf9511d2266a8c521118869 100644 |
| --- a/src/inspector/v8-debugger-script.cc |
| +++ b/src/inspector/v8-debugger-script.cc |
| @@ -8,9 +8,11 @@ |
| namespace v8_inspector { |
| -static const char hexDigits[17] = "0123456789ABCDEF"; |
| +namespace { |
| -static void appendUnsignedAsHex(uint64_t number, String16Builder* destination) { |
| +const char hexDigits[17] = "0123456789ABCDEF"; |
| + |
| +void appendUnsignedAsHex(uint64_t number, String16Builder* destination) { |
| for (size_t i = 0; i < 8; ++i) { |
| UChar c = hexDigits[number & 0xF]; |
| destination->append(c); |
| @@ -22,7 +24,7 @@ static void appendUnsignedAsHex(uint64_t number, String16Builder* destination) { |
| // Multiplikation in |
| // eingeschränkten Branchingprogrammmodellen" by Woelfe. |
| // http://opendatastructures.org/versions/edition-0.1d/ods-java/node33.html#SECTION00832000000000000000 |
| -static String16 calculateHash(const String16& str) { |
| +String16 calculateHash(const String16& str) { |
| static uint64_t prime[] = {0x3FB75161, 0xAB1F4E4F, 0x82675BC5, 0xCD924D35, |
| 0x81ABE279}; |
| static uint64_t random[] = {0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, |
| @@ -66,37 +68,129 @@ static String16 calculateHash(const String16& str) { |
| return hash.toString(); |
| } |
| -V8DebuggerScript::V8DebuggerScript(v8::Isolate* isolate, |
| - v8::Local<v8::DebugInterface::Script> script, |
| - bool isLiveEdit) { |
| - m_isolate = script->GetIsolate(); |
| - m_id = String16::fromInteger(script->Id()); |
| +class ActualScript : public V8DebuggerScript { |
| + friend class V8DebuggerScript; |
| + |
| + public: |
| + ActualScript(v8::Local<v8::DebugInterface::Script> script, String16 url) |
| + : V8DebuggerScript(script->GetIsolate(), |
| + String16::fromInteger(script->Id()), std::move(url)) {} |
| + |
| + bool isLiveEdit() const override { return m_isLiveEdit; } |
| + |
| + const String16& executionContextAuxData() const override { |
| + return m_executionContextAuxData; |
| + } |
| + |
| + const String16& sourceMappingURL() const override { |
| + return m_sourceMappingURL; |
| + } |
| + |
| + String16 source(v8::Isolate* isolate) const override { |
| + if (!m_sourceObj.IsEmpty()) |
| + return toProtocolString(m_sourceObj.Get(isolate)); |
| + return V8DebuggerScript::source(isolate); |
| + } |
| + |
| + void setSourceMappingURL(const String16& sourceMappingURL) override { |
| + m_sourceMappingURL = sourceMappingURL; |
| + } |
| + |
| + void setSource(v8::Local<v8::String> source) override { |
| + m_source = String16(); |
| + m_sourceObj.Reset(m_isolate, source); |
| + m_hash = String16(); |
| + } |
| + |
| + bool getPossibleBreakpoints( |
| + const v8::DebugInterface::Location& start, |
| + const v8::DebugInterface::Location& end, |
| + std::vector<v8::DebugInterface::Location>* locations) override { |
| + v8::HandleScope scope(m_isolate); |
| + v8::Local<v8::DebugInterface::Script> script = m_script.Get(m_isolate); |
| + return script->GetPossibleBreakpoints(start, end, locations); |
| + } |
| + |
| + private: |
| + String16 m_sourceMappingURL; |
| + v8::Global<v8::String> m_sourceObj; |
| + String16 m_executionContextAuxData; |
| + bool m_isLiveEdit = false; |
| + v8::Global<v8::DebugInterface::Script> m_script; |
| +}; |
| + |
| +class WasmVirtualScript : public V8DebuggerScript { |
| + friend class V8DebuggerScript; |
| + |
| + public: |
| + WasmVirtualScript(v8::Local<v8::DebugInterface::Script> script, String16 id, |
| + String16 url, String16 source) |
| + : V8DebuggerScript(script->GetIsolate(), std::move(id), std::move(url)), |
| + m_script(script->GetIsolate(), script) { |
| + m_source = std::move(source); |
| + } |
| + |
| + const String16& sourceMappingURL() const override { return emptyString(); } |
| + const String16& executionContextAuxData() const override { |
| + return emptyString(); |
| + } |
| + bool isLiveEdit() const override { return false; } |
| + |
| + bool getPossibleBreakpoints( |
| + const v8::DebugInterface::Location& start, |
| + const v8::DebugInterface::Location& end, |
| + std::vector<v8::DebugInterface::Location>* locations) override { |
| + // TODO(clemensh): Returning false produces the protocol error "Internal |
| + // error". Implement and fix expected output of |
| + // wasm-get-breakable-locations.js. |
| + return false; |
| + } |
| + |
| + private: |
| + static const String16& emptyString() { |
| + static const String16 singleEmptyString; |
| + return singleEmptyString; |
| + } |
| + |
| + v8::Global<v8::DebugInterface::Script> m_script; |
| +}; |
| + |
| +} // namespace |
| + |
| +std::unique_ptr<V8DebuggerScript> V8DebuggerScript::Create( |
| + v8::Isolate* isolate, v8::Local<v8::DebugInterface::Script> scriptObj, |
| + bool isLiveEdit) { |
| + String16 url; |
| + String16 sourceUrl; |
| v8::Local<v8::String> tmp; |
| - if (script->Name().ToLocal(&tmp)) m_url = toProtocolString(tmp); |
| - if (script->SourceURL().ToLocal(&tmp)) { |
| - m_sourceURL = toProtocolString(tmp); |
| - if (m_url.isEmpty()) m_url = toProtocolString(tmp); |
| - } |
| - if (script->SourceMappingURL().ToLocal(&tmp)) |
| - m_sourceMappingURL = toProtocolString(tmp); |
| - m_startLine = script->LineOffset(); |
| - m_startColumn = script->ColumnOffset(); |
| - std::vector<int> lineEnds = script->LineEnds(); |
| + if (scriptObj->Name().ToLocal(&tmp)) url = toProtocolString(tmp); |
| + if (scriptObj->SourceURL().ToLocal(&tmp)) { |
| + sourceUrl = toProtocolString(tmp); |
| + if (url.isEmpty()) url = sourceUrl; |
| + } |
| + std::unique_ptr<ActualScript> script(new ActualScript(scriptObj, url)); |
| + script->m_sourceURL = std::move(sourceUrl); |
|
kozy
2016/11/30 18:34:37
Could we move all this logic to ActualScript cstor
Clemens Hammacher
2016/12/02 17:44:13
Done, also for WasmVirtualScript.
|
| + if (scriptObj->SourceMappingURL().ToLocal(&tmp)) |
| + script->m_sourceMappingURL = toProtocolString(tmp); |
| + script->m_startLine = scriptObj->LineOffset(); |
| + script->m_startColumn = scriptObj->ColumnOffset(); |
| + std::vector<int> lineEnds = scriptObj->LineEnds(); |
| CHECK(lineEnds.size()); |
| int source_length = lineEnds[lineEnds.size() - 1]; |
| if (lineEnds.size()) { |
| - m_endLine = static_cast<int>(lineEnds.size()) + m_startLine - 1; |
| + script->m_endLine = |
| + static_cast<int>(lineEnds.size()) + script->m_startLine - 1; |
| if (lineEnds.size() > 1) { |
| - m_endColumn = source_length - lineEnds[lineEnds.size() - 2] - 1; |
| + script->m_endColumn = source_length - lineEnds[lineEnds.size() - 2] - 1; |
| } else { |
| - m_endColumn = source_length + m_startColumn; |
| + script->m_endColumn = source_length + script->m_startColumn; |
| } |
| } else { |
| - m_endLine = m_startLine; |
| - m_endColumn = m_startColumn; |
| + script->m_endLine = script->m_startLine; |
| + script->m_endColumn = script->m_startColumn; |
| } |
| - if (script->ContextData().ToLocal(&tmp)) { |
| + if (scriptObj->ContextData().ToLocal(&tmp)) { |
| String16 contextData = toProtocolString(tmp); |
| size_t firstComma = contextData.find(",", 0); |
| size_t secondComma = firstComma != String16::kNotFound |
| @@ -106,39 +200,44 @@ V8DebuggerScript::V8DebuggerScript(v8::Isolate* isolate, |
| String16 executionContextId = |
| contextData.substring(firstComma + 1, secondComma - firstComma - 1); |
| bool isOk = false; |
| - m_executionContextId = executionContextId.toInteger(&isOk); |
| - if (!isOk) m_executionContextId = 0; |
| - m_executionContextAuxData = contextData.substring(secondComma + 1); |
| + script->m_executionContextId = executionContextId.toInteger(&isOk); |
| + if (!isOk) script->m_executionContextId = 0; |
| + script->m_executionContextAuxData = |
| + contextData.substring(secondComma + 1); |
| } |
| } |
| - m_isLiveEdit = isLiveEdit; |
| + script->m_isLiveEdit = isLiveEdit; |
| - if (script->Source().ToLocal(&tmp)) { |
| - m_sourceObj.Reset(m_isolate, tmp); |
| + if (scriptObj->Source().ToLocal(&tmp)) { |
| + script->m_sourceObj.Reset(script->m_isolate, tmp); |
| String16 source = toProtocolString(tmp); |
| // V8 will not count last line if script source ends with \n. |
| if (source.length() > 1 && source[source.length() - 1] == '\n') { |
| - m_endLine++; |
| - m_endColumn = 0; |
| + script->m_endLine++; |
| + script->m_endColumn = 0; |
| } |
| } |
| - m_script.Reset(m_isolate, script); |
| + script->m_script.Reset(script->m_isolate, scriptObj); |
| + return std::move(script); |
| } |
| -V8DebuggerScript::V8DebuggerScript(String16 id, String16 url, String16 source) |
| - : m_id(std::move(id)), m_url(std::move(url)), m_source(std::move(source)) { |
| +std::unique_ptr<V8DebuggerScript> V8DebuggerScript::CreateWasm( |
| + v8::Local<v8::DebugInterface::Script> script, String16 id, String16 url, |
| + String16 source) { |
| int num_lines = 0; |
| int last_newline = -1; |
| - size_t next_newline = m_source.find('\n', last_newline + 1); |
| + size_t next_newline = source.find('\n', last_newline + 1); |
| while (next_newline != String16::kNotFound) { |
| last_newline = static_cast<int>(next_newline); |
| - next_newline = m_source.find('\n', last_newline + 1); |
| + next_newline = source.find('\n', last_newline + 1); |
| ++num_lines; |
| } |
| - m_endLine = num_lines; |
| - m_endColumn = static_cast<int>(m_source.length()) - last_newline - 1; |
| + int m_endLine = num_lines; |
| + int m_endColumn = static_cast<int>(source.length()) - last_newline - 1; |
| + return std::unique_ptr<WasmVirtualScript>(new WasmVirtualScript( |
| + script, std::move(id), std::move(url), std::move(source))); |
| } |
| V8DebuggerScript::~V8DebuggerScript() {} |
| @@ -147,11 +246,6 @@ const String16& V8DebuggerScript::sourceURL() const { |
| return m_sourceURL.isEmpty() ? m_url : m_sourceURL; |
| } |
| -String16 V8DebuggerScript::source(v8::Isolate* isolate) const { |
| - if (m_sourceObj.IsEmpty()) return m_source; |
| - return toProtocolString(m_sourceObj.Get(isolate)); |
| -} |
| - |
| const String16& V8DebuggerScript::hash(v8::Isolate* isolate) const { |
| if (m_hash.isEmpty()) m_hash = calculateHash(source(isolate)); |
| DCHECK(!m_hash.isEmpty()); |
| @@ -162,23 +256,8 @@ void V8DebuggerScript::setSourceURL(const String16& sourceURL) { |
| m_sourceURL = sourceURL; |
| } |
| -void V8DebuggerScript::setSourceMappingURL(const String16& sourceMappingURL) { |
| - m_sourceMappingURL = sourceMappingURL; |
| -} |
| - |
| -void V8DebuggerScript::setSource(v8::Local<v8::String> source) { |
| - m_source = String16(); |
| - m_sourceObj.Reset(m_isolate, source); |
| - m_hash = String16(); |
| -} |
| - |
| -bool V8DebuggerScript::getPossibleBreakpoints( |
| - const v8::DebugInterface::Location& start, |
| - const v8::DebugInterface::Location& end, |
| - std::vector<v8::DebugInterface::Location>* locations) { |
| - v8::HandleScope scope(m_isolate); |
| - v8::Local<v8::DebugInterface::Script> script = m_script.Get(m_isolate); |
| - return script->GetPossibleBreakpoints(start, end, locations); |
| -} |
| +V8DebuggerScript::V8DebuggerScript(v8::Isolate* isolate, String16 id, |
| + String16 url) |
| + : m_id(std::move(id)), m_url(std::move(url)), m_isolate(isolate) {} |
| } // namespace v8_inspector |