| 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 "include/dart_debugger_api.h" | 5 #include "include/dart_debugger_api.h" |
| 6 #include "platform/assert.h" | 6 #include "platform/assert.h" |
| 7 #include "vm/dart_api_impl.h" | 7 #include "vm/dart_api_impl.h" |
| 8 #include "vm/thread.h" | 8 #include "vm/thread.h" |
| 9 #include "vm/unit_test.h" | 9 #include "vm/unit_test.h" |
| 10 | 10 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 | 42 |
| 43 | 43 |
| 44 static char const* ToCString(Dart_Handle str) { | 44 static char const* ToCString(Dart_Handle str) { |
| 45 EXPECT(Dart_IsString(str)); | 45 EXPECT(Dart_IsString(str)); |
| 46 char const* c_str = NULL; | 46 char const* c_str = NULL; |
| 47 Dart_StringToCString(str, &c_str); | 47 Dart_StringToCString(str, &c_str); |
| 48 return c_str; | 48 return c_str; |
| 49 } | 49 } |
| 50 | 50 |
| 51 | 51 |
| 52 static int64_t ToInt64(Dart_Handle h) { |
| 53 EXPECT(Dart_IsInteger(h)); |
| 54 int64_t i = 0; |
| 55 Dart_Handle res = Dart_IntegerToInt64(h, &i); |
| 56 EXPECT_VALID(res); |
| 57 return i; |
| 58 } |
| 59 |
| 60 |
| 61 static double ToDouble(Dart_Handle h) { |
| 62 EXPECT(Dart_IsDouble(h)); |
| 63 double d = 0.0; |
| 64 Dart_Handle res = Dart_DoubleValue(h, &d); |
| 65 EXPECT_VALID(res); |
| 66 return d; |
| 67 } |
| 68 |
| 69 |
| 52 static char const* BreakpointInfo(Dart_StackTrace trace) { | 70 static char const* BreakpointInfo(Dart_StackTrace trace) { |
| 53 static char info_str[128]; | 71 static char info_str[128]; |
| 54 Dart_ActivationFrame frame; | 72 Dart_ActivationFrame frame; |
| 55 Dart_Handle res = Dart_GetActivationFrame(trace, 0, &frame); | 73 Dart_Handle res = Dart_GetActivationFrame(trace, 0, &frame); |
| 56 EXPECT_TRUE(res); | 74 EXPECT_TRUE(res); |
| 57 Dart_Handle func_name; | 75 Dart_Handle func_name; |
| 58 Dart_Handle url; | 76 Dart_Handle url; |
| 59 intptr_t line_number = 0; | 77 intptr_t line_number = 0; |
| 60 intptr_t library_id = 0; | 78 intptr_t library_id = 0; |
| 61 res = Dart_ActivationFrameInfo( | 79 res = Dart_ActivationFrameInfo( |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 EXPECT(Dart_IsString(name_handle)); | 162 EXPECT(Dart_IsString(name_handle)); |
| 145 OS::Print(" local var %s = ", ToCString(name_handle)); | 163 OS::Print(" local var %s = ", ToCString(name_handle)); |
| 146 Dart_Handle value_handle = Dart_ListGetAt(locals, i + 1); | 164 Dart_Handle value_handle = Dart_ListGetAt(locals, i + 1); |
| 147 EXPECT_VALID(value_handle); | 165 EXPECT_VALID(value_handle); |
| 148 PrintValue(value_handle, true); | 166 PrintValue(value_handle, true); |
| 149 OS::Print("\n"); | 167 OS::Print("\n"); |
| 150 } | 168 } |
| 151 } | 169 } |
| 152 | 170 |
| 153 | 171 |
| 172 static Dart_Handle GetLocalVariable(Dart_ActivationFrame frame, |
| 173 const char* name) { |
| 174 Dart_Handle locals = Dart_GetLocalVariables(frame); |
| 175 EXPECT_VALID(locals); |
| 176 intptr_t list_length = 0; |
| 177 Dart_Handle ret = Dart_ListLength(locals, &list_length); |
| 178 EXPECT_VALID(ret); |
| 179 for (int i = 0; i + 1 < list_length; i += 2) { |
| 180 Dart_Handle name_handle = Dart_ListGetAt(locals, i); |
| 181 EXPECT_VALID(name_handle); |
| 182 EXPECT(Dart_IsString(name_handle)); |
| 183 if (strcmp(ToCString(name_handle), name) == 0) { |
| 184 Dart_Handle value_handle = Dart_ListGetAt(locals, i + 1); |
| 185 EXPECT_VALID(value_handle); |
| 186 return value_handle; |
| 187 } |
| 188 } |
| 189 EXPECT(!"local variable not found"); |
| 190 return Dart_Null(); |
| 191 } |
| 192 |
| 193 |
| 154 static void PrintStackTrace(Dart_StackTrace trace) { | 194 static void PrintStackTrace(Dart_StackTrace trace) { |
| 155 intptr_t trace_len; | 195 intptr_t trace_len; |
| 156 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); | 196 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); |
| 157 EXPECT_TRUE(res); | 197 EXPECT_TRUE(res); |
| 158 for (int i = 0; i < trace_len; i++) { | 198 for (int i = 0; i < trace_len; i++) { |
| 159 Dart_ActivationFrame frame; | 199 Dart_ActivationFrame frame; |
| 160 res = Dart_GetActivationFrame(trace, i, &frame); | 200 res = Dart_GetActivationFrame(trace, i, &frame); |
| 161 EXPECT_TRUE(res); | 201 EXPECT_TRUE(res); |
| 162 PrintActivationFrame(frame); | 202 PrintActivationFrame(frame); |
| 163 } | 203 } |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 337 // Set a breakpoint in function f1, then repeatedly step out until | 377 // Set a breakpoint in function f1, then repeatedly step out until |
| 338 // we get to main. We should see one breakpoint each in f1, | 378 // we get to main. We should see one breakpoint each in f1, |
| 339 // foo, main, but not in f2. | 379 // foo, main, but not in f2. |
| 340 SetBreakpointAtEntry("", "f1"); | 380 SetBreakpointAtEntry("", "f1"); |
| 341 | 381 |
| 342 breakpoint_hit = false; | 382 breakpoint_hit = false; |
| 343 breakpoint_hit_counter = 0; | 383 breakpoint_hit_counter = 0; |
| 344 Dart_Handle retval = Invoke("main"); | 384 Dart_Handle retval = Invoke("main"); |
| 345 EXPECT_VALID(retval); | 385 EXPECT_VALID(retval); |
| 346 EXPECT(Dart_IsInteger(retval)); | 386 EXPECT(Dart_IsInteger(retval)); |
| 347 int64_t int_value = 0; | 387 int64_t int_value = ToInt64(retval); |
| 348 Dart_IntegerToInt64(retval, &int_value); | |
| 349 EXPECT_EQ(2, int_value); | 388 EXPECT_EQ(2, int_value); |
| 350 EXPECT(breakpoint_hit == true); | 389 EXPECT(breakpoint_hit == true); |
| 351 } | 390 } |
| 352 | 391 |
| 353 | 392 |
| 354 void TestStepIntoHandler(Dart_IsolateId isolate_id, | 393 void TestStepIntoHandler(Dart_IsolateId isolate_id, |
| 355 const Dart_CodeLocation& location) { | 394 const Dart_CodeLocation& location) { |
| 356 Dart_StackTrace trace; | 395 Dart_StackTrace trace; |
| 357 Dart_GetStackTrace(&trace); | 396 Dart_GetStackTrace(&trace); |
| 358 const char* expected_bpts[] = { | 397 const char* expected_bpts[] = { |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 419 | 458 |
| 420 LoadScript(kScriptChars); | 459 LoadScript(kScriptChars); |
| 421 Dart_SetPausedEventHandler(&TestStepIntoHandler); | 460 Dart_SetPausedEventHandler(&TestStepIntoHandler); |
| 422 | 461 |
| 423 SetBreakpointAtEntry("", "main"); | 462 SetBreakpointAtEntry("", "main"); |
| 424 breakpoint_hit = false; | 463 breakpoint_hit = false; |
| 425 breakpoint_hit_counter = 0; | 464 breakpoint_hit_counter = 0; |
| 426 Dart_Handle retval = Invoke("main"); | 465 Dart_Handle retval = Invoke("main"); |
| 427 EXPECT_VALID(retval); | 466 EXPECT_VALID(retval); |
| 428 EXPECT(Dart_IsInteger(retval)); | 467 EXPECT(Dart_IsInteger(retval)); |
| 429 int64_t int_value = 0; | 468 int64_t int_value = ToInt64(retval); |
| 430 Dart_IntegerToInt64(retval, &int_value); | |
| 431 EXPECT_EQ(7, int_value); | 469 EXPECT_EQ(7, int_value); |
| 432 EXPECT(breakpoint_hit == true); | 470 EXPECT(breakpoint_hit == true); |
| 433 } | 471 } |
| 434 | 472 |
| 435 | 473 |
| 436 static void StepIntoHandler(Dart_IsolateId isolate_id, | 474 static void StepIntoHandler(Dart_IsolateId isolate_id, |
| 437 const Dart_CodeLocation& location) { | 475 const Dart_CodeLocation& location) { |
| 438 Dart_StackTrace trace; | 476 Dart_StackTrace trace; |
| 439 Dart_GetStackTrace(&trace); | 477 Dart_GetStackTrace(&trace); |
| 440 if (verbose) { | 478 if (verbose) { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 465 LoadScript(kScriptChars); | 503 LoadScript(kScriptChars); |
| 466 Dart_SetPausedEventHandler(&StepIntoHandler); | 504 Dart_SetPausedEventHandler(&StepIntoHandler); |
| 467 | 505 |
| 468 SetBreakpointAtEntry("", "main"); | 506 SetBreakpointAtEntry("", "main"); |
| 469 | 507 |
| 470 breakpoint_hit = false; | 508 breakpoint_hit = false; |
| 471 breakpoint_hit_counter = 0; | 509 breakpoint_hit_counter = 0; |
| 472 Dart_Handle retval = Invoke("main"); | 510 Dart_Handle retval = Invoke("main"); |
| 473 EXPECT_VALID(retval); | 511 EXPECT_VALID(retval); |
| 474 EXPECT(Dart_IsInteger(retval)); | 512 EXPECT(Dart_IsInteger(retval)); |
| 475 int64_t int_value = 0; | 513 int64_t int_value = ToInt64(retval); |
| 476 Dart_IntegerToInt64(retval, &int_value); | |
| 477 EXPECT_EQ(101, int_value); | 514 EXPECT_EQ(101, int_value); |
| 478 EXPECT(breakpoint_hit == true); | 515 EXPECT(breakpoint_hit == true); |
| 479 } | 516 } |
| 480 | 517 |
| 481 | 518 |
| 482 TEST_CASE(Debug_DeoptimizeFunction) { | 519 TEST_CASE(Debug_DeoptimizeFunction) { |
| 483 const char* kScriptChars = | 520 const char* kScriptChars = |
| 484 "foo(x) => 2 * x; \n" | 521 "foo(x) => 2 * x; \n" |
| 485 " \n" | 522 " \n" |
| 486 "warmup() { \n" | 523 "warmup() { \n" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 503 | 540 |
| 504 // Now set breakpoint in main and then step into optimized function foo. | 541 // Now set breakpoint in main and then step into optimized function foo. |
| 505 SetBreakpointAtEntry("", "main"); | 542 SetBreakpointAtEntry("", "main"); |
| 506 | 543 |
| 507 | 544 |
| 508 breakpoint_hit = false; | 545 breakpoint_hit = false; |
| 509 breakpoint_hit_counter = 0; | 546 breakpoint_hit_counter = 0; |
| 510 Dart_Handle retval = Invoke("main"); | 547 Dart_Handle retval = Invoke("main"); |
| 511 EXPECT_VALID(retval); | 548 EXPECT_VALID(retval); |
| 512 EXPECT(Dart_IsInteger(retval)); | 549 EXPECT(Dart_IsInteger(retval)); |
| 513 int64_t int_value = 0; | 550 int64_t int_value = ToInt64(retval); |
| 514 Dart_IntegerToInt64(retval, &int_value); | |
| 515 EXPECT_EQ(2 * 99, int_value); | 551 EXPECT_EQ(2 * 99, int_value); |
| 516 EXPECT(breakpoint_hit == true); | 552 EXPECT(breakpoint_hit == true); |
| 517 } | 553 } |
| 518 | 554 |
| 519 | 555 |
| 520 void TestSingleStepHandler(Dart_IsolateId isolate_id, | 556 void TestSingleStepHandler(Dart_IsolateId isolate_id, |
| 521 const Dart_CodeLocation& location) { | 557 const Dart_CodeLocation& location) { |
| 522 Dart_StackTrace trace; | 558 Dart_StackTrace trace; |
| 523 Dart_GetStackTrace(&trace); | 559 Dart_GetStackTrace(&trace); |
| 524 const char* expected_bpts[] = { | 560 const char* expected_bpts[] = { |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 617 "} \n"; | 653 "} \n"; |
| 618 | 654 |
| 619 LoadScript(kScriptChars); | 655 LoadScript(kScriptChars); |
| 620 Dart_SetPausedEventHandler(&ClosureBreakpointHandler); | 656 Dart_SetPausedEventHandler(&ClosureBreakpointHandler); |
| 621 | 657 |
| 622 SetBreakpointAtEntry("", "callback"); | 658 SetBreakpointAtEntry("", "callback"); |
| 623 | 659 |
| 624 breakpoint_hit_counter = 0; | 660 breakpoint_hit_counter = 0; |
| 625 Dart_Handle retval = Invoke("main"); | 661 Dart_Handle retval = Invoke("main"); |
| 626 EXPECT_VALID(retval); | 662 EXPECT_VALID(retval); |
| 627 int64_t int_value = 0; | 663 int64_t int_value = ToInt64(retval); |
| 628 Dart_IntegerToInt64(retval, &int_value); | |
| 629 EXPECT_EQ(442, int_value); | 664 EXPECT_EQ(442, int_value); |
| 630 EXPECT_EQ(2, breakpoint_hit_counter); | 665 EXPECT_EQ(2, breakpoint_hit_counter); |
| 631 } | 666 } |
| 632 | 667 |
| 633 | 668 |
| 634 static void ExprClosureBreakpointHandler(Dart_IsolateId isolate_id, | 669 static void ExprClosureBreakpointHandler(Dart_IsolateId isolate_id, |
| 635 const Dart_CodeLocation& location) { | 670 const Dart_CodeLocation& location) { |
| 636 Dart_StackTrace trace; | 671 Dart_StackTrace trace; |
| 637 Dart_GetStackTrace(&trace); | 672 Dart_GetStackTrace(&trace); |
| 638 static const char* expected_trace[] = {"<anonymous closure>", "main"}; | 673 static const char* expected_trace[] = {"<anonymous closure>", "main"}; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 664 | 699 |
| 665 Dart_Handle script_url = NewString(TestCase::url()); | 700 Dart_Handle script_url = NewString(TestCase::url()); |
| 666 intptr_t line_no = 5; // In closure 'add'. | 701 intptr_t line_no = 5; // In closure 'add'. |
| 667 Dart_Handle res = Dart_SetBreakpoint(script_url, line_no); | 702 Dart_Handle res = Dart_SetBreakpoint(script_url, line_no); |
| 668 EXPECT_VALID(res); | 703 EXPECT_VALID(res); |
| 669 EXPECT(Dart_IsInteger(res)); | 704 EXPECT(Dart_IsInteger(res)); |
| 670 | 705 |
| 671 breakpoint_hit_counter = 0; | 706 breakpoint_hit_counter = 0; |
| 672 Dart_Handle retval = Invoke("main"); | 707 Dart_Handle retval = Invoke("main"); |
| 673 EXPECT_VALID(retval); | 708 EXPECT_VALID(retval); |
| 674 int64_t int_value = 0; | 709 int64_t int_value = ToInt64(retval); |
| 675 Dart_IntegerToInt64(retval, &int_value); | |
| 676 EXPECT_EQ(30, int_value); | 710 EXPECT_EQ(30, int_value); |
| 677 EXPECT_EQ(1, breakpoint_hit_counter); | 711 EXPECT_EQ(1, breakpoint_hit_counter); |
| 678 } | 712 } |
| 679 | 713 |
| 680 | 714 |
| 681 static intptr_t bp_id_to_be_deleted; | 715 static intptr_t bp_id_to_be_deleted; |
| 682 | 716 |
| 683 static void DeleteBreakpointHandler(Dart_IsolateId isolate_id, | 717 static void DeleteBreakpointHandler(Dart_IsolateId isolate_id, |
| 684 const Dart_CodeLocation& location) { | 718 const Dart_CodeLocation& location) { |
| 685 Dart_StackTrace trace; | 719 Dart_StackTrace trace; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 730 LoadScript(kScriptChars); | 764 LoadScript(kScriptChars); |
| 731 | 765 |
| 732 Dart_Handle script_url = NewString(TestCase::url()); | 766 Dart_Handle script_url = NewString(TestCase::url()); |
| 733 intptr_t line_no = 4; // In function 'foo'. | 767 intptr_t line_no = 4; // In function 'foo'. |
| 734 | 768 |
| 735 Dart_SetPausedEventHandler(&DeleteBreakpointHandler); | 769 Dart_SetPausedEventHandler(&DeleteBreakpointHandler); |
| 736 | 770 |
| 737 Dart_Handle res = Dart_SetBreakpoint(script_url, line_no); | 771 Dart_Handle res = Dart_SetBreakpoint(script_url, line_no); |
| 738 EXPECT_VALID(res); | 772 EXPECT_VALID(res); |
| 739 EXPECT(Dart_IsInteger(res)); | 773 EXPECT(Dart_IsInteger(res)); |
| 740 int64_t bp_id = 0; | 774 int64_t bp_id = ToInt64(res); |
| 741 Dart_IntegerToInt64(res, &bp_id); | |
| 742 | 775 |
| 743 // Function main() calls foo() 3 times. On the second iteration, the | 776 // Function main() calls foo() 3 times. On the second iteration, the |
| 744 // breakpoint is removed by the handler, so we expect the breakpoint | 777 // breakpoint is removed by the handler, so we expect the breakpoint |
| 745 // to fire twice only. | 778 // to fire twice only. |
| 746 bp_id_to_be_deleted = bp_id; | 779 bp_id_to_be_deleted = bp_id; |
| 747 breakpoint_hit_counter = 0; | 780 breakpoint_hit_counter = 0; |
| 748 Dart_Handle retval = Invoke("main"); | 781 Dart_Handle retval = Invoke("main"); |
| 749 EXPECT_VALID(retval); | 782 EXPECT_VALID(retval); |
| 750 EXPECT_EQ(2, breakpoint_hit_counter); | 783 EXPECT_EQ(2, breakpoint_hit_counter); |
| 751 } | 784 } |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 881 EXPECT(Dart_IsString(value_handle)); | 914 EXPECT(Dart_IsString(value_handle)); |
| 882 char const* value; | 915 char const* value; |
| 883 Dart_StringToCString(value_handle, &value); | 916 Dart_StringToCString(value_handle, &value); |
| 884 OS::Print(" %s: %s\n", name, value); | 917 OS::Print(" %s: %s\n", name, value); |
| 885 } | 918 } |
| 886 | 919 |
| 887 // Check that an integer value returns an empty list of fields. | 920 // Check that an integer value returns an empty list of fields. |
| 888 Dart_Handle triple_six = Invoke("get_int"); | 921 Dart_Handle triple_six = Invoke("get_int"); |
| 889 EXPECT_VALID(triple_six); | 922 EXPECT_VALID(triple_six); |
| 890 EXPECT(Dart_IsInteger(triple_six)); | 923 EXPECT(Dart_IsInteger(triple_six)); |
| 891 int64_t int_value = 0; | 924 int64_t int_value = ToInt64(triple_six); |
| 892 Dart_IntegerToInt64(triple_six, &int_value); | |
| 893 EXPECT_EQ(666, int_value); | 925 EXPECT_EQ(666, int_value); |
| 894 fields = Dart_GetInstanceFields(triple_six); | 926 fields = Dart_GetInstanceFields(triple_six); |
| 895 EXPECT_VALID(fields); | 927 EXPECT_VALID(fields); |
| 896 EXPECT(Dart_IsList(fields)); | 928 EXPECT(Dart_IsList(fields)); |
| 897 retval = Dart_ListLength(fields, &list_length); | 929 retval = Dart_ListLength(fields, &list_length); |
| 898 EXPECT_EQ(0, list_length); | 930 EXPECT_EQ(0, list_length); |
| 899 | 931 |
| 900 // Check static field of class B (one field named 'bla') | 932 // Check static field of class B (one field named 'bla') |
| 901 Dart_Handle class_B = Dart_GetObjClass(object_b); | 933 Dart_Handle class_B = Dart_GetObjClass(object_b); |
| 902 EXPECT_VALID(class_B); | 934 EXPECT_VALID(class_B); |
| (...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1274 | 1306 |
| 1275 Dart_Handle script_url = NewString(TestCase::url()); | 1307 Dart_Handle script_url = NewString(TestCase::url()); |
| 1276 intptr_t line_no = 34; // In closure 'local_to_main'. | 1308 intptr_t line_no = 34; // In closure 'local_to_main'. |
| 1277 Dart_Handle res = Dart_SetBreakpoint(script_url, line_no); | 1309 Dart_Handle res = Dart_SetBreakpoint(script_url, line_no); |
| 1278 EXPECT_VALID(res); | 1310 EXPECT_VALID(res); |
| 1279 EXPECT(Dart_IsInteger(res)); | 1311 EXPECT(Dart_IsInteger(res)); |
| 1280 | 1312 |
| 1281 breakpoint_hit_counter = 0; | 1313 breakpoint_hit_counter = 0; |
| 1282 Dart_Handle retval = Invoke("main"); | 1314 Dart_Handle retval = Invoke("main"); |
| 1283 EXPECT_VALID(retval); | 1315 EXPECT_VALID(retval); |
| 1284 int64_t int_value = 0; | 1316 int64_t int_value = ToInt64(retval); |
| 1285 Dart_IntegerToInt64(retval, &int_value); | |
| 1286 EXPECT_EQ(195, int_value); | 1317 EXPECT_EQ(195, int_value); |
| 1287 EXPECT_EQ(1, breakpoint_hit_counter); | 1318 EXPECT_EQ(1, breakpoint_hit_counter); |
| 1288 } | 1319 } |
| 1289 | 1320 |
| 1290 | 1321 |
| 1291 static void StackTraceDump2ExceptionHandler(Dart_IsolateId isolate_id, | 1322 static void StackTraceDump2ExceptionHandler(Dart_IsolateId isolate_id, |
| 1292 Dart_Handle exception_object, | 1323 Dart_Handle exception_object, |
| 1293 Dart_StackTrace trace) { | 1324 Dart_StackTrace trace) { |
| 1294 const int kStackTraceLen = 5; | 1325 const int kStackTraceLen = 5; |
| 1295 static const char* expected_trace[kStackTraceLen] = { | 1326 static const char* expected_trace[kStackTraceLen] = { |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1441 breakpoint_hit_counter = 0; | 1472 breakpoint_hit_counter = 0; |
| 1442 Dart_SetExceptionPauseInfo(kPauseOnAllExceptions); | 1473 Dart_SetExceptionPauseInfo(kPauseOnAllExceptions); |
| 1443 | 1474 |
| 1444 Dart_Handle retval = Invoke("main"); | 1475 Dart_Handle retval = Invoke("main"); |
| 1445 EXPECT(Dart_IsError(retval)); | 1476 EXPECT(Dart_IsError(retval)); |
| 1446 EXPECT(Dart_IsUnhandledExceptionError(retval)); | 1477 EXPECT(Dart_IsUnhandledExceptionError(retval)); |
| 1447 EXPECT_EQ(1, breakpoint_hit_counter); | 1478 EXPECT_EQ(1, breakpoint_hit_counter); |
| 1448 } | 1479 } |
| 1449 | 1480 |
| 1450 | 1481 |
| 1482 void TestEvaluateHandler(Dart_IsolateId isolate_id, |
| 1483 const Dart_CodeLocation& location) { |
| 1484 Dart_StackTrace trace; |
| 1485 Dart_GetStackTrace(&trace); |
| 1486 intptr_t trace_len; |
| 1487 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); |
| 1488 EXPECT_VALID(res); |
| 1489 EXPECT_EQ(1, trace_len); |
| 1490 Dart_ActivationFrame frame; |
| 1491 res = Dart_GetActivationFrame(trace, 0, &frame); |
| 1492 EXPECT_VALID(res); |
| 1493 |
| 1494 // Get the local variable p and evaluate an expression in the |
| 1495 // context of p. |
| 1496 Dart_Handle p = GetLocalVariable(frame, "p"); |
| 1497 EXPECT_VALID(p); |
| 1498 EXPECT(!Dart_IsNull(p)); |
| 1499 |
| 1500 Dart_Handle r = Dart_EvaluateExpr(p, NewString("sqrt(x*x + y*this.y)")); |
| 1501 EXPECT_VALID(r); |
| 1502 EXPECT(Dart_IsNumber(r)); |
| 1503 EXPECT_EQ(5.0, ToDouble(r)); |
| 1504 |
| 1505 // Set top-level variable to a new value. |
| 1506 Dart_Handle h = Dart_EvaluateExpr(p, NewString("_factor = 10")); |
| 1507 EXPECT_VALID(h); |
| 1508 EXPECT(Dart_IsInteger(h)); |
| 1509 EXPECT_EQ(10, ToInt64(h)); |
| 1510 |
| 1511 // Check that the side effect of the previous expression is |
| 1512 // persistent. |
| 1513 h = Dart_EvaluateExpr(p, NewString("_factor")); |
| 1514 EXPECT_VALID(h); |
| 1515 EXPECT(Dart_IsInteger(h)); |
| 1516 EXPECT_EQ(10, ToInt64(h)); |
| 1517 |
| 1518 breakpoint_hit = true; |
| 1519 breakpoint_hit_counter++; |
| 1520 } |
| 1521 |
| 1522 |
| 1523 TEST_CASE(Debug_EvaluateExpr) { |
| 1524 const char* kScriptChars = |
| 1525 "import 'dart:math'; \n" |
| 1526 "main() { \n" |
| 1527 " var p = new Point(3, 4); \n" |
| 1528 " l = [1, 2, 3]; /*BP*/ \n" |
| 1529 " return p; \n" |
| 1530 "} \n" |
| 1531 "var _factor = 2; \n" |
| 1532 "var l; \n" |
| 1533 "class Point { \n" |
| 1534 " var x, y; \n" |
| 1535 " Point(this.x, this.y); \n" |
| 1536 "} \n"; |
| 1537 |
| 1538 LoadScript(kScriptChars); |
| 1539 Dart_SetPausedEventHandler(&TestEvaluateHandler); |
| 1540 |
| 1541 |
| 1542 Dart_Handle script_url = NewString(TestCase::url()); |
| 1543 intptr_t line_no = 4; |
| 1544 Dart_Handle res = Dart_SetBreakpoint(script_url, line_no); |
| 1545 EXPECT_VALID(res); |
| 1546 |
| 1547 breakpoint_hit = false; |
| 1548 Dart_Handle point = Invoke("main"); |
| 1549 EXPECT_VALID(point); |
| 1550 EXPECT(breakpoint_hit == true); |
| 1551 |
| 1552 Dart_Handle r = |
| 1553 Dart_EvaluateExpr(point, NewString("_factor * sqrt(x*x + y*y)")); |
| 1554 EXPECT_VALID(r); |
| 1555 EXPECT(Dart_IsDouble(r)); |
| 1556 EXPECT_EQ(50.0, ToDouble(r)); |
| 1557 |
| 1558 Dart_Handle len = Dart_EvaluateExpr(point, NewString("l.length")); |
| 1559 EXPECT_VALID(len); |
| 1560 EXPECT(Dart_IsNumber(len)); |
| 1561 EXPECT_EQ(3, ToInt64(len)); |
| 1562 } |
| 1563 |
| 1564 |
| 1451 TEST_CASE(Debug_GetSupertype) { | 1565 TEST_CASE(Debug_GetSupertype) { |
| 1452 const char* kScriptChars = | 1566 const char* kScriptChars = |
| 1453 "class Test {\n" | 1567 "class Test {\n" |
| 1454 "}\n" | 1568 "}\n" |
| 1455 "class Test1 extends Test {\n" | 1569 "class Test1 extends Test {\n" |
| 1456 "}\n" | 1570 "}\n" |
| 1457 "class Test2<T> {\n" | 1571 "class Test2<T> {\n" |
| 1458 "}\n" | 1572 "}\n" |
| 1459 "class Test3 extends Test2<int> {\n" | 1573 "class Test3 extends Test2<int> {\n" |
| 1460 "}\n" | 1574 "}\n" |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1587 | 1701 |
| 1588 Dart_Handle list_type = Dart_InstanceGetType(list_access_test_obj); | 1702 Dart_Handle list_type = Dart_InstanceGetType(list_access_test_obj); |
| 1589 Dart_Handle super_type = Dart_GetSupertype(list_type); | 1703 Dart_Handle super_type = Dart_GetSupertype(list_type); |
| 1590 EXPECT(!Dart_IsError(super_type)); | 1704 EXPECT(!Dart_IsError(super_type)); |
| 1591 super_type = Dart_GetSupertype(super_type); | 1705 super_type = Dart_GetSupertype(super_type); |
| 1592 EXPECT(!Dart_IsError(super_type)); | 1706 EXPECT(!Dart_IsError(super_type)); |
| 1593 EXPECT(super_type == Dart_Null()); | 1707 EXPECT(super_type == Dart_Null()); |
| 1594 } | 1708 } |
| 1595 | 1709 |
| 1596 } // namespace dart | 1710 } // namespace dart |
| OLD | NEW |