| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "bin/dbg_connection.h" | 5 #include "bin/dbg_connection.h" |
| 6 #include "bin/dartutils.h" | 6 #include "bin/dartutils.h" |
| 7 #include "bin/socket.h" | 7 #include "bin/socket.h" |
| 8 #include "bin/thread.h" | 8 #include "bin/thread.h" |
| 9 #include "bin/utils.h" | 9 #include "bin/utils.h" |
| 10 | 10 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 class MessageBuffer { | 48 class MessageBuffer { |
| 49 public: | 49 public: |
| 50 explicit MessageBuffer(int fd); | 50 explicit MessageBuffer(int fd); |
| 51 ~MessageBuffer(); | 51 ~MessageBuffer(); |
| 52 void ReadData(); | 52 void ReadData(); |
| 53 bool IsValidMessage() const; | 53 bool IsValidMessage() const; |
| 54 void PopMessage(); | 54 void PopMessage(); |
| 55 int MessageId() const; | 55 int MessageId() const; |
| 56 const char* Params() const; | 56 const char* Params() const; |
| 57 intptr_t GetIntParam(const char* name) const; | 57 intptr_t GetIntParam(const char* name) const; |
| 58 // GetStringParam mallocs the buffer that it returns. Caller must free. |
| 59 char* GetStringParam(const char* name) const; |
| 58 char* buf() const { return buf_; } | 60 char* buf() const { return buf_; } |
| 59 bool Alive() const { return connection_is_alive_; } | 61 bool Alive() const { return connection_is_alive_; } |
| 60 | 62 |
| 61 private: | 63 private: |
| 62 static const int kInitialBufferSize = 256; | 64 static const int kInitialBufferSize = 256; |
| 63 char* buf_; | 65 char* buf_; |
| 64 int buf_length_; | 66 int buf_length_; |
| 65 int fd_; | 67 int fd_; |
| 66 int data_length_; | 68 int data_length_; |
| 67 bool connection_is_alive_; | 69 bool connection_is_alive_; |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 | 128 |
| 127 intptr_t MessageBuffer::GetIntParam(const char* name) const { | 129 intptr_t MessageBuffer::GetIntParam(const char* name) const { |
| 128 const char* params = Params(); | 130 const char* params = Params(); |
| 129 ASSERT(params != NULL); | 131 ASSERT(params != NULL); |
| 130 dart::JSONReader r(params); | 132 dart::JSONReader r(params); |
| 131 r.Seek(name); | 133 r.Seek(name); |
| 132 ASSERT(r.Type() == dart::JSONReader::kInteger); | 134 ASSERT(r.Type() == dart::JSONReader::kInteger); |
| 133 return strtol(r.ValueChars(), NULL, 10); | 135 return strtol(r.ValueChars(), NULL, 10); |
| 134 } | 136 } |
| 135 | 137 |
| 138 char* MessageBuffer::GetStringParam(const char* name) const { |
| 139 const char* params = Params(); |
| 140 ASSERT(params != NULL); |
| 141 dart::JSONReader pr(params); |
| 142 pr.Seek(name); |
| 143 if (pr.Type() != dart::JSONReader::kString) { |
| 144 return NULL; |
| 145 } |
| 146 intptr_t buflen = pr.ValueLen() + 1; |
| 147 char* param_chars = reinterpret_cast<char*>(malloc(buflen)); |
| 148 pr.GetValueChars(param_chars, buflen); |
| 149 // TODO(hausner): Decode escape sequences. |
| 150 return param_chars; |
| 151 } |
| 136 | 152 |
| 137 void MessageBuffer::ReadData() { | 153 void MessageBuffer::ReadData() { |
| 138 ASSERT(data_length_ >= 0); | 154 ASSERT(data_length_ >= 0); |
| 139 ASSERT(data_length_ < buf_length_); | 155 ASSERT(data_length_ < buf_length_); |
| 140 int max_read = buf_length_ - data_length_ - 1; | 156 int max_read = buf_length_ - data_length_ - 1; |
| 141 if (max_read == 0) { | 157 if (max_read == 0) { |
| 142 // TODO(hausner): | 158 // TODO(hausner): |
| 143 // Buffer is full. What should we do if there is no valid message | 159 // Buffer is full. What should we do if there is no valid message |
| 144 // in the buffer? This might be possible if the client sends a message | 160 // in the buffer? This might be possible if the client sends a message |
| 145 // that's larger than the buffer, of if the client sends malformed | 161 // that's larger than the buffer, of if the client sends malformed |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 Dart_Handle res = Dart_StringToCString(str, &chars); | 235 Dart_Handle res = Dart_StringToCString(str, &chars); |
| 220 ASSERT(!Dart_IsError(res)); | 236 ASSERT(!Dart_IsError(res)); |
| 221 return chars; | 237 return chars; |
| 222 } | 238 } |
| 223 | 239 |
| 224 | 240 |
| 225 static int GetIntValue(Dart_Handle int_handle) { | 241 static int GetIntValue(Dart_Handle int_handle) { |
| 226 int64_t int64_val = -1; | 242 int64_t int64_val = -1; |
| 227 ASSERT(Dart_IsInteger(int_handle)); | 243 ASSERT(Dart_IsInteger(int_handle)); |
| 228 Dart_Handle res = Dart_IntegerToInt64(int_handle, &int64_val); | 244 Dart_Handle res = Dart_IntegerToInt64(int_handle, &int64_val); |
| 229 ASSERT(!Dart_IsError(res)); | 245 ASSERT_NOT_ERROR(res); |
| 230 // TODO(hausner): Range check. | 246 // TODO(hausner): Range check. |
| 231 return int64_val; | 247 return int64_val; |
| 232 } | 248 } |
| 233 | 249 |
| 234 | 250 |
| 235 void DebuggerConnectionHandler::HandleResumeCmd(const char* json_msg) { | 251 void DebuggerConnectionHandler::HandleResumeCmd(const char* json_msg) { |
| 236 int msg_id = msgbuf_->MessageId(); | 252 int msg_id = msgbuf_->MessageId(); |
| 237 dart::TextBuffer msg(64); | 253 dart::TextBuffer msg(64); |
| 238 msg.Printf("{ \"id\": %d }", msg_id); | 254 msg.Printf("{ \"id\": %d }", msg_id); |
| 239 SendMsg(&msg); | 255 SendMsg(&msg); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 255 } | 271 } |
| 256 | 272 |
| 257 | 273 |
| 258 void DebuggerConnectionHandler::HandleStepOverCmd(const char* json_msg) { | 274 void DebuggerConnectionHandler::HandleStepOverCmd(const char* json_msg) { |
| 259 Dart_Handle res = Dart_SetStepOver(); | 275 Dart_Handle res = Dart_SetStepOver(); |
| 260 ASSERT_NOT_ERROR(res); | 276 ASSERT_NOT_ERROR(res); |
| 261 HandleResumeCmd(json_msg); | 277 HandleResumeCmd(json_msg); |
| 262 } | 278 } |
| 263 | 279 |
| 264 | 280 |
| 281 static void FormatEncodedString(dart::TextBuffer* buf, Dart_Handle str) { |
| 282 ASSERT(Dart_IsString8(str)); |
| 283 intptr_t str_len = 0; |
| 284 Dart_Handle res = Dart_StringLength(str, &str_len); |
| 285 ASSERT_NOT_ERROR(res); |
| 286 uint8_t* codepoints = reinterpret_cast<uint8_t*>(malloc(str_len)); |
| 287 ASSERT(codepoints != NULL); |
| 288 intptr_t actual_len = str_len; |
| 289 res = Dart_StringGet8(str, codepoints, &actual_len); |
| 290 ASSERT(str_len == actual_len); |
| 291 buf->Printf("\""); |
| 292 buf->PrintJsonString8(codepoints, str_len); |
| 293 buf->Printf("\""); |
| 294 free(codepoints); |
| 295 } |
| 296 |
| 297 |
| 298 static void FormatErrorMsg(dart::TextBuffer* buf, Dart_Handle err) { |
| 299 // TODO(hausner): Turn message into Dart string and |
| 300 // properly encode the message. |
| 301 ASSERT(Dart_IsError(err)); |
| 302 const char* msg = Dart_GetError(err); |
| 303 buf->Printf("\"%s\"", msg); |
| 304 } |
| 305 |
| 306 |
| 265 void DebuggerConnectionHandler::HandleGetScriptURLsCmd(const char* json_msg) { | 307 void DebuggerConnectionHandler::HandleGetScriptURLsCmd(const char* json_msg) { |
| 266 int msg_id = msgbuf_->MessageId(); | 308 int msg_id = msgbuf_->MessageId(); |
| 267 dart::TextBuffer msg(64); | 309 dart::TextBuffer msg(64); |
| 268 intptr_t lib_id = msgbuf_->GetIntParam("libraryId"); | 310 intptr_t lib_id = msgbuf_->GetIntParam("libraryId"); |
| 269 Dart_Handle lib_url = Dart_GetLibraryURL(lib_id); | 311 Dart_Handle lib_url = Dart_GetLibraryURL(lib_id); |
| 270 ASSERT_NOT_ERROR(lib_url); | 312 ASSERT_NOT_ERROR(lib_url); |
| 271 Dart_Handle urls = Dart_GetScriptURLs(lib_url); | 313 Dart_Handle urls = Dart_GetScriptURLs(lib_url); |
| 272 if (Dart_IsError(urls)) { | 314 if (Dart_IsError(urls)) { |
| 273 SendError(msg_id, Dart_GetError(urls)); | 315 SendError(msg_id, Dart_GetError(urls)); |
| 274 return; | 316 return; |
| 275 } | 317 } |
| 276 ASSERT(Dart_IsList(urls)); | 318 ASSERT(Dart_IsList(urls)); |
| 277 intptr_t num_urls = 0; | 319 intptr_t num_urls = 0; |
| 278 Dart_ListLength(urls, &num_urls); | 320 Dart_ListLength(urls, &num_urls); |
| 279 msg.Printf("{ \"id\": %d, ", msg_id); | 321 msg.Printf("{ \"id\": %d, ", msg_id); |
| 280 msg.Printf("\"result\": { \"urls\": ["); | 322 msg.Printf("\"result\": { \"urls\": ["); |
| 281 for (int i = 0; i < num_urls; i++) { | 323 for (int i = 0; i < num_urls; i++) { |
| 282 Dart_Handle script_url = Dart_ListGetAt(urls, i); | 324 Dart_Handle script_url = Dart_ListGetAt(urls, i); |
| 283 msg.Printf("%s\"%s\"", (i == 0) ? "" : ", ", GetStringChars(script_url)); | 325 if (i > 0) { |
| 326 msg.Printf(","); |
| 327 } |
| 328 FormatEncodedString(&msg, script_url); |
| 284 } | 329 } |
| 285 msg.Printf("] }}"); | 330 msg.Printf("]}}"); |
| 331 SendMsg(&msg); |
| 332 } |
| 333 |
| 334 |
| 335 void DebuggerConnectionHandler::HandleGetSourceCmd(const char* json_msg) { |
| 336 int msg_id = msgbuf_->MessageId(); |
| 337 dart::TextBuffer msg(64); |
| 338 intptr_t lib_id = msgbuf_->GetIntParam("libraryId"); |
| 339 char* url_chars = msgbuf_->GetStringParam("url"); |
| 340 ASSERT(url_chars != NULL); |
| 341 Dart_Handle url = Dart_NewString(url_chars); |
| 342 ASSERT_NOT_ERROR(url); |
| 343 free(url_chars); |
| 344 url_chars = NULL; |
| 345 Dart_Handle source = Dart_ScriptGetSource(lib_id, url); |
| 346 if (Dart_IsError(source)) { |
| 347 SendError(msg_id, Dart_GetError(source)); |
| 348 return; |
| 349 } |
| 350 msg.Printf("{ \"id\": %d, ", msg_id); |
| 351 msg.Printf("\"result\": { \"text\": "); |
| 352 FormatEncodedString(&msg, source); |
| 353 msg.Printf("}}"); |
| 286 SendMsg(&msg); | 354 SendMsg(&msg); |
| 287 } | 355 } |
| 288 | 356 |
| 289 | 357 |
| 290 void DebuggerConnectionHandler::HandleGetLibrariesCmd(const char* json_msg) { | 358 void DebuggerConnectionHandler::HandleGetLibrariesCmd(const char* json_msg) { |
| 291 int msg_id = msgbuf_->MessageId(); | 359 int msg_id = msgbuf_->MessageId(); |
| 292 dart::TextBuffer msg(64); | 360 dart::TextBuffer msg(64); |
| 293 msg.Printf("{ \"id\": %d, \"result\": { \"libraries\": [", msg_id); | 361 msg.Printf("{ \"id\": %d, \"result\": { \"libraries\": [", msg_id); |
| 294 Dart_Handle lib_ids = Dart_GetLibraryIds(); | 362 Dart_Handle lib_ids = Dart_GetLibraryIds(); |
| 295 ASSERT_NOT_ERROR(lib_ids); | 363 ASSERT_NOT_ERROR(lib_ids); |
| 296 intptr_t num_libs; | 364 intptr_t num_libs; |
| 297 Dart_Handle res = Dart_ListLength(lib_ids, &num_libs); | 365 Dart_Handle res = Dart_ListLength(lib_ids, &num_libs); |
| 298 ASSERT_NOT_ERROR(res); | 366 ASSERT_NOT_ERROR(res); |
| 299 for (int i = 0; i < num_libs; i++) { | 367 for (int i = 0; i < num_libs; i++) { |
| 300 Dart_Handle lib_id_handle = Dart_ListGetAt(lib_ids, i); | 368 Dart_Handle lib_id_handle = Dart_ListGetAt(lib_ids, i); |
| 301 ASSERT(Dart_IsInteger(lib_id_handle)); | 369 ASSERT(Dart_IsInteger(lib_id_handle)); |
| 302 int lib_id = GetIntValue(lib_id_handle); | 370 int lib_id = GetIntValue(lib_id_handle); |
| 303 Dart_Handle lib_url = Dart_GetLibraryURL(lib_id); | 371 Dart_Handle lib_url = Dart_GetLibraryURL(lib_id); |
| 304 ASSERT_NOT_ERROR(lib_url); | 372 ASSERT_NOT_ERROR(lib_url); |
| 305 ASSERT(!Dart_IsNull(lib_url)); | |
| 306 ASSERT(Dart_IsString(lib_url)); | 373 ASSERT(Dart_IsString(lib_url)); |
| 307 char const* chars = NULL; | 374 msg.Printf("%s{\"id\":%d,\"url\":", (i == 0) ? "" : ", ", lib_id); |
| 308 Dart_StringToCString(lib_url, &chars); | 375 FormatEncodedString(&msg, lib_url); |
| 309 msg.Printf("%s{\"id\":%d,\"url\":\"%s\"}", | 376 msg.Printf("}"); |
| 310 (i == 0) ? "" : ", ", lib_id, chars); | |
| 311 } | 377 } |
| 312 msg.Printf("]}}"); | 378 msg.Printf("]}}"); |
| 313 SendMsg(&msg); | 379 SendMsg(&msg); |
| 314 } | 380 } |
| 315 | 381 |
| 316 | 382 |
| 317 static void FormatField(dart::TextBuffer* buf, | 383 static void FormatField(dart::TextBuffer* buf, |
| 318 Dart_Handle object_name, | 384 Dart_Handle object_name, |
| 319 Dart_Handle object) { | 385 Dart_Handle object) { |
| 320 ASSERT(Dart_IsString(object_name)); | 386 ASSERT(Dart_IsString(object_name)); |
| 321 buf->Printf("{\"name\":\"%s\",", GetStringChars(object_name)); | 387 buf->Printf("{\"name\":\"%s\",", GetStringChars(object_name)); |
| 322 intptr_t obj_id = Dart_CacheObject(object); | 388 intptr_t obj_id = Dart_CacheObject(object); |
| 323 ASSERT(obj_id >= 0); | 389 ASSERT(obj_id >= 0); |
| 324 buf->Printf("\"value\":{\"objectId\":%d,", obj_id); | 390 buf->Printf("\"value\":{\"objectId\":%d,", obj_id); |
| 325 const char* kind = "object"; | 391 const char* kind = "object"; |
| 326 if (Dart_IsInteger(object)) { | 392 if (Dart_IsInteger(object)) { |
| 327 kind = "integer"; | 393 kind = "integer"; |
| 328 } else if (Dart_IsString(object)) { | 394 } else if (Dart_IsString(object)) { |
| 329 kind = "string"; | 395 kind = "string"; |
| 330 } else if (Dart_IsBoolean(object)) { | 396 } else if (Dart_IsBoolean(object)) { |
| 331 kind = "boolean"; | 397 kind = "boolean"; |
| 332 } | 398 } |
| 333 buf->Printf("\"kind\":\"%s\",", kind); | 399 buf->Printf("\"kind\":\"%s\",", kind); |
| 334 Dart_Handle text = Dart_ToString(object); | 400 buf->Printf("\"text\":"); |
| 335 buf->Printf("\"text\":\"%s\"}}", GetStringChars(text)); | 401 Dart_Handle text; |
| 402 if (Dart_IsNull(object)) { |
| 403 text = Dart_Null(); |
| 404 } else { |
| 405 text = Dart_ToString(object); |
| 406 } |
| 407 if (Dart_IsNull(text)) { |
| 408 buf->Printf("null"); |
| 409 } else if (Dart_IsError(text)) { |
| 410 FormatErrorMsg(buf, text); |
| 411 } else { |
| 412 FormatEncodedString(buf, text); |
| 413 } |
| 414 buf->Printf("}}"); |
| 336 } | 415 } |
| 337 | 416 |
| 338 | 417 |
| 339 static void FormatFieldList(dart::TextBuffer* buf, | 418 static void FormatFieldList(dart::TextBuffer* buf, |
| 340 Dart_Handle obj_list) { | 419 Dart_Handle obj_list) { |
| 341 ASSERT(Dart_IsList(obj_list)); | 420 ASSERT(Dart_IsList(obj_list)); |
| 342 intptr_t list_length = 0; | 421 intptr_t list_length = 0; |
| 343 Dart_Handle res = Dart_ListLength(obj_list, &list_length); | 422 Dart_Handle res = Dart_ListLength(obj_list, &list_length); |
| 344 ASSERT_NOT_ERROR(res); | 423 ASSERT_NOT_ERROR(res); |
| 345 ASSERT(list_length % 2 == 0); | 424 ASSERT(list_length % 2 == 0); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 377 FormatFieldList(buf, static_fields); | 456 FormatFieldList(buf, static_fields); |
| 378 buf->Printf("}"); | 457 buf->Printf("}"); |
| 379 return NULL; | 458 return NULL; |
| 380 } | 459 } |
| 381 | 460 |
| 382 | 461 |
| 383 static const char* FormatLibraryProps(dart::TextBuffer* buf, | 462 static const char* FormatLibraryProps(dart::TextBuffer* buf, |
| 384 intptr_t lib_id) { | 463 intptr_t lib_id) { |
| 385 Dart_Handle url = Dart_GetLibraryURL(lib_id); | 464 Dart_Handle url = Dart_GetLibraryURL(lib_id); |
| 386 RETURN_IF_ERROR(url); | 465 RETURN_IF_ERROR(url); |
| 387 buf->Printf("{\"url\":\"%s\",", GetStringChars(url)); | 466 buf->Printf("{\"url\":"); |
| 467 FormatEncodedString(buf, url); |
| 388 | 468 |
| 389 // Imports and prefixes. | 469 // Imports and prefixes. |
| 390 Dart_Handle import_list = Dart_GetLibraryImports(lib_id); | 470 Dart_Handle import_list = Dart_GetLibraryImports(lib_id); |
| 391 RETURN_IF_ERROR(import_list); | 471 RETURN_IF_ERROR(import_list); |
| 392 ASSERT(Dart_IsList(import_list)); | 472 ASSERT(Dart_IsList(import_list)); |
| 393 intptr_t list_length = 0; | 473 intptr_t list_length = 0; |
| 394 Dart_Handle res = Dart_ListLength(import_list, &list_length); | 474 Dart_Handle res = Dart_ListLength(import_list, &list_length); |
| 395 RETURN_IF_ERROR(res); | 475 RETURN_IF_ERROR(res); |
| 396 buf->Printf("\"imports\":["); | 476 buf->Printf(",\"imports\":["); |
| 397 for (int i = 0; i + 1 < list_length; i += 2) { | 477 for (int i = 0; i + 1 < list_length; i += 2) { |
| 398 Dart_Handle lib_id = Dart_ListGetAt(import_list, i + 1); | 478 Dart_Handle lib_id = Dart_ListGetAt(import_list, i + 1); |
| 399 ASSERT_NOT_ERROR(lib_id); | 479 ASSERT_NOT_ERROR(lib_id); |
| 400 buf->Printf("%s{\"libraryId\":%d,", | 480 buf->Printf("%s{\"libraryId\":%d,", |
| 401 (i > 0) ? ",": "", | 481 (i > 0) ? ",": "", |
| 402 GetIntValue(lib_id)); | 482 GetIntValue(lib_id)); |
| 403 | 483 |
| 404 Dart_Handle name = Dart_ListGetAt(import_list, i); | 484 Dart_Handle name = Dart_ListGetAt(import_list, i); |
| 405 ASSERT_NOT_ERROR(name); | 485 ASSERT_NOT_ERROR(name); |
| 406 buf->Printf("\"prefix\":\"%s\"}", | 486 buf->Printf("\"prefix\":\"%s\"}", |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 443 msg->Printf("\"callFrames\" : [ "); | 523 msg->Printf("\"callFrames\" : [ "); |
| 444 for (int i = 0; i < trace_len; i++) { | 524 for (int i = 0; i < trace_len; i++) { |
| 445 Dart_ActivationFrame frame; | 525 Dart_ActivationFrame frame; |
| 446 res = Dart_GetActivationFrame(trace, i, &frame); | 526 res = Dart_GetActivationFrame(trace, i, &frame); |
| 447 ASSERT_NOT_ERROR(res); | 527 ASSERT_NOT_ERROR(res); |
| 448 Dart_Handle func_name; | 528 Dart_Handle func_name; |
| 449 Dart_Handle script_url; | 529 Dart_Handle script_url; |
| 450 intptr_t line_number = 0; | 530 intptr_t line_number = 0; |
| 451 res = Dart_ActivationFrameInfo( | 531 res = Dart_ActivationFrameInfo( |
| 452 frame, &func_name, &script_url, &line_number); | 532 frame, &func_name, &script_url, &line_number); |
| 533 |
| 453 ASSERT_NOT_ERROR(res); | 534 ASSERT_NOT_ERROR(res); |
| 454 ASSERT(Dart_IsString(func_name)); | 535 ASSERT(Dart_IsString(func_name)); |
| 455 const char* func_name_chars; | 536 msg->Printf("%s{\"functionName\":", (i > 0) ? "," : ""); |
| 456 Dart_StringToCString(func_name, &func_name_chars); | 537 FormatEncodedString(msg, func_name); |
| 457 msg->Printf("%s { \"functionName\": \"%s\" , ", | 538 |
| 458 i > 0 ? "," : "", | |
| 459 func_name_chars); | |
| 460 ASSERT(Dart_IsString(script_url)); | 539 ASSERT(Dart_IsString(script_url)); |
| 461 const char* script_url_chars; | 540 msg->Printf(",\"location\": { \"url\":"); |
| 462 Dart_StringToCString(script_url, &script_url_chars); | 541 FormatEncodedString(msg, script_url); |
| 463 msg->Printf("\"location\": { \"url\": \"%s\", \"lineNumber\":%d},", | 542 msg->Printf(",\"lineNumber\":%d},", line_number); |
| 464 script_url_chars, line_number); | 543 |
| 465 Dart_Handle locals = Dart_GetLocalVariables(frame); | 544 Dart_Handle locals = Dart_GetLocalVariables(frame); |
| 466 ASSERT_NOT_ERROR(locals); | 545 ASSERT_NOT_ERROR(locals); |
| 467 msg->Printf("\"locals\":"); | 546 msg->Printf("\"locals\":"); |
| 468 FormatFieldList(msg, locals); | 547 FormatFieldList(msg, locals); |
| 469 msg->Printf("}"); | 548 msg->Printf("}"); |
| 470 } | 549 } |
| 471 msg->Printf("]"); | 550 msg->Printf("]"); |
| 472 } | 551 } |
| 473 | 552 |
| 474 | 553 |
| 475 void DebuggerConnectionHandler::HandleGetStackTraceCmd(const char* json_msg) { | 554 void DebuggerConnectionHandler::HandleGetStackTraceCmd(const char* json_msg) { |
| 476 int msg_id = msgbuf_->MessageId(); | 555 int msg_id = msgbuf_->MessageId(); |
| 477 Dart_StackTrace trace; | 556 Dart_StackTrace trace; |
| 478 Dart_Handle res = Dart_GetStackTrace(&trace); | 557 Dart_Handle res = Dart_GetStackTrace(&trace); |
| 479 ASSERT_NOT_ERROR(res); | 558 ASSERT_NOT_ERROR(res); |
| 480 dart::TextBuffer msg(128); | 559 dart::TextBuffer msg(128); |
| 481 msg.Printf("{ \"id\": %d, \"result\": {", msg_id); | 560 msg.Printf("{ \"id\": %d, \"result\": {", msg_id); |
| 482 FormatCallFrames(&msg, trace); | 561 FormatCallFrames(&msg, trace); |
| 483 msg.Printf("}}"); | 562 msg.Printf("}}"); |
| 484 SendMsg(&msg); | 563 SendMsg(&msg); |
| 485 } | 564 } |
| 486 | 565 |
| 487 | 566 |
| 488 void DebuggerConnectionHandler::HandleSetBpCmd(const char* json_msg) { | 567 void DebuggerConnectionHandler::HandleSetBpCmd(const char* json_msg) { |
| 489 int msg_id = msgbuf_->MessageId(); | 568 int msg_id = msgbuf_->MessageId(); |
| 490 const char* params = msgbuf_->Params(); | 569 char* url_chars = msgbuf_->GetStringParam("url"); |
| 491 ASSERT(params != NULL); | 570 ASSERT(url_chars != NULL); |
| 492 dart::JSONReader pr(params); | |
| 493 pr.Seek("url"); | |
| 494 ASSERT(pr.Type() == dart::JSONReader::kString); | |
| 495 char url_chars[128]; | |
| 496 pr.GetValueChars(url_chars, sizeof(url_chars)); | |
| 497 Dart_Handle url = Dart_NewString(url_chars); | 571 Dart_Handle url = Dart_NewString(url_chars); |
| 498 ASSERT_NOT_ERROR(url); | 572 ASSERT_NOT_ERROR(url); |
| 499 pr.Seek("line"); | 573 free(url_chars); |
| 500 ASSERT(pr.Type() == dart::JSONReader::kInteger); | 574 url_chars = NULL; |
| 501 intptr_t line_number = atoi(pr.ValueChars()); | 575 intptr_t line_number = msgbuf_->GetIntParam("line"); |
| 502 Dart_Handle bp_id = Dart_SetBreakpoint(url, line_number); | 576 Dart_Handle bp_id = Dart_SetBreakpoint(url, line_number); |
| 503 if (Dart_IsError(bp_id)) { | 577 if (Dart_IsError(bp_id)) { |
| 504 SendError(msg_id, Dart_GetError(bp_id)); | 578 SendError(msg_id, Dart_GetError(bp_id)); |
| 505 return; | 579 return; |
| 506 } | 580 } |
| 507 ASSERT(Dart_IsInteger(bp_id)); | 581 ASSERT(Dart_IsInteger(bp_id)); |
| 508 uint64_t bp_id_value; | 582 uint64_t bp_id_value; |
| 509 Dart_Handle res = Dart_IntegerToUint64(bp_id, &bp_id_value); | 583 Dart_Handle res = Dart_IntegerToUint64(bp_id, &bp_id_value); |
| 510 ASSERT_NOT_ERROR(res); | 584 ASSERT_NOT_ERROR(res); |
| 511 dart::TextBuffer msg(64); | 585 dart::TextBuffer msg(64); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 587 | 661 |
| 588 | 662 |
| 589 void DebuggerConnectionHandler::HandleMessages() { | 663 void DebuggerConnectionHandler::HandleMessages() { |
| 590 static JSONDebuggerCommand debugger_commands[] = { | 664 static JSONDebuggerCommand debugger_commands[] = { |
| 591 { "resume", HandleResumeCmd }, | 665 { "resume", HandleResumeCmd }, |
| 592 { "getLibraries", HandleGetLibrariesCmd }, | 666 { "getLibraries", HandleGetLibrariesCmd }, |
| 593 { "getClassProperties", HandleGetClassPropsCmd }, | 667 { "getClassProperties", HandleGetClassPropsCmd }, |
| 594 { "getLibraryProperties", HandleGetLibPropsCmd }, | 668 { "getLibraryProperties", HandleGetLibPropsCmd }, |
| 595 { "getObjectProperties", HandleGetObjPropsCmd }, | 669 { "getObjectProperties", HandleGetObjPropsCmd }, |
| 596 { "getScriptURLs", HandleGetScriptURLsCmd }, | 670 { "getScriptURLs", HandleGetScriptURLsCmd }, |
| 671 { "getScriptSource", HandleGetSourceCmd }, |
| 597 { "getStackTrace", HandleGetStackTraceCmd }, | 672 { "getStackTrace", HandleGetStackTraceCmd }, |
| 598 { "setBreakpoint", HandleSetBpCmd }, | 673 { "setBreakpoint", HandleSetBpCmd }, |
| 599 { "removeBreakpoint", HandleRemBpCmd }, | 674 { "removeBreakpoint", HandleRemBpCmd }, |
| 600 { "stepInto", HandleStepIntoCmd }, | 675 { "stepInto", HandleStepIntoCmd }, |
| 601 { "stepOut", HandleStepOutCmd }, | 676 { "stepOut", HandleStepOutCmd }, |
| 602 { "stepOver", HandleStepOverCmd }, | 677 { "stepOver", HandleStepOverCmd }, |
| 603 { NULL, NULL } | 678 { NULL, NULL } |
| 604 }; | 679 }; |
| 605 | 680 |
| 606 for (;;) { | 681 for (;;) { |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 675 Dart_ExitScope(); | 750 Dart_ExitScope(); |
| 676 } | 751 } |
| 677 | 752 |
| 678 | 753 |
| 679 void DebuggerConnectionHandler::BptResolvedHandler(intptr_t bp_id, | 754 void DebuggerConnectionHandler::BptResolvedHandler(intptr_t bp_id, |
| 680 Dart_Handle url, | 755 Dart_Handle url, |
| 681 intptr_t line_number) { | 756 intptr_t line_number) { |
| 682 Dart_EnterScope(); | 757 Dart_EnterScope(); |
| 683 dart::TextBuffer msg(128); | 758 dart::TextBuffer msg(128); |
| 684 msg.Printf("{ \"event\": \"breakpointResolved\", \"params\": {"); | 759 msg.Printf("{ \"event\": \"breakpointResolved\", \"params\": {"); |
| 685 msg.Printf("\"breakpointId\": %d, ", bp_id); | 760 msg.Printf("\"breakpointId\": %d, \"url\":", bp_id); |
| 686 char const* url_chars; | 761 FormatEncodedString(&msg, url); |
| 687 Dart_StringToCString(url, &url_chars); | 762 msg.Printf(",\"line\": %d }}", line_number); |
| 688 msg.Printf("\"url\": \"%s\", ", url_chars); | |
| 689 msg.Printf("\"line\": %d }}", line_number); | |
| 690 QueueMsg(&msg); | 763 QueueMsg(&msg); |
| 691 Dart_ExitScope(); | 764 Dart_ExitScope(); |
| 692 } | 765 } |
| 693 | 766 |
| 694 | 767 |
| 695 void DebuggerConnectionHandler::AcceptDbgConnection(int debugger_fd) { | 768 void DebuggerConnectionHandler::AcceptDbgConnection(int debugger_fd) { |
| 696 debugger_fd_ = debugger_fd; | 769 debugger_fd_ = debugger_fd; |
| 697 ASSERT(msgbuf_ == NULL); | 770 ASSERT(msgbuf_ == NULL); |
| 698 msgbuf_ = new MessageBuffer(debugger_fd_); | 771 msgbuf_ = new MessageBuffer(debugger_fd_); |
| 699 { | 772 { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 727 handler_started_ = true; | 800 handler_started_ = true; |
| 728 DebuggerConnectionImpl::StartHandler(port_number); | 801 DebuggerConnectionImpl::StartHandler(port_number); |
| 729 Dart_SetBreakpointHandler(BreakpointHandler); | 802 Dart_SetBreakpointHandler(BreakpointHandler); |
| 730 Dart_SetBreakpointResolvedHandler(BptResolvedHandler); | 803 Dart_SetBreakpointResolvedHandler(BptResolvedHandler); |
| 731 } | 804 } |
| 732 | 805 |
| 733 | 806 |
| 734 DebuggerConnectionHandler::~DebuggerConnectionHandler() { | 807 DebuggerConnectionHandler::~DebuggerConnectionHandler() { |
| 735 CloseDbgConnection(); | 808 CloseDbgConnection(); |
| 736 } | 809 } |
| OLD | NEW |