| 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 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 EXPECT_TRUE(res); | 230 EXPECT_TRUE(res); |
| 231 if (i < expected_frames) { | 231 if (i < expected_frames) { |
| 232 VerifyStackFrame(frame, func_names[i], local_vars[i], skip_null_expects); | 232 VerifyStackFrame(frame, func_names[i], local_vars[i], skip_null_expects); |
| 233 } else { | 233 } else { |
| 234 VerifyStackFrame(frame, NULL, Dart_Null(), skip_null_expects); | 234 VerifyStackFrame(frame, NULL, Dart_Null(), skip_null_expects); |
| 235 } | 235 } |
| 236 } | 236 } |
| 237 } | 237 } |
| 238 | 238 |
| 239 | 239 |
| 240 // TODO(hausner): Convert this one remaining use of the legacy |
| 241 // breakpoint handler once Dart_SetBreakpointHandler goes away. |
| 240 void TestBreakpointHandler(Dart_IsolateId isolate_id, | 242 void TestBreakpointHandler(Dart_IsolateId isolate_id, |
| 241 Dart_Breakpoint bpt, | 243 Dart_Breakpoint bpt, |
| 242 Dart_StackTrace trace) { | 244 Dart_StackTrace trace) { |
| 243 const char* expected_trace[] = {"A.foo", "main"}; | 245 const char* expected_trace[] = {"A.foo", "main"}; |
| 244 const intptr_t expected_trace_length = 2; | 246 const intptr_t expected_trace_length = 2; |
| 245 breakpoint_hit = true; | 247 breakpoint_hit = true; |
| 246 breakpoint_hit_counter++; | 248 breakpoint_hit_counter++; |
| 247 intptr_t trace_len; | 249 intptr_t trace_len; |
| 248 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); | 250 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); |
| 249 EXPECT_VALID(res); | 251 EXPECT_VALID(res); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 SetBreakpointAtEntry("A", "foo"); | 283 SetBreakpointAtEntry("A", "foo"); |
| 282 | 284 |
| 283 breakpoint_hit = false; | 285 breakpoint_hit = false; |
| 284 Dart_Handle retval = Invoke("main"); | 286 Dart_Handle retval = Invoke("main"); |
| 285 EXPECT_VALID(retval); | 287 EXPECT_VALID(retval); |
| 286 EXPECT(breakpoint_hit == true); | 288 EXPECT(breakpoint_hit == true); |
| 287 } | 289 } |
| 288 | 290 |
| 289 | 291 |
| 290 void TestStepOutHandler(Dart_IsolateId isolate_id, | 292 void TestStepOutHandler(Dart_IsolateId isolate_id, |
| 291 Dart_Breakpoint bpt, | 293 const Dart_CodeLocation& location) { |
| 292 Dart_StackTrace trace) { | 294 Dart_StackTrace trace; |
| 295 Dart_GetStackTrace(&trace); |
| 293 const char* expected_bpts[] = {"f1", "foo", "main"}; | 296 const char* expected_bpts[] = {"f1", "foo", "main"}; |
| 294 const intptr_t expected_bpts_length = ARRAY_SIZE(expected_bpts); | 297 const intptr_t expected_bpts_length = ARRAY_SIZE(expected_bpts); |
| 295 intptr_t trace_len; | 298 intptr_t trace_len; |
| 296 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); | 299 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); |
| 297 EXPECT_VALID(res); | 300 EXPECT_VALID(res); |
| 298 EXPECT(breakpoint_hit_counter < expected_bpts_length); | 301 EXPECT(breakpoint_hit_counter < expected_bpts_length); |
| 299 Dart_ActivationFrame frame; | 302 Dart_ActivationFrame frame; |
| 300 res = Dart_GetActivationFrame(trace, 0, &frame); | 303 res = Dart_GetActivationFrame(trace, 0, &frame); |
| 301 EXPECT_VALID(res); | 304 EXPECT_VALID(res); |
| 302 Dart_Handle func_name; | 305 Dart_Handle func_name; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 325 "foo() { \n" | 328 "foo() { \n" |
| 326 " f1(); \n" | 329 " f1(); \n" |
| 327 " return f2(); \n" | 330 " return f2(); \n" |
| 328 "} \n" | 331 "} \n" |
| 329 " \n" | 332 " \n" |
| 330 "main() { \n" | 333 "main() { \n" |
| 331 " return foo(); \n" | 334 " return foo(); \n" |
| 332 "} \n"; | 335 "} \n"; |
| 333 | 336 |
| 334 LoadScript(kScriptChars); | 337 LoadScript(kScriptChars); |
| 335 Dart_SetBreakpointHandler(&TestStepOutHandler); | 338 Dart_SetPausedEventHandler(&TestStepOutHandler); |
| 336 | 339 |
| 337 // Set a breakpoint in function f1, then repeatedly step out until | 340 // Set a breakpoint in function f1, then repeatedly step out until |
| 338 // we get to main. We should see one breakpoint each in f1, | 341 // we get to main. We should see one breakpoint each in f1, |
| 339 // foo, main, but not in f2. | 342 // foo, main, but not in f2. |
| 340 SetBreakpointAtEntry("", "f1"); | 343 SetBreakpointAtEntry("", "f1"); |
| 341 | 344 |
| 342 breakpoint_hit = false; | 345 breakpoint_hit = false; |
| 343 breakpoint_hit_counter = 0; | 346 breakpoint_hit_counter = 0; |
| 344 Dart_Handle retval = Invoke("main"); | 347 Dart_Handle retval = Invoke("main"); |
| 345 EXPECT_VALID(retval); | 348 EXPECT_VALID(retval); |
| 346 EXPECT(Dart_IsInteger(retval)); | 349 EXPECT(Dart_IsInteger(retval)); |
| 347 int64_t int_value = 0; | 350 int64_t int_value = 0; |
| 348 Dart_IntegerToInt64(retval, &int_value); | 351 Dart_IntegerToInt64(retval, &int_value); |
| 349 EXPECT_EQ(2, int_value); | 352 EXPECT_EQ(2, int_value); |
| 350 EXPECT(breakpoint_hit == true); | 353 EXPECT(breakpoint_hit == true); |
| 351 } | 354 } |
| 352 | 355 |
| 353 | 356 |
| 354 void TestStepIntoHandler(Dart_IsolateId isolate_id, | 357 void TestStepIntoHandler(Dart_IsolateId isolate_id, |
| 355 Dart_Breakpoint bpt, | 358 const Dart_CodeLocation& location) { |
| 356 Dart_StackTrace trace) { | 359 Dart_StackTrace trace; |
| 360 Dart_GetStackTrace(&trace); |
| 357 const char* expected_bpts[] = { | 361 const char* expected_bpts[] = { |
| 358 "main", | 362 "main", |
| 359 "foo", | 363 "foo", |
| 360 "f1", | 364 "f1", |
| 361 "foo", | 365 "foo", |
| 362 "X.X.", | 366 "X.X.", |
| 363 "foo", | 367 "foo", |
| 364 "X.kvmk", | 368 "X.kvmk", |
| 365 "f2", | 369 "f2", |
| 366 "X.kvmk", | 370 "X.kvmk", |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 408 " f1(); \n" | 412 " f1(); \n" |
| 409 " var o = new X(); \n" | 413 " var o = new X(); \n" |
| 410 " return o.kvmk(3, c:5); \n" | 414 " return o.kvmk(3, c:5); \n" |
| 411 "} \n" | 415 "} \n" |
| 412 " \n" | 416 " \n" |
| 413 "main() { \n" | 417 "main() { \n" |
| 414 " return foo(); \n" | 418 " return foo(); \n" |
| 415 "} \n"; | 419 "} \n"; |
| 416 | 420 |
| 417 LoadScript(kScriptChars); | 421 LoadScript(kScriptChars); |
| 418 Dart_SetBreakpointHandler(&TestStepIntoHandler); | 422 Dart_SetPausedEventHandler(&TestStepIntoHandler); |
| 419 | 423 |
| 420 // Set a breakpoint in function f1, then repeatedly step out until | 424 // Set a breakpoint in function f1, then repeatedly step out until |
| 421 // we get to main. We should see one breakpoint each in f1, | 425 // we get to main. We should see one breakpoint each in f1, |
| 422 // foo, main, but not in f2. | 426 // foo, main, but not in f2. |
| 423 SetBreakpointAtEntry("", "main"); | 427 SetBreakpointAtEntry("", "main"); |
| 424 | 428 |
| 425 breakpoint_hit = false; | 429 breakpoint_hit = false; |
| 426 breakpoint_hit_counter = 0; | 430 breakpoint_hit_counter = 0; |
| 427 Dart_Handle retval = Invoke("main"); | 431 Dart_Handle retval = Invoke("main"); |
| 428 EXPECT_VALID(retval); | 432 EXPECT_VALID(retval); |
| 429 EXPECT(Dart_IsInteger(retval)); | 433 EXPECT(Dart_IsInteger(retval)); |
| 430 int64_t int_value = 0; | 434 int64_t int_value = 0; |
| 431 Dart_IntegerToInt64(retval, &int_value); | 435 Dart_IntegerToInt64(retval, &int_value); |
| 432 EXPECT_EQ(7, int_value); | 436 EXPECT_EQ(7, int_value); |
| 433 EXPECT(breakpoint_hit == true); | 437 EXPECT(breakpoint_hit == true); |
| 434 } | 438 } |
| 435 | 439 |
| 436 | 440 |
| 437 static void StepIntoHandler(Dart_IsolateId isolate_id, | 441 static void StepIntoHandler(Dart_IsolateId isolate_id, |
| 438 Dart_Breakpoint bpt, | 442 const Dart_CodeLocation& location) { |
| 439 Dart_StackTrace trace) { | 443 Dart_StackTrace trace; |
| 444 Dart_GetStackTrace(&trace); |
| 440 if (verbose) { | 445 if (verbose) { |
| 441 OS::Print(">>> Breakpoint nr. %d in %s <<<\n", | 446 OS::Print(">>> Breakpoint nr. %d in %s <<<\n", |
| 442 breakpoint_hit_counter, BreakpointInfo(trace)); | 447 breakpoint_hit_counter, BreakpointInfo(trace)); |
| 443 PrintStackTrace(trace); | 448 PrintStackTrace(trace); |
| 444 } | 449 } |
| 445 breakpoint_hit = true; | 450 breakpoint_hit = true; |
| 446 breakpoint_hit_counter++; | 451 breakpoint_hit_counter++; |
| 447 Dart_SetStepInto(); | 452 Dart_SetStepInto(); |
| 448 } | 453 } |
| 449 | 454 |
| 450 | 455 |
| 451 TEST_CASE(Debug_IgnoreBP) { | 456 TEST_CASE(Debug_IgnoreBP) { |
| 452 const char* kScriptChars = | 457 const char* kScriptChars = |
| 453 "class B { \n" | 458 "class B { \n" |
| 454 " static var z = 0; \n" | 459 " static var z = 0; \n" |
| 455 " var i = 100; \n" | 460 " var i = 100; \n" |
| 456 " var d = 3.14; \n" | 461 " var d = 3.14; \n" |
| 457 " var s = 'Dr Seuss'; \n" | 462 " var s = 'Dr Seuss'; \n" |
| 458 "} \n" | 463 "} \n" |
| 459 " \n" | 464 " \n" |
| 460 "main() { \n" | 465 "main() { \n" |
| 461 " var x = new B(); \n" | 466 " var x = new B(); \n" |
| 462 " return x.i + 1; \n" | 467 " return x.i + 1; \n" |
| 463 "} \n"; | 468 "} \n"; |
| 464 | 469 |
| 465 LoadScript(kScriptChars); | 470 LoadScript(kScriptChars); |
| 466 Dart_SetBreakpointHandler(&StepIntoHandler); | 471 Dart_SetPausedEventHandler(&StepIntoHandler); |
| 467 | 472 |
| 468 SetBreakpointAtEntry("", "main"); | 473 SetBreakpointAtEntry("", "main"); |
| 469 | 474 |
| 470 breakpoint_hit = false; | 475 breakpoint_hit = false; |
| 471 breakpoint_hit_counter = 0; | 476 breakpoint_hit_counter = 0; |
| 472 Dart_Handle retval = Invoke("main"); | 477 Dart_Handle retval = Invoke("main"); |
| 473 EXPECT_VALID(retval); | 478 EXPECT_VALID(retval); |
| 474 EXPECT(Dart_IsInteger(retval)); | 479 EXPECT(Dart_IsInteger(retval)); |
| 475 int64_t int_value = 0; | 480 int64_t int_value = 0; |
| 476 Dart_IntegerToInt64(retval, &int_value); | 481 Dart_IntegerToInt64(retval, &int_value); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 487 " for (int i = 0; i < 5000; i++) { \n" | 492 " for (int i = 0; i < 5000; i++) { \n" |
| 488 " foo(i); \n" | 493 " foo(i); \n" |
| 489 " } \n" | 494 " } \n" |
| 490 "} \n" | 495 "} \n" |
| 491 " \n" | 496 " \n" |
| 492 "main() { \n" | 497 "main() { \n" |
| 493 " return foo(99); \n" | 498 " return foo(99); \n" |
| 494 "} \n"; | 499 "} \n"; |
| 495 | 500 |
| 496 LoadScript(kScriptChars); | 501 LoadScript(kScriptChars); |
| 497 Dart_SetBreakpointHandler(&StepIntoHandler); | 502 Dart_SetPausedEventHandler(&StepIntoHandler); |
| 498 | 503 |
| 499 | 504 |
| 500 // Cause function foo to be optimized before we set a BP. | 505 // Cause function foo to be optimized before we set a BP. |
| 501 Dart_Handle res = Invoke("warmup"); | 506 Dart_Handle res = Invoke("warmup"); |
| 502 EXPECT_VALID(res); | 507 EXPECT_VALID(res); |
| 503 | 508 |
| 504 // Now set breakpoint in main and then step into optimized function foo. | 509 // Now set breakpoint in main and then step into optimized function foo. |
| 505 SetBreakpointAtEntry("", "main"); | 510 SetBreakpointAtEntry("", "main"); |
| 506 | 511 |
| 507 | 512 |
| 508 breakpoint_hit = false; | 513 breakpoint_hit = false; |
| 509 breakpoint_hit_counter = 0; | 514 breakpoint_hit_counter = 0; |
| 510 Dart_Handle retval = Invoke("main"); | 515 Dart_Handle retval = Invoke("main"); |
| 511 EXPECT_VALID(retval); | 516 EXPECT_VALID(retval); |
| 512 EXPECT(Dart_IsInteger(retval)); | 517 EXPECT(Dart_IsInteger(retval)); |
| 513 int64_t int_value = 0; | 518 int64_t int_value = 0; |
| 514 Dart_IntegerToInt64(retval, &int_value); | 519 Dart_IntegerToInt64(retval, &int_value); |
| 515 EXPECT_EQ(2 * 99, int_value); | 520 EXPECT_EQ(2 * 99, int_value); |
| 516 EXPECT(breakpoint_hit == true); | 521 EXPECT(breakpoint_hit == true); |
| 517 } | 522 } |
| 518 | 523 |
| 519 | 524 |
| 520 void TestSingleStepHandler(Dart_IsolateId isolate_id, | 525 void TestSingleStepHandler(Dart_IsolateId isolate_id, |
| 521 Dart_Breakpoint bpt, | 526 const Dart_CodeLocation& location) { |
| 522 Dart_StackTrace trace) { | 527 Dart_StackTrace trace; |
| 528 Dart_GetStackTrace(&trace); |
| 523 const char* expected_bpts[] = { | 529 const char* expected_bpts[] = { |
| 524 "moo", "foo", "moo", "foo", "moo", "foo", "main"}; | 530 "moo", "foo", "moo", "foo", "moo", "foo", "main"}; |
| 525 const intptr_t expected_bpts_length = ARRAY_SIZE(expected_bpts); | 531 const intptr_t expected_bpts_length = ARRAY_SIZE(expected_bpts); |
| 526 intptr_t trace_len; | 532 intptr_t trace_len; |
| 527 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); | 533 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); |
| 528 EXPECT_VALID(res); | 534 EXPECT_VALID(res); |
| 529 EXPECT(breakpoint_hit_counter < expected_bpts_length); | 535 EXPECT(breakpoint_hit_counter < expected_bpts_length); |
| 530 Dart_ActivationFrame frame; | 536 Dart_ActivationFrame frame; |
| 531 res = Dart_GetActivationFrame(trace, 0, &frame); | 537 res = Dart_GetActivationFrame(trace, 0, &frame); |
| 532 EXPECT_VALID(res); | 538 EXPECT_VALID(res); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 556 " moo('step one'); \n" | 562 " moo('step one'); \n" |
| 557 " moo('step two'); \n" | 563 " moo('step two'); \n" |
| 558 " moo('step three'); \n" | 564 " moo('step three'); \n" |
| 559 "} \n" | 565 "} \n" |
| 560 " \n" | 566 " \n" |
| 561 "void main() { \n" | 567 "void main() { \n" |
| 562 " foo(); \n" | 568 " foo(); \n" |
| 563 "} \n"; | 569 "} \n"; |
| 564 | 570 |
| 565 LoadScript(kScriptChars); | 571 LoadScript(kScriptChars); |
| 566 Dart_SetBreakpointHandler(&TestSingleStepHandler); | 572 Dart_SetPausedEventHandler(&TestSingleStepHandler); |
| 567 | 573 |
| 568 SetBreakpointAtEntry("", "moo"); | 574 SetBreakpointAtEntry("", "moo"); |
| 569 | 575 |
| 570 breakpoint_hit = false; | 576 breakpoint_hit = false; |
| 571 breakpoint_hit_counter = 0; | 577 breakpoint_hit_counter = 0; |
| 572 Dart_Handle retval = Invoke("main"); | 578 Dart_Handle retval = Invoke("main"); |
| 573 EXPECT_VALID(retval); | 579 EXPECT_VALID(retval); |
| 574 EXPECT(breakpoint_hit == true); | 580 EXPECT(breakpoint_hit == true); |
| 575 } | 581 } |
| 576 | 582 |
| 577 | 583 |
| 578 static void ClosureBreakpointHandler(Dart_IsolateId isolate_id, | 584 static void ClosureBreakpointHandler(Dart_IsolateId isolate_id, |
| 579 Dart_Breakpoint bpt, | 585 const Dart_CodeLocation& location) { |
| 580 Dart_StackTrace trace) { | 586 Dart_StackTrace trace; |
| 587 Dart_GetStackTrace(&trace); |
| 581 const char* expected_trace[] = {"callback", "main"}; | 588 const char* expected_trace[] = {"callback", "main"}; |
| 582 const intptr_t expected_trace_length = 2; | 589 const intptr_t expected_trace_length = 2; |
| 583 breakpoint_hit_counter++; | 590 breakpoint_hit_counter++; |
| 584 intptr_t trace_len; | 591 intptr_t trace_len; |
| 585 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); | 592 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); |
| 586 EXPECT_VALID(res); | 593 EXPECT_VALID(res); |
| 587 EXPECT_EQ(expected_trace_length, trace_len); | 594 EXPECT_EQ(expected_trace_length, trace_len); |
| 588 for (int i = 0; i < trace_len; i++) { | 595 for (int i = 0; i < trace_len; i++) { |
| 589 Dart_ActivationFrame frame; | 596 Dart_ActivationFrame frame; |
| 590 res = Dart_GetActivationFrame(trace, i, &frame); | 597 res = Dart_GetActivationFrame(trace, i, &frame); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 608 "} \n" | 615 "} \n" |
| 609 " \n" | 616 " \n" |
| 610 "main() { \n" | 617 "main() { \n" |
| 611 " var h = callback; \n" | 618 " var h = callback; \n" |
| 612 " h('bla'); \n" | 619 " h('bla'); \n" |
| 613 " callback('jada'); \n" | 620 " callback('jada'); \n" |
| 614 " return 442; \n" | 621 " return 442; \n" |
| 615 "} \n"; | 622 "} \n"; |
| 616 | 623 |
| 617 LoadScript(kScriptChars); | 624 LoadScript(kScriptChars); |
| 618 Dart_SetBreakpointHandler(&ClosureBreakpointHandler); | 625 Dart_SetPausedEventHandler(&ClosureBreakpointHandler); |
| 619 | 626 |
| 620 SetBreakpointAtEntry("", "callback"); | 627 SetBreakpointAtEntry("", "callback"); |
| 621 | 628 |
| 622 breakpoint_hit_counter = 0; | 629 breakpoint_hit_counter = 0; |
| 623 Dart_Handle retval = Invoke("main"); | 630 Dart_Handle retval = Invoke("main"); |
| 624 EXPECT_VALID(retval); | 631 EXPECT_VALID(retval); |
| 625 int64_t int_value = 0; | 632 int64_t int_value = 0; |
| 626 Dart_IntegerToInt64(retval, &int_value); | 633 Dart_IntegerToInt64(retval, &int_value); |
| 627 EXPECT_EQ(442, int_value); | 634 EXPECT_EQ(442, int_value); |
| 628 EXPECT_EQ(2, breakpoint_hit_counter); | 635 EXPECT_EQ(2, breakpoint_hit_counter); |
| 629 } | 636 } |
| 630 | 637 |
| 631 | 638 |
| 632 static void ExprClosureBreakpointHandler(Dart_IsolateId isolate_id, | 639 static void ExprClosureBreakpointHandler(Dart_IsolateId isolate_id, |
| 633 Dart_Breakpoint bpt, | 640 const Dart_CodeLocation& location) { |
| 634 Dart_StackTrace trace) { | 641 Dart_StackTrace trace; |
| 642 Dart_GetStackTrace(&trace); |
| 635 static const char* expected_trace[] = {"<anonymous closure>", "main"}; | 643 static const char* expected_trace[] = {"<anonymous closure>", "main"}; |
| 636 Dart_Handle add_locals = Dart_NewList(4); | 644 Dart_Handle add_locals = Dart_NewList(4); |
| 637 Dart_ListSetAt(add_locals, 0, NewString("a")); | 645 Dart_ListSetAt(add_locals, 0, NewString("a")); |
| 638 Dart_ListSetAt(add_locals, 1, Dart_NewInteger(10)); | 646 Dart_ListSetAt(add_locals, 1, Dart_NewInteger(10)); |
| 639 Dart_ListSetAt(add_locals, 2, NewString("b")); | 647 Dart_ListSetAt(add_locals, 2, NewString("b")); |
| 640 Dart_ListSetAt(add_locals, 3, Dart_NewInteger(20)); | 648 Dart_ListSetAt(add_locals, 3, Dart_NewInteger(20)); |
| 641 Dart_Handle expected_locals[] = {add_locals, Dart_Null()}; | 649 Dart_Handle expected_locals[] = {add_locals, Dart_Null()}; |
| 642 breakpoint_hit_counter++; | 650 breakpoint_hit_counter++; |
| 643 PrintStackTrace(trace); | 651 PrintStackTrace(trace); |
| 644 VerifyStackTrace(trace, expected_trace, expected_locals, 2, false); | 652 VerifyStackTrace(trace, expected_trace, expected_locals, 2, false); |
| 645 } | 653 } |
| 646 | 654 |
| 647 | 655 |
| 648 TEST_CASE(Debug_ExprClosureBreakpoint) { | 656 TEST_CASE(Debug_ExprClosureBreakpoint) { |
| 649 const char* kScriptChars = | 657 const char* kScriptChars = |
| 650 "var c; \n" | 658 "var c; \n" |
| 651 " \n" | 659 " \n" |
| 652 "main() { \n" | 660 "main() { \n" |
| 653 " c = (a, b) { \n" | 661 " c = (a, b) { \n" |
| 654 " return a + b; \n" | 662 " return a + b; \n" |
| 655 " }; \n" | 663 " }; \n" |
| 656 " return c(10, 20); \n" | 664 " return c(10, 20); \n" |
| 657 "} \n"; | 665 "} \n"; |
| 658 | 666 |
| 659 LoadScript(kScriptChars); | 667 LoadScript(kScriptChars); |
| 660 Dart_SetBreakpointHandler(&ExprClosureBreakpointHandler); | 668 Dart_SetPausedEventHandler(&ExprClosureBreakpointHandler); |
| 661 | 669 |
| 662 Dart_Handle script_url = NewString(TestCase::url()); | 670 Dart_Handle script_url = NewString(TestCase::url()); |
| 663 intptr_t line_no = 5; // In closure 'add'. | 671 intptr_t line_no = 5; // In closure 'add'. |
| 664 Dart_Handle res = Dart_SetBreakpoint(script_url, line_no); | 672 Dart_Handle res = Dart_SetBreakpoint(script_url, line_no); |
| 665 EXPECT_VALID(res); | 673 EXPECT_VALID(res); |
| 666 EXPECT(Dart_IsInteger(res)); | 674 EXPECT(Dart_IsInteger(res)); |
| 667 | 675 |
| 668 breakpoint_hit_counter = 0; | 676 breakpoint_hit_counter = 0; |
| 669 Dart_Handle retval = Invoke("main"); | 677 Dart_Handle retval = Invoke("main"); |
| 670 EXPECT_VALID(retval); | 678 EXPECT_VALID(retval); |
| 671 int64_t int_value = 0; | 679 int64_t int_value = 0; |
| 672 Dart_IntegerToInt64(retval, &int_value); | 680 Dart_IntegerToInt64(retval, &int_value); |
| 673 EXPECT_EQ(30, int_value); | 681 EXPECT_EQ(30, int_value); |
| 674 EXPECT_EQ(1, breakpoint_hit_counter); | 682 EXPECT_EQ(1, breakpoint_hit_counter); |
| 675 } | 683 } |
| 676 | 684 |
| 677 | 685 |
| 678 static intptr_t bp_id_to_be_deleted; | 686 static intptr_t bp_id_to_be_deleted; |
| 679 | 687 |
| 680 static void DeleteBreakpointHandler(Dart_IsolateId isolate_id, | 688 static void DeleteBreakpointHandler(Dart_IsolateId isolate_id, |
| 681 Dart_Breakpoint bpt, | 689 const Dart_CodeLocation& location) { |
| 682 Dart_StackTrace trace) { | 690 Dart_StackTrace trace; |
| 691 Dart_GetStackTrace(&trace); |
| 683 const char* expected_trace[] = {"foo", "main"}; | 692 const char* expected_trace[] = {"foo", "main"}; |
| 684 const intptr_t expected_trace_length = 2; | 693 const intptr_t expected_trace_length = 2; |
| 685 breakpoint_hit_counter++; | 694 breakpoint_hit_counter++; |
| 686 intptr_t trace_len; | 695 intptr_t trace_len; |
| 687 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); | 696 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); |
| 688 EXPECT_VALID(res); | 697 EXPECT_VALID(res); |
| 689 EXPECT_EQ(expected_trace_length, trace_len); | 698 EXPECT_EQ(expected_trace_length, trace_len); |
| 690 for (int i = 0; i < trace_len; i++) { | 699 for (int i = 0; i < trace_len; i++) { |
| 691 Dart_ActivationFrame frame; | 700 Dart_ActivationFrame frame; |
| 692 res = Dart_GetActivationFrame(trace, i, &frame); | 701 res = Dart_GetActivationFrame(trace, i, &frame); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 721 " foo(); \n" | 730 " foo(); \n" |
| 722 " foo(); \n" | 731 " foo(); \n" |
| 723 " foo(); \n" | 732 " foo(); \n" |
| 724 "} \n"; | 733 "} \n"; |
| 725 | 734 |
| 726 LoadScript(kScriptChars); | 735 LoadScript(kScriptChars); |
| 727 | 736 |
| 728 Dart_Handle script_url = NewString(TestCase::url()); | 737 Dart_Handle script_url = NewString(TestCase::url()); |
| 729 intptr_t line_no = 4; // In function 'foo'. | 738 intptr_t line_no = 4; // In function 'foo'. |
| 730 | 739 |
| 731 Dart_SetBreakpointHandler(&DeleteBreakpointHandler); | 740 Dart_SetPausedEventHandler(&DeleteBreakpointHandler); |
| 732 | 741 |
| 733 Dart_Handle res = Dart_SetBreakpoint(script_url, line_no); | 742 Dart_Handle res = Dart_SetBreakpoint(script_url, line_no); |
| 734 EXPECT_VALID(res); | 743 EXPECT_VALID(res); |
| 735 EXPECT(Dart_IsInteger(res)); | 744 EXPECT(Dart_IsInteger(res)); |
| 736 int64_t bp_id = 0; | 745 int64_t bp_id = 0; |
| 737 Dart_IntegerToInt64(res, &bp_id); | 746 Dart_IntegerToInt64(res, &bp_id); |
| 738 | 747 |
| 739 // Function main() calls foo() 3 times. On the second iteration, the | 748 // Function main() calls foo() 3 times. On the second iteration, the |
| 740 // breakpoint is removed by the handler, so we expect the breakpoint | 749 // breakpoint is removed by the handler, so we expect the breakpoint |
| 741 // to fire twice only. | 750 // to fire twice only. |
| 742 bp_id_to_be_deleted = bp_id; | 751 bp_id_to_be_deleted = bp_id; |
| 743 breakpoint_hit_counter = 0; | 752 breakpoint_hit_counter = 0; |
| 744 Dart_Handle retval = Invoke("main"); | 753 Dart_Handle retval = Invoke("main"); |
| 745 EXPECT_VALID(retval); | 754 EXPECT_VALID(retval); |
| 746 EXPECT_EQ(2, breakpoint_hit_counter); | 755 EXPECT_EQ(2, breakpoint_hit_counter); |
| 747 } | 756 } |
| 748 | 757 |
| 749 | 758 |
| 750 static void InspectStaticFieldHandler(Dart_IsolateId isolate_id, | 759 static void InspectStaticFieldHandler(Dart_IsolateId isolate_id, |
| 751 Dart_Breakpoint bpt, | 760 const Dart_CodeLocation& location) { |
| 752 Dart_StackTrace trace) { | 761 Dart_StackTrace trace; |
| 762 Dart_GetStackTrace(&trace); |
| 753 ASSERT(script_lib != NULL); | 763 ASSERT(script_lib != NULL); |
| 754 ASSERT(!Dart_IsError(script_lib)); | 764 ASSERT(!Dart_IsError(script_lib)); |
| 755 ASSERT(Dart_IsLibrary(script_lib)); | 765 ASSERT(Dart_IsLibrary(script_lib)); |
| 756 Dart_Handle class_A = Dart_GetClass(script_lib, NewString("A")); | 766 Dart_Handle class_A = Dart_GetClass(script_lib, NewString("A")); |
| 757 EXPECT_VALID(class_A); | 767 EXPECT_VALID(class_A); |
| 758 | 768 |
| 759 const int expected_num_fields = 2; | 769 const int expected_num_fields = 2; |
| 760 struct { | 770 struct { |
| 761 const char* field_name; | 771 const char* field_name; |
| 762 const char* field_value; | 772 const char* field_value; |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 814 " debugBreak() { } \n" | 824 " debugBreak() { } \n" |
| 815 " main() { \n" | 825 " main() { \n" |
| 816 " var a = new A(); \n" | 826 " var a = new A(); \n" |
| 817 " debugBreak(); \n" | 827 " debugBreak(); \n" |
| 818 " A.u = 442; \n" | 828 " A.u = 442; \n" |
| 819 " A.bla = 'silence is golden'; \n" | 829 " A.bla = 'silence is golden'; \n" |
| 820 " debugBreak(); \n" | 830 " debugBreak(); \n" |
| 821 " } \n"; | 831 " } \n"; |
| 822 | 832 |
| 823 LoadScript(kScriptChars); | 833 LoadScript(kScriptChars); |
| 824 Dart_SetBreakpointHandler(&InspectStaticFieldHandler); | 834 Dart_SetPausedEventHandler(&InspectStaticFieldHandler); |
| 825 SetBreakpointAtEntry("", "debugBreak"); | 835 SetBreakpointAtEntry("", "debugBreak"); |
| 826 | 836 |
| 827 breakpoint_hit_counter = 0; | 837 breakpoint_hit_counter = 0; |
| 828 Dart_Handle retval = Invoke("main"); | 838 Dart_Handle retval = Invoke("main"); |
| 829 EXPECT_VALID(retval); | 839 EXPECT_VALID(retval); |
| 830 } | 840 } |
| 831 | 841 |
| 832 | 842 |
| 833 TEST_CASE(Debug_InspectObject) { | 843 TEST_CASE(Debug_InspectObject) { |
| 834 const char* kScriptChars = | 844 const char* kScriptChars = |
| (...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1198 { | 1208 { |
| 1199 MonitorLocker ml(sync); | 1209 MonitorLocker ml(sync); |
| 1200 while (interrupt_isolate_id != ILLEGAL_ISOLATE_ID) { | 1210 while (interrupt_isolate_id != ILLEGAL_ISOLATE_ID) { |
| 1201 ml.Wait(); | 1211 ml.Wait(); |
| 1202 } | 1212 } |
| 1203 } | 1213 } |
| 1204 EXPECT(interrupt_isolate_id == ILLEGAL_ISOLATE_ID); | 1214 EXPECT(interrupt_isolate_id == ILLEGAL_ISOLATE_ID); |
| 1205 } | 1215 } |
| 1206 | 1216 |
| 1207 | 1217 |
| 1208 static void StackTraceDump1BreakpointHandler(Dart_IsolateId isolate_id, | 1218 static void StackTraceDump1BreakpointHandler( |
| 1209 Dart_Breakpoint bpt, | 1219 Dart_IsolateId isolate_id, |
| 1210 Dart_StackTrace trace) { | 1220 const Dart_CodeLocation& location) { |
| 1221 Dart_StackTrace trace; |
| 1222 Dart_GetStackTrace(&trace); |
| 1211 const int kStackTraceLen = 4; | 1223 const int kStackTraceLen = 4; |
| 1212 static const char* expected_trace[kStackTraceLen] = { | 1224 static const char* expected_trace[kStackTraceLen] = { |
| 1213 "local_to_main", | 1225 "local_to_main", |
| 1214 "Test.local1_to_func1", | 1226 "Test.local1_to_func1", |
| 1215 "Test.func1", | 1227 "Test.func1", |
| 1216 "main" | 1228 "main" |
| 1217 }; | 1229 }; |
| 1218 | 1230 |
| 1219 intptr_t trace_len; | 1231 intptr_t trace_len; |
| 1220 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); | 1232 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1337 " return i + j;\n" | 1349 " return i + j;\n" |
| 1338 " }\n" | 1350 " }\n" |
| 1339 " var sum = 0;\n" | 1351 " var sum = 0;\n" |
| 1340 " Test value = new Test(10);\n" | 1352 " Test value = new Test(10);\n" |
| 1341 " var func1 = value.func1;\n" | 1353 " var func1 = value.func1;\n" |
| 1342 " var main_local = local_to_main;\n" | 1354 " var main_local = local_to_main;\n" |
| 1343 " return func1(main_local);\n" | 1355 " return func1(main_local);\n" |
| 1344 "}\n"; | 1356 "}\n"; |
| 1345 | 1357 |
| 1346 LoadScript(kScriptChars); | 1358 LoadScript(kScriptChars); |
| 1347 Dart_SetBreakpointHandler(&StackTraceDump1BreakpointHandler); | 1359 Dart_SetPausedEventHandler(&StackTraceDump1BreakpointHandler); |
| 1348 | 1360 |
| 1349 Dart_Handle script_url = NewString(TestCase::url()); | 1361 Dart_Handle script_url = NewString(TestCase::url()); |
| 1350 intptr_t line_no = 34; // In closure 'local_to_main'. | 1362 intptr_t line_no = 34; // In closure 'local_to_main'. |
| 1351 Dart_Handle res = Dart_SetBreakpoint(script_url, line_no); | 1363 Dart_Handle res = Dart_SetBreakpoint(script_url, line_no); |
| 1352 EXPECT_VALID(res); | 1364 EXPECT_VALID(res); |
| 1353 EXPECT(Dart_IsInteger(res)); | 1365 EXPECT(Dart_IsInteger(res)); |
| 1354 | 1366 |
| 1355 breakpoint_hit_counter = 0; | 1367 breakpoint_hit_counter = 0; |
| 1356 Dart_Handle retval = Invoke("main"); | 1368 Dart_Handle retval = Invoke("main"); |
| 1357 EXPECT_VALID(retval); | 1369 EXPECT_VALID(retval); |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1517 | 1529 |
| 1518 Dart_Handle retval = Invoke("main"); | 1530 Dart_Handle retval = Invoke("main"); |
| 1519 EXPECT(Dart_IsError(retval)); | 1531 EXPECT(Dart_IsError(retval)); |
| 1520 EXPECT(Dart_IsUnhandledExceptionError(retval)); | 1532 EXPECT(Dart_IsUnhandledExceptionError(retval)); |
| 1521 EXPECT_EQ(1, breakpoint_hit_counter); | 1533 EXPECT_EQ(1, breakpoint_hit_counter); |
| 1522 } | 1534 } |
| 1523 | 1535 |
| 1524 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). | 1536 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). |
| 1525 | 1537 |
| 1526 } // namespace dart | 1538 } // namespace dart |
| OLD | NEW |