Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(80)

Side by Side Diff: runtime/bin/dbg_connection.cc

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

Powered by Google App Engine
This is Rietveld 408576698