| OLD | NEW | 
|---|
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "src/inspector/v8-debugger-script.h" | 5 #include "src/inspector/v8-debugger-script.h" | 
| 6 | 6 | 
|  | 7 #include "src/inspector/inspected-context.h" | 
| 7 #include "src/inspector/string-util.h" | 8 #include "src/inspector/string-util.h" | 
| 8 | 9 | 
| 9 namespace v8_inspector { | 10 namespace v8_inspector { | 
| 10 | 11 | 
| 11 namespace { | 12 namespace { | 
| 12 | 13 | 
| 13 const char hexDigits[17] = "0123456789ABCDEF"; | 14 const char hexDigits[17] = "0123456789ABCDEF"; | 
| 14 | 15 | 
| 15 void appendUnsignedAsHex(uint64_t number, String16Builder* destination) { | 16 void appendUnsignedAsHex(uint64_t number, String16Builder* destination) { | 
| 16   for (size_t i = 0; i < 8; ++i) { | 17   for (size_t i = 0; i < 8; ++i) { | 
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 91       if (lineEnds.size() > 1) { | 92       if (lineEnds.size() > 1) { | 
| 92         m_endColumn = source_length - lineEnds[lineEnds.size() - 2] - 1; | 93         m_endColumn = source_length - lineEnds[lineEnds.size() - 2] - 1; | 
| 93       } else { | 94       } else { | 
| 94         m_endColumn = source_length + m_startColumn; | 95         m_endColumn = source_length + m_startColumn; | 
| 95       } | 96       } | 
| 96     } else { | 97     } else { | 
| 97       m_endLine = m_startLine; | 98       m_endLine = m_startLine; | 
| 98       m_endColumn = m_startColumn; | 99       m_endColumn = m_startColumn; | 
| 99     } | 100     } | 
| 100 | 101 | 
| 101     if (script->ContextData().ToLocal(&tmp)) { | 102     v8::Local<v8::Value> contextData; | 
| 102       String16 contextData = toProtocolString(tmp); | 103     if (script->ContextData().ToLocal(&contextData) && contextData->IsInt32()) { | 
| 103       size_t firstComma = contextData.find(",", 0); | 104       m_executionContextId = | 
| 104       size_t secondComma = firstComma != String16::kNotFound | 105           static_cast<int>(contextData.As<v8::Int32>()->Value()); | 
| 105                                ? contextData.find(",", firstComma + 1) |  | 
| 106                                : String16::kNotFound; |  | 
| 107       if (secondComma != String16::kNotFound) { |  | 
| 108         String16 executionContextId = |  | 
| 109             contextData.substring(firstComma + 1, secondComma - firstComma - 1); |  | 
| 110         bool isOk = false; |  | 
| 111         m_executionContextId = executionContextId.toInteger(&isOk); |  | 
| 112         if (!isOk) m_executionContextId = 0; |  | 
| 113         m_executionContextAuxData = contextData.substring(secondComma + 1); |  | 
| 114       } |  | 
| 115     } | 106     } | 
| 116 | 107 | 
| 117     if (script->Source().ToLocal(&tmp)) { | 108     if (script->Source().ToLocal(&tmp)) { | 
| 118       m_sourceObj.Reset(m_isolate, tmp); | 109       m_sourceObj.Reset(m_isolate, tmp); | 
| 119       String16 source = toProtocolString(tmp); | 110       String16 source = toProtocolString(tmp); | 
| 120       // V8 will not count last line if script source ends with \n. | 111       // V8 will not count last line if script source ends with \n. | 
| 121       if (source.length() > 1 && source[source.length() - 1] == '\n') { | 112       if (source.length() > 1 && source[source.length() - 1] == '\n') { | 
| 122         m_endLine++; | 113         m_endLine++; | 
| 123         m_endColumn = 0; | 114         m_endColumn = 0; | 
| 124       } | 115       } | 
| 125     } | 116     } | 
| 126 | 117 | 
| 127     m_script.Reset(m_isolate, script); | 118     m_script.Reset(m_isolate, script); | 
| 128   } | 119   } | 
| 129 | 120 | 
| 130   bool isLiveEdit() const override { return m_isLiveEdit; } | 121   bool isLiveEdit() const override { return m_isLiveEdit; } | 
| 131 | 122 | 
| 132   const String16& executionContextAuxData() const override { |  | 
| 133     return m_executionContextAuxData; |  | 
| 134   } |  | 
| 135 |  | 
| 136   const String16& sourceMappingURL() const override { | 123   const String16& sourceMappingURL() const override { | 
| 137     return m_sourceMappingURL; | 124     return m_sourceMappingURL; | 
| 138   } | 125   } | 
| 139 | 126 | 
| 140   String16 source(v8::Isolate* isolate) const override { | 127   String16 source(v8::Isolate* isolate) const override { | 
| 141     if (!m_sourceObj.IsEmpty()) | 128     if (!m_sourceObj.IsEmpty()) | 
| 142       return toProtocolString(m_sourceObj.Get(isolate)); | 129       return toProtocolString(m_sourceObj.Get(isolate)); | 
| 143     return V8DebuggerScript::source(isolate); | 130     return V8DebuggerScript::source(isolate); | 
| 144   } | 131   } | 
| 145 | 132 | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
| 164  private: | 151  private: | 
| 165   String16 GetNameOrSourceUrl(v8::Local<v8::debug::Script> script) { | 152   String16 GetNameOrSourceUrl(v8::Local<v8::debug::Script> script) { | 
| 166     v8::Local<v8::String> name; | 153     v8::Local<v8::String> name; | 
| 167     if (script->Name().ToLocal(&name) || script->SourceURL().ToLocal(&name)) | 154     if (script->Name().ToLocal(&name) || script->SourceURL().ToLocal(&name)) | 
| 168       return toProtocolString(name); | 155       return toProtocolString(name); | 
| 169     return String16(); | 156     return String16(); | 
| 170   } | 157   } | 
| 171 | 158 | 
| 172   String16 m_sourceMappingURL; | 159   String16 m_sourceMappingURL; | 
| 173   v8::Global<v8::String> m_sourceObj; | 160   v8::Global<v8::String> m_sourceObj; | 
| 174   String16 m_executionContextAuxData; |  | 
| 175   bool m_isLiveEdit = false; | 161   bool m_isLiveEdit = false; | 
| 176   v8::Global<v8::debug::Script> m_script; | 162   v8::Global<v8::debug::Script> m_script; | 
| 177 }; | 163 }; | 
| 178 | 164 | 
| 179 class WasmVirtualScript : public V8DebuggerScript { | 165 class WasmVirtualScript : public V8DebuggerScript { | 
| 180   friend class V8DebuggerScript; | 166   friend class V8DebuggerScript; | 
| 181 | 167 | 
| 182  public: | 168  public: | 
| 183   WasmVirtualScript(v8::Isolate* isolate, | 169   WasmVirtualScript(v8::Isolate* isolate, | 
| 184                     v8::Local<v8::debug::WasmScript> script, String16 id, | 170                     v8::Local<v8::debug::WasmScript> script, String16 id, | 
| 185                     String16 url, String16 source) | 171                     String16 url, String16 source) | 
| 186       : V8DebuggerScript(isolate, std::move(id), std::move(url)), | 172       : V8DebuggerScript(isolate, std::move(id), std::move(url)), | 
| 187         m_script(isolate, script) { | 173         m_script(isolate, script) { | 
| 188     int num_lines = 0; | 174     int num_lines = 0; | 
| 189     int last_newline = -1; | 175     int last_newline = -1; | 
| 190     size_t next_newline = source.find('\n', last_newline + 1); | 176     size_t next_newline = source.find('\n', last_newline + 1); | 
| 191     while (next_newline != String16::kNotFound) { | 177     while (next_newline != String16::kNotFound) { | 
| 192       last_newline = static_cast<int>(next_newline); | 178       last_newline = static_cast<int>(next_newline); | 
| 193       next_newline = source.find('\n', last_newline + 1); | 179       next_newline = source.find('\n', last_newline + 1); | 
| 194       ++num_lines; | 180       ++num_lines; | 
| 195     } | 181     } | 
| 196     m_endLine = num_lines; | 182     m_endLine = num_lines; | 
| 197     m_endColumn = static_cast<int>(source.length()) - last_newline - 1; | 183     m_endColumn = static_cast<int>(source.length()) - last_newline - 1; | 
| 198     m_source = std::move(source); | 184     m_source = std::move(source); | 
| 199   } | 185   } | 
| 200 | 186 | 
| 201   const String16& sourceMappingURL() const override { return emptyString(); } | 187   const String16& sourceMappingURL() const override { return emptyString(); } | 
| 202   const String16& executionContextAuxData() const override { |  | 
| 203     return emptyString(); |  | 
| 204   } |  | 
| 205   bool isLiveEdit() const override { return false; } | 188   bool isLiveEdit() const override { return false; } | 
| 206   void setSourceMappingURL(const String16&) override {} | 189   void setSourceMappingURL(const String16&) override {} | 
| 207 | 190 | 
| 208   bool getPossibleBreakpoints( | 191   bool getPossibleBreakpoints( | 
| 209       const v8::debug::Location& start, const v8::debug::Location& end, | 192       const v8::debug::Location& start, const v8::debug::Location& end, | 
| 210       std::vector<v8::debug::Location>* locations) override { | 193       std::vector<v8::debug::Location>* locations) override { | 
| 211     // TODO(clemensh): Returning false produces the protocol error "Internal | 194     // TODO(clemensh): Returning false produces the protocol error "Internal | 
| 212     // error". Implement and fix expected output of | 195     // error". Implement and fix expected output of | 
| 213     // wasm-get-breakable-locations.js. | 196     // wasm-get-breakable-locations.js. | 
| 214     return false; | 197     return false; | 
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 254   if (m_hash.isEmpty()) m_hash = calculateHash(source(isolate)); | 237   if (m_hash.isEmpty()) m_hash = calculateHash(source(isolate)); | 
| 255   DCHECK(!m_hash.isEmpty()); | 238   DCHECK(!m_hash.isEmpty()); | 
| 256   return m_hash; | 239   return m_hash; | 
| 257 } | 240 } | 
| 258 | 241 | 
| 259 void V8DebuggerScript::setSourceURL(const String16& sourceURL) { | 242 void V8DebuggerScript::setSourceURL(const String16& sourceURL) { | 
| 260   m_sourceURL = sourceURL; | 243   m_sourceURL = sourceURL; | 
| 261 } | 244 } | 
| 262 | 245 | 
| 263 }  // namespace v8_inspector | 246 }  // namespace v8_inspector | 
| OLD | NEW | 
|---|