OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 "platform/assert.h" | 5 #include "platform/assert.h" |
6 | 6 |
7 #include "vm/dart_api_impl.h" | 7 #include "vm/dart_api_impl.h" |
8 #include "vm/dart_api_state.h" | 8 #include "vm/dart_api_state.h" |
9 #include "vm/globals.h" | 9 #include "vm/globals.h" |
10 #include "vm/profiler.h" | 10 #include "vm/profiler.h" |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 EXPECT_VALID(result); | 203 EXPECT_VALID(result); |
204 | 204 |
205 | 205 |
206 { | 206 { |
207 Thread* thread = Thread::Current(); | 207 Thread* thread = Thread::Current(); |
208 Isolate* isolate = thread->isolate(); | 208 Isolate* isolate = thread->isolate(); |
209 StackZone zone(thread); | 209 StackZone zone(thread); |
210 HANDLESCOPE(thread); | 210 HANDLESCOPE(thread); |
211 Profile profile(isolate); | 211 Profile profile(isolate); |
212 AllocationFilter filter(isolate, class_a.id()); | 212 AllocationFilter filter(isolate, class_a.id()); |
213 profile.Build(&filter, Profile::kNoTags); | 213 profile.Build(thread, &filter, Profile::kNoTags); |
214 // We should have 1 allocation sample. | 214 // We should have 1 allocation sample. |
215 EXPECT_EQ(1, profile.sample_count()); | 215 EXPECT_EQ(1, profile.sample_count()); |
216 ProfileTrieWalker walker(&profile); | 216 ProfileTrieWalker walker(&profile); |
217 | 217 |
218 // Exclusive code: B.boo -> main. | 218 // Exclusive code: B.boo -> main. |
219 walker.Reset(Profile::kExclusiveCode); | 219 walker.Reset(Profile::kExclusiveCode); |
220 // Move down from the root. | 220 // Move down from the root. |
221 EXPECT(walker.Down()); | 221 EXPECT(walker.Down()); |
222 EXPECT_STREQ("B.boo", walker.CurrentName()); | 222 EXPECT_STREQ("B.boo", walker.CurrentName()); |
223 EXPECT(walker.Down()); | 223 EXPECT(walker.Down()); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
282 EXPECT_VALID(result); | 282 EXPECT_VALID(result); |
283 | 283 |
284 | 284 |
285 { | 285 { |
286 Thread* thread = Thread::Current(); | 286 Thread* thread = Thread::Current(); |
287 Isolate* isolate = thread->isolate(); | 287 Isolate* isolate = thread->isolate(); |
288 StackZone zone(thread); | 288 StackZone zone(thread); |
289 HANDLESCOPE(thread); | 289 HANDLESCOPE(thread); |
290 Profile profile(isolate); | 290 Profile profile(isolate); |
291 AllocationFilter filter(isolate, class_a.id()); | 291 AllocationFilter filter(isolate, class_a.id()); |
292 profile.Build(&filter, Profile::kNoTags); | 292 profile.Build(thread, &filter, Profile::kNoTags); |
293 // We should have no allocation samples. | 293 // We should have no allocation samples. |
294 EXPECT_EQ(0, profile.sample_count()); | 294 EXPECT_EQ(0, profile.sample_count()); |
295 } | 295 } |
296 | 296 |
297 // Turn on allocation tracing for A. | 297 // Turn on allocation tracing for A. |
298 class_a.SetTraceAllocation(true); | 298 class_a.SetTraceAllocation(true); |
299 | 299 |
300 result = Dart_Invoke(lib, NewString("main"), 0, NULL); | 300 result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
301 EXPECT_VALID(result); | 301 EXPECT_VALID(result); |
302 | 302 |
303 { | 303 { |
304 Thread* thread = Thread::Current(); | 304 Thread* thread = Thread::Current(); |
305 Isolate* isolate = thread->isolate(); | 305 Isolate* isolate = thread->isolate(); |
306 StackZone zone(thread); | 306 StackZone zone(thread); |
307 HANDLESCOPE(thread); | 307 HANDLESCOPE(thread); |
308 Profile profile(isolate); | 308 Profile profile(isolate); |
309 AllocationFilter filter(isolate, class_a.id()); | 309 AllocationFilter filter(isolate, class_a.id()); |
310 profile.Build(&filter, Profile::kNoTags); | 310 profile.Build(thread, &filter, Profile::kNoTags); |
311 // We should have one allocation sample. | 311 // We should have one allocation sample. |
312 EXPECT_EQ(1, profile.sample_count()); | 312 EXPECT_EQ(1, profile.sample_count()); |
313 ProfileTrieWalker walker(&profile); | 313 ProfileTrieWalker walker(&profile); |
314 | 314 |
315 // Exclusive code: B.boo -> main. | 315 // Exclusive code: B.boo -> main. |
316 walker.Reset(Profile::kExclusiveCode); | 316 walker.Reset(Profile::kExclusiveCode); |
317 // Move down from the root. | 317 // Move down from the root. |
318 EXPECT(walker.Down()); | 318 EXPECT(walker.Down()); |
319 EXPECT_STREQ("B.boo", walker.CurrentName()); | 319 EXPECT_STREQ("B.boo", walker.CurrentName()); |
320 EXPECT(walker.Down()); | 320 EXPECT(walker.Down()); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
355 result = Dart_Invoke(lib, NewString("main"), 0, NULL); | 355 result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
356 EXPECT_VALID(result); | 356 EXPECT_VALID(result); |
357 | 357 |
358 { | 358 { |
359 Thread* thread = Thread::Current(); | 359 Thread* thread = Thread::Current(); |
360 Isolate* isolate = thread->isolate(); | 360 Isolate* isolate = thread->isolate(); |
361 StackZone zone(thread); | 361 StackZone zone(thread); |
362 HANDLESCOPE(thread); | 362 HANDLESCOPE(thread); |
363 Profile profile(isolate); | 363 Profile profile(isolate); |
364 AllocationFilter filter(isolate, class_a.id()); | 364 AllocationFilter filter(isolate, class_a.id()); |
365 profile.Build(&filter, Profile::kNoTags); | 365 profile.Build(thread, &filter, Profile::kNoTags); |
366 // We should still only have one allocation sample. | 366 // We should still only have one allocation sample. |
367 EXPECT_EQ(1, profile.sample_count()); | 367 EXPECT_EQ(1, profile.sample_count()); |
368 } | 368 } |
369 } | 369 } |
370 | 370 |
371 | 371 |
372 TEST_CASE(Profiler_CodeTicks) { | 372 TEST_CASE(Profiler_CodeTicks) { |
373 DisableNativeProfileScope dnps; | 373 DisableNativeProfileScope dnps; |
374 const char* kScript = | 374 const char* kScript = |
375 "class A {\n" | 375 "class A {\n" |
(...skipping 20 matching lines...) Expand all Loading... |
396 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); | 396 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
397 EXPECT_VALID(result); | 397 EXPECT_VALID(result); |
398 | 398 |
399 { | 399 { |
400 Thread* thread = Thread::Current(); | 400 Thread* thread = Thread::Current(); |
401 Isolate* isolate = thread->isolate(); | 401 Isolate* isolate = thread->isolate(); |
402 StackZone zone(thread); | 402 StackZone zone(thread); |
403 HANDLESCOPE(thread); | 403 HANDLESCOPE(thread); |
404 Profile profile(isolate); | 404 Profile profile(isolate); |
405 AllocationFilter filter(isolate, class_a.id()); | 405 AllocationFilter filter(isolate, class_a.id()); |
406 profile.Build(&filter, Profile::kNoTags); | 406 profile.Build(thread, &filter, Profile::kNoTags); |
407 // We should have no allocation samples. | 407 // We should have no allocation samples. |
408 EXPECT_EQ(0, profile.sample_count()); | 408 EXPECT_EQ(0, profile.sample_count()); |
409 } | 409 } |
410 | 410 |
411 // Turn on allocation tracing for A. | 411 // Turn on allocation tracing for A. |
412 class_a.SetTraceAllocation(true); | 412 class_a.SetTraceAllocation(true); |
413 | 413 |
414 // Allocate three times. | 414 // Allocate three times. |
415 result = Dart_Invoke(lib, NewString("main"), 0, NULL); | 415 result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
416 EXPECT_VALID(result); | 416 EXPECT_VALID(result); |
417 result = Dart_Invoke(lib, NewString("main"), 0, NULL); | 417 result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
418 EXPECT_VALID(result); | 418 EXPECT_VALID(result); |
419 result = Dart_Invoke(lib, NewString("main"), 0, NULL); | 419 result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
420 EXPECT_VALID(result); | 420 EXPECT_VALID(result); |
421 | 421 |
422 { | 422 { |
423 Thread* thread = Thread::Current(); | 423 Thread* thread = Thread::Current(); |
424 Isolate* isolate = thread->isolate(); | 424 Isolate* isolate = thread->isolate(); |
425 StackZone zone(thread); | 425 StackZone zone(thread); |
426 HANDLESCOPE(thread); | 426 HANDLESCOPE(thread); |
427 Profile profile(isolate); | 427 Profile profile(isolate); |
428 AllocationFilter filter(isolate, class_a.id()); | 428 AllocationFilter filter(isolate, class_a.id()); |
429 profile.Build(&filter, Profile::kNoTags); | 429 profile.Build(thread, &filter, Profile::kNoTags); |
430 // We should have three allocation samples. | 430 // We should have three allocation samples. |
431 EXPECT_EQ(3, profile.sample_count()); | 431 EXPECT_EQ(3, profile.sample_count()); |
432 ProfileTrieWalker walker(&profile); | 432 ProfileTrieWalker walker(&profile); |
433 | 433 |
434 // Exclusive code: B.boo -> main. | 434 // Exclusive code: B.boo -> main. |
435 walker.Reset(Profile::kExclusiveCode); | 435 walker.Reset(Profile::kExclusiveCode); |
436 // Move down from the root. | 436 // Move down from the root. |
437 EXPECT(walker.Down()); | 437 EXPECT(walker.Down()); |
438 EXPECT_STREQ("B.boo", walker.CurrentName()); | 438 EXPECT_STREQ("B.boo", walker.CurrentName()); |
439 EXPECT_EQ(3, walker.CurrentNodeTickCount()); | 439 EXPECT_EQ(3, walker.CurrentNodeTickCount()); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
491 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); | 491 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
492 EXPECT_VALID(result); | 492 EXPECT_VALID(result); |
493 | 493 |
494 { | 494 { |
495 Thread* thread = Thread::Current(); | 495 Thread* thread = Thread::Current(); |
496 Isolate* isolate = thread->isolate(); | 496 Isolate* isolate = thread->isolate(); |
497 StackZone zone(thread); | 497 StackZone zone(thread); |
498 HANDLESCOPE(thread); | 498 HANDLESCOPE(thread); |
499 Profile profile(isolate); | 499 Profile profile(isolate); |
500 AllocationFilter filter(isolate, class_a.id()); | 500 AllocationFilter filter(isolate, class_a.id()); |
501 profile.Build(&filter, Profile::kNoTags); | 501 profile.Build(thread, &filter, Profile::kNoTags); |
502 // We should have no allocation samples. | 502 // We should have no allocation samples. |
503 EXPECT_EQ(0, profile.sample_count()); | 503 EXPECT_EQ(0, profile.sample_count()); |
504 } | 504 } |
505 | 505 |
506 // Turn on allocation tracing for A. | 506 // Turn on allocation tracing for A. |
507 class_a.SetTraceAllocation(true); | 507 class_a.SetTraceAllocation(true); |
508 | 508 |
509 // Allocate three times. | 509 // Allocate three times. |
510 result = Dart_Invoke(lib, NewString("main"), 0, NULL); | 510 result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
511 EXPECT_VALID(result); | 511 EXPECT_VALID(result); |
512 result = Dart_Invoke(lib, NewString("main"), 0, NULL); | 512 result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
513 EXPECT_VALID(result); | 513 EXPECT_VALID(result); |
514 result = Dart_Invoke(lib, NewString("main"), 0, NULL); | 514 result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
515 EXPECT_VALID(result); | 515 EXPECT_VALID(result); |
516 | 516 |
517 { | 517 { |
518 Thread* thread = Thread::Current(); | 518 Thread* thread = Thread::Current(); |
519 Isolate* isolate = thread->isolate(); | 519 Isolate* isolate = thread->isolate(); |
520 StackZone zone(thread); | 520 StackZone zone(thread); |
521 HANDLESCOPE(thread); | 521 HANDLESCOPE(thread); |
522 Profile profile(isolate); | 522 Profile profile(isolate); |
523 AllocationFilter filter(isolate, class_a.id()); | 523 AllocationFilter filter(isolate, class_a.id()); |
524 profile.Build(&filter, Profile::kNoTags); | 524 profile.Build(thread, &filter, Profile::kNoTags); |
525 // We should have three allocation samples. | 525 // We should have three allocation samples. |
526 EXPECT_EQ(3, profile.sample_count()); | 526 EXPECT_EQ(3, profile.sample_count()); |
527 ProfileTrieWalker walker(&profile); | 527 ProfileTrieWalker walker(&profile); |
528 | 528 |
529 // Exclusive function: B.boo -> main. | 529 // Exclusive function: B.boo -> main. |
530 walker.Reset(Profile::kExclusiveFunction); | 530 walker.Reset(Profile::kExclusiveFunction); |
531 // Move down from the root. | 531 // Move down from the root. |
532 EXPECT(walker.Down()); | 532 EXPECT(walker.Down()); |
533 EXPECT_STREQ("B.boo", walker.CurrentName()); | 533 EXPECT_STREQ("B.boo", walker.CurrentName()); |
534 EXPECT_EQ(3, walker.CurrentNodeTickCount()); | 534 EXPECT_EQ(3, walker.CurrentNodeTickCount()); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
575 Dart_Handle args[2] = { Dart_NewDouble(1.0), Dart_NewDouble(2.0), }; | 575 Dart_Handle args[2] = { Dart_NewDouble(1.0), Dart_NewDouble(2.0), }; |
576 | 576 |
577 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); | 577 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); |
578 EXPECT_VALID(result); | 578 EXPECT_VALID(result); |
579 | 579 |
580 { | 580 { |
581 StackZone zone(thread); | 581 StackZone zone(thread); |
582 HANDLESCOPE(thread); | 582 HANDLESCOPE(thread); |
583 Profile profile(isolate); | 583 Profile profile(isolate); |
584 AllocationFilter filter(isolate, double_class.id()); | 584 AllocationFilter filter(isolate, double_class.id()); |
585 profile.Build(&filter, Profile::kNoTags); | 585 profile.Build(thread, &filter, Profile::kNoTags); |
586 // We should have no allocation samples. | 586 // We should have no allocation samples. |
587 EXPECT_EQ(0, profile.sample_count()); | 587 EXPECT_EQ(0, profile.sample_count()); |
588 } | 588 } |
589 | 589 |
590 double_class.SetTraceAllocation(true); | 590 double_class.SetTraceAllocation(true); |
591 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); | 591 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); |
592 EXPECT_VALID(result); | 592 EXPECT_VALID(result); |
593 | 593 |
594 { | 594 { |
595 StackZone zone(thread); | 595 StackZone zone(thread); |
596 HANDLESCOPE(thread); | 596 HANDLESCOPE(thread); |
597 Profile profile(isolate); | 597 Profile profile(isolate); |
598 AllocationFilter filter(isolate, double_class.id()); | 598 AllocationFilter filter(isolate, double_class.id()); |
599 profile.Build(&filter, Profile::kNoTags); | 599 profile.Build(thread, &filter, Profile::kNoTags); |
600 // We should have one allocation sample. | 600 // We should have one allocation sample. |
601 EXPECT_EQ(1, profile.sample_count()); | 601 EXPECT_EQ(1, profile.sample_count()); |
602 ProfileTrieWalker walker(&profile); | 602 ProfileTrieWalker walker(&profile); |
603 | 603 |
604 walker.Reset(Profile::kExclusiveCode); | 604 walker.Reset(Profile::kExclusiveCode); |
605 EXPECT(walker.Down()); | 605 EXPECT(walker.Down()); |
606 EXPECT_STREQ("_Double._add", walker.CurrentName()); | 606 EXPECT_STREQ("_Double._add", walker.CurrentName()); |
607 EXPECT(walker.Down()); | 607 EXPECT(walker.Down()); |
608 EXPECT_STREQ("_Double.+", walker.CurrentName()); | 608 EXPECT_STREQ("_Double.+", walker.CurrentName()); |
609 EXPECT(walker.Down()); | 609 EXPECT(walker.Down()); |
610 EXPECT_STREQ("foo", walker.CurrentName()); | 610 EXPECT_STREQ("foo", walker.CurrentName()); |
611 EXPECT(!walker.Down()); | 611 EXPECT(!walker.Down()); |
612 } | 612 } |
613 | 613 |
614 double_class.SetTraceAllocation(false); | 614 double_class.SetTraceAllocation(false); |
615 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); | 615 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); |
616 EXPECT_VALID(result); | 616 EXPECT_VALID(result); |
617 | 617 |
618 { | 618 { |
619 StackZone zone(thread); | 619 StackZone zone(thread); |
620 HANDLESCOPE(thread); | 620 HANDLESCOPE(thread); |
621 Profile profile(isolate); | 621 Profile profile(isolate); |
622 AllocationFilter filter(isolate, double_class.id()); | 622 AllocationFilter filter(isolate, double_class.id()); |
623 profile.Build(&filter, Profile::kNoTags); | 623 profile.Build(thread, &filter, Profile::kNoTags); |
624 // We should still only have one allocation sample. | 624 // We should still only have one allocation sample. |
625 EXPECT_EQ(1, profile.sample_count()); | 625 EXPECT_EQ(1, profile.sample_count()); |
626 } | 626 } |
627 } | 627 } |
628 | 628 |
629 | 629 |
630 TEST_CASE(Profiler_ArrayAllocation) { | 630 TEST_CASE(Profiler_ArrayAllocation) { |
631 DisableNativeProfileScope dnps; | 631 DisableNativeProfileScope dnps; |
632 const char* kScript = | 632 const char* kScript = |
633 "List foo() => new List(4);\n" | 633 "List foo() => new List(4);\n" |
634 "List bar() => new List();\n"; | 634 "List bar() => new List();\n"; |
635 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); | 635 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
636 EXPECT_VALID(lib); | 636 EXPECT_VALID(lib); |
637 Library& root_library = Library::Handle(); | 637 Library& root_library = Library::Handle(); |
638 root_library ^= Api::UnwrapHandle(lib); | 638 root_library ^= Api::UnwrapHandle(lib); |
639 Isolate* isolate = thread->isolate(); | 639 Isolate* isolate = thread->isolate(); |
640 | 640 |
641 const Class& array_class = | 641 const Class& array_class = |
642 Class::Handle(isolate->object_store()->array_class()); | 642 Class::Handle(isolate->object_store()->array_class()); |
643 EXPECT(!array_class.IsNull()); | 643 EXPECT(!array_class.IsNull()); |
644 | 644 |
645 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 645 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
646 EXPECT_VALID(result); | 646 EXPECT_VALID(result); |
647 | 647 |
648 { | 648 { |
649 StackZone zone(thread); | 649 StackZone zone(thread); |
650 HANDLESCOPE(thread); | 650 HANDLESCOPE(thread); |
651 Profile profile(isolate); | 651 Profile profile(isolate); |
652 AllocationFilter filter(isolate, array_class.id()); | 652 AllocationFilter filter(isolate, array_class.id()); |
653 profile.Build(&filter, Profile::kNoTags); | 653 profile.Build(thread, &filter, Profile::kNoTags); |
654 // We should have no allocation samples. | 654 // We should have no allocation samples. |
655 EXPECT_EQ(0, profile.sample_count()); | 655 EXPECT_EQ(0, profile.sample_count()); |
656 } | 656 } |
657 | 657 |
658 array_class.SetTraceAllocation(true); | 658 array_class.SetTraceAllocation(true); |
659 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 659 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
660 EXPECT_VALID(result); | 660 EXPECT_VALID(result); |
661 | 661 |
662 { | 662 { |
663 StackZone zone(thread); | 663 StackZone zone(thread); |
664 HANDLESCOPE(thread); | 664 HANDLESCOPE(thread); |
665 Profile profile(isolate); | 665 Profile profile(isolate); |
666 AllocationFilter filter(isolate, array_class.id()); | 666 AllocationFilter filter(isolate, array_class.id()); |
667 profile.Build(&filter, Profile::kNoTags); | 667 profile.Build(thread, &filter, Profile::kNoTags); |
668 // We should have one allocation sample. | 668 // We should have one allocation sample. |
669 EXPECT_EQ(1, profile.sample_count()); | 669 EXPECT_EQ(1, profile.sample_count()); |
670 ProfileTrieWalker walker(&profile); | 670 ProfileTrieWalker walker(&profile); |
671 | 671 |
672 walker.Reset(Profile::kExclusiveCode); | 672 walker.Reset(Profile::kExclusiveCode); |
673 EXPECT(walker.Down()); | 673 EXPECT(walker.Down()); |
674 EXPECT_STREQ("_List._List", walker.CurrentName()); | 674 EXPECT_STREQ("_List._List", walker.CurrentName()); |
675 EXPECT(walker.Down()); | 675 EXPECT(walker.Down()); |
676 EXPECT_STREQ("List.List", walker.CurrentName()); | 676 EXPECT_STREQ("List.List", walker.CurrentName()); |
677 EXPECT(walker.Down()); | 677 EXPECT(walker.Down()); |
678 EXPECT_STREQ("foo", walker.CurrentName()); | 678 EXPECT_STREQ("foo", walker.CurrentName()); |
679 EXPECT(!walker.Down()); | 679 EXPECT(!walker.Down()); |
680 } | 680 } |
681 | 681 |
682 array_class.SetTraceAllocation(false); | 682 array_class.SetTraceAllocation(false); |
683 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 683 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
684 EXPECT_VALID(result); | 684 EXPECT_VALID(result); |
685 | 685 |
686 { | 686 { |
687 StackZone zone(thread); | 687 StackZone zone(thread); |
688 HANDLESCOPE(thread); | 688 HANDLESCOPE(thread); |
689 Profile profile(isolate); | 689 Profile profile(isolate); |
690 AllocationFilter filter(isolate, array_class.id()); | 690 AllocationFilter filter(isolate, array_class.id()); |
691 profile.Build(&filter, Profile::kNoTags); | 691 profile.Build(thread, &filter, Profile::kNoTags); |
692 // We should still only have one allocation sample. | 692 // We should still only have one allocation sample. |
693 EXPECT_EQ(1, profile.sample_count()); | 693 EXPECT_EQ(1, profile.sample_count()); |
694 } | 694 } |
695 | 695 |
696 // Clear the samples. | 696 // Clear the samples. |
697 ProfilerService::ClearSamples(); | 697 ProfilerService::ClearSamples(); |
698 | 698 |
699 // Compile bar (many List objects allocated). | 699 // Compile bar (many List objects allocated). |
700 result = Dart_Invoke(lib, NewString("bar"), 0, NULL); | 700 result = Dart_Invoke(lib, NewString("bar"), 0, NULL); |
701 EXPECT_VALID(result); | 701 EXPECT_VALID(result); |
702 | 702 |
703 // Enable again. | 703 // Enable again. |
704 array_class.SetTraceAllocation(true); | 704 array_class.SetTraceAllocation(true); |
705 | 705 |
706 // Run bar. | 706 // Run bar. |
707 result = Dart_Invoke(lib, NewString("bar"), 0, NULL); | 707 result = Dart_Invoke(lib, NewString("bar"), 0, NULL); |
708 EXPECT_VALID(result); | 708 EXPECT_VALID(result); |
709 | 709 |
710 { | 710 { |
711 StackZone zone(thread); | 711 StackZone zone(thread); |
712 HANDLESCOPE(thread); | 712 HANDLESCOPE(thread); |
713 Profile profile(isolate); | 713 Profile profile(isolate); |
714 AllocationFilter filter(isolate, array_class.id()); | 714 AllocationFilter filter(isolate, array_class.id()); |
715 profile.Build(&filter, Profile::kNoTags); | 715 profile.Build(thread, &filter, Profile::kNoTags); |
716 // We should still only have one allocation sample. | 716 // We should still only have one allocation sample. |
717 EXPECT_EQ(1, profile.sample_count()); | 717 EXPECT_EQ(1, profile.sample_count()); |
718 ProfileTrieWalker walker(&profile); | 718 ProfileTrieWalker walker(&profile); |
719 | 719 |
720 walker.Reset(Profile::kExclusiveCode); | 720 walker.Reset(Profile::kExclusiveCode); |
721 EXPECT(walker.Down()); | 721 EXPECT(walker.Down()); |
722 EXPECT_STREQ("_List._List", walker.CurrentName()); | 722 EXPECT_STREQ("_List._List", walker.CurrentName()); |
723 EXPECT(walker.Down()); | 723 EXPECT(walker.Down()); |
724 EXPECT_STREQ("_GrowableList._GrowableList", walker.CurrentName()); | 724 EXPECT_STREQ("_GrowableList._GrowableList", walker.CurrentName()); |
725 EXPECT(walker.Down()); | 725 EXPECT(walker.Down()); |
(...skipping 24 matching lines...) Expand all Loading... |
750 EXPECT(!context_class.IsNull()); | 750 EXPECT(!context_class.IsNull()); |
751 | 751 |
752 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 752 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
753 EXPECT_VALID(result); | 753 EXPECT_VALID(result); |
754 | 754 |
755 { | 755 { |
756 StackZone zone(thread); | 756 StackZone zone(thread); |
757 HANDLESCOPE(thread); | 757 HANDLESCOPE(thread); |
758 Profile profile(isolate); | 758 Profile profile(isolate); |
759 AllocationFilter filter(isolate, context_class.id()); | 759 AllocationFilter filter(isolate, context_class.id()); |
760 profile.Build(&filter, Profile::kNoTags); | 760 profile.Build(thread, &filter, Profile::kNoTags); |
761 // We should have no allocation samples. | 761 // We should have no allocation samples. |
762 EXPECT_EQ(0, profile.sample_count()); | 762 EXPECT_EQ(0, profile.sample_count()); |
763 } | 763 } |
764 | 764 |
765 context_class.SetTraceAllocation(true); | 765 context_class.SetTraceAllocation(true); |
766 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 766 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
767 EXPECT_VALID(result); | 767 EXPECT_VALID(result); |
768 | 768 |
769 { | 769 { |
770 StackZone zone(thread); | 770 StackZone zone(thread); |
771 HANDLESCOPE(thread); | 771 HANDLESCOPE(thread); |
772 Profile profile(isolate); | 772 Profile profile(isolate); |
773 AllocationFilter filter(isolate, context_class.id()); | 773 AllocationFilter filter(isolate, context_class.id()); |
774 profile.Build(&filter, Profile::kNoTags); | 774 profile.Build(thread, &filter, Profile::kNoTags); |
775 // We should have one allocation sample. | 775 // We should have one allocation sample. |
776 EXPECT_EQ(1, profile.sample_count()); | 776 EXPECT_EQ(1, profile.sample_count()); |
777 ProfileTrieWalker walker(&profile); | 777 ProfileTrieWalker walker(&profile); |
778 | 778 |
779 walker.Reset(Profile::kExclusiveCode); | 779 walker.Reset(Profile::kExclusiveCode); |
780 EXPECT(walker.Down()); | 780 EXPECT(walker.Down()); |
781 EXPECT_STREQ("foo", walker.CurrentName()); | 781 EXPECT_STREQ("foo", walker.CurrentName()); |
782 EXPECT(!walker.Down()); | 782 EXPECT(!walker.Down()); |
783 } | 783 } |
784 | 784 |
785 context_class.SetTraceAllocation(false); | 785 context_class.SetTraceAllocation(false); |
786 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 786 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
787 EXPECT_VALID(result); | 787 EXPECT_VALID(result); |
788 | 788 |
789 { | 789 { |
790 StackZone zone(thread); | 790 StackZone zone(thread); |
791 HANDLESCOPE(thread); | 791 HANDLESCOPE(thread); |
792 Profile profile(isolate); | 792 Profile profile(isolate); |
793 AllocationFilter filter(isolate, context_class.id()); | 793 AllocationFilter filter(isolate, context_class.id()); |
794 profile.Build(&filter, Profile::kNoTags); | 794 profile.Build(thread, &filter, Profile::kNoTags); |
795 // We should still only have one allocation sample. | 795 // We should still only have one allocation sample. |
796 EXPECT_EQ(1, profile.sample_count()); | 796 EXPECT_EQ(1, profile.sample_count()); |
797 } | 797 } |
798 } | 798 } |
799 | 799 |
800 | 800 |
801 TEST_CASE(Profiler_ClassAllocation) { | 801 TEST_CASE(Profiler_ClassAllocation) { |
802 DisableNativeProfileScope dnps; | 802 DisableNativeProfileScope dnps; |
803 const char* kScript = | 803 const char* kScript = |
804 "var msg1 = 'a';\n" | 804 "var msg1 = 'a';\n" |
(...skipping 23 matching lines...) Expand all Loading... |
828 // Invoke "foo" which during compilation, triggers a closure class allocation. | 828 // Invoke "foo" which during compilation, triggers a closure class allocation. |
829 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 829 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
830 EXPECT_VALID(result); | 830 EXPECT_VALID(result); |
831 | 831 |
832 { | 832 { |
833 StackZone zone(thread); | 833 StackZone zone(thread); |
834 HANDLESCOPE(thread); | 834 HANDLESCOPE(thread); |
835 Profile profile(isolate); | 835 Profile profile(isolate); |
836 AllocationFilter filter(isolate, class_class.id()); | 836 AllocationFilter filter(isolate, class_class.id()); |
837 filter.set_enable_embedder_ticks(true); | 837 filter.set_enable_embedder_ticks(true); |
838 profile.Build(&filter, Profile::kNoTags); | 838 profile.Build(thread, &filter, Profile::kNoTags); |
839 // We should have one allocation sample. | 839 // We should have one allocation sample. |
840 EXPECT_EQ(1, profile.sample_count()); | 840 EXPECT_EQ(1, profile.sample_count()); |
841 ProfileTrieWalker walker(&profile); | 841 ProfileTrieWalker walker(&profile); |
842 | 842 |
843 walker.Reset(Profile::kExclusiveCode); | 843 walker.Reset(Profile::kExclusiveCode); |
844 EXPECT(walker.Down()); | 844 EXPECT(walker.Down()); |
845 #if defined(TARGET_OS_WINDOWS) | 845 #if defined(TARGET_OS_WINDOWS) |
846 // TODO(johnmccutchan): Hookup native symbol resolver on Windows. | 846 // TODO(johnmccutchan): Hookup native symbol resolver on Windows. |
847 EXPECT_SUBSTRING("[Native]", walker.CurrentName()); | 847 EXPECT_SUBSTRING("[Native]", walker.CurrentName()); |
848 #else | 848 #else |
849 EXPECT_SUBSTRING("dart::Profiler::RecordAllocation", walker.CurrentName()); | 849 EXPECT_SUBSTRING("dart::Profiler::RecordAllocation", walker.CurrentName()); |
850 #endif | 850 #endif |
851 EXPECT(!walker.Down()); | 851 EXPECT(!walker.Down()); |
852 } | 852 } |
853 | 853 |
854 // Disable allocation tracing for Class. | 854 // Disable allocation tracing for Class. |
855 class_class.SetTraceAllocation(false); | 855 class_class.SetTraceAllocation(false); |
856 | 856 |
857 // Invoke "bar" which during compilation, triggers a closure class allocation. | 857 // Invoke "bar" which during compilation, triggers a closure class allocation. |
858 result = Dart_Invoke(lib, NewString("bar"), 0, NULL); | 858 result = Dart_Invoke(lib, NewString("bar"), 0, NULL); |
859 EXPECT_VALID(result); | 859 EXPECT_VALID(result); |
860 | 860 |
861 { | 861 { |
862 StackZone zone(thread); | 862 StackZone zone(thread); |
863 HANDLESCOPE(thread); | 863 HANDLESCOPE(thread); |
864 Profile profile(isolate); | 864 Profile profile(isolate); |
865 AllocationFilter filter(isolate, class_class.id()); | 865 AllocationFilter filter(isolate, class_class.id()); |
866 filter.set_enable_embedder_ticks(true); | 866 filter.set_enable_embedder_ticks(true); |
867 profile.Build(&filter, Profile::kNoTags); | 867 profile.Build(thread, &filter, Profile::kNoTags); |
868 // We should still only have one allocation sample. | 868 // We should still only have one allocation sample. |
869 EXPECT_EQ(1, profile.sample_count()); | 869 EXPECT_EQ(1, profile.sample_count()); |
870 } | 870 } |
871 } | 871 } |
872 | 872 |
873 | 873 |
874 TEST_CASE(Profiler_TypedArrayAllocation) { | 874 TEST_CASE(Profiler_TypedArrayAllocation) { |
875 DisableNativeProfileScope dnps; | 875 DisableNativeProfileScope dnps; |
876 const char* kScript = | 876 const char* kScript = |
877 "import 'dart:typed_data';\n" | 877 "import 'dart:typed_data';\n" |
(...skipping 12 matching lines...) Expand all Loading... |
890 EXPECT(!float32_list_class.IsNull()); | 890 EXPECT(!float32_list_class.IsNull()); |
891 | 891 |
892 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 892 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
893 EXPECT_VALID(result); | 893 EXPECT_VALID(result); |
894 | 894 |
895 { | 895 { |
896 StackZone zone(thread); | 896 StackZone zone(thread); |
897 HANDLESCOPE(thread); | 897 HANDLESCOPE(thread); |
898 Profile profile(isolate); | 898 Profile profile(isolate); |
899 AllocationFilter filter(isolate, float32_list_class.id()); | 899 AllocationFilter filter(isolate, float32_list_class.id()); |
900 profile.Build(&filter, Profile::kNoTags); | 900 profile.Build(thread, &filter, Profile::kNoTags); |
901 // We should have no allocation samples. | 901 // We should have no allocation samples. |
902 EXPECT_EQ(0, profile.sample_count()); | 902 EXPECT_EQ(0, profile.sample_count()); |
903 } | 903 } |
904 | 904 |
905 float32_list_class.SetTraceAllocation(true); | 905 float32_list_class.SetTraceAllocation(true); |
906 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 906 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
907 EXPECT_VALID(result); | 907 EXPECT_VALID(result); |
908 | 908 |
909 { | 909 { |
910 StackZone zone(thread); | 910 StackZone zone(thread); |
911 HANDLESCOPE(thread); | 911 HANDLESCOPE(thread); |
912 Profile profile(isolate); | 912 Profile profile(isolate); |
913 AllocationFilter filter(isolate, float32_list_class.id()); | 913 AllocationFilter filter(isolate, float32_list_class.id()); |
914 profile.Build(&filter, Profile::kNoTags); | 914 profile.Build(thread, &filter, Profile::kNoTags); |
915 // We should have one allocation sample. | 915 // We should have one allocation sample. |
916 EXPECT_EQ(1, profile.sample_count()); | 916 EXPECT_EQ(1, profile.sample_count()); |
917 ProfileTrieWalker walker(&profile); | 917 ProfileTrieWalker walker(&profile); |
918 | 918 |
919 walker.Reset(Profile::kExclusiveCode); | 919 walker.Reset(Profile::kExclusiveCode); |
920 EXPECT(walker.Down()); | 920 EXPECT(walker.Down()); |
921 EXPECT_STREQ("_Float32Array._new", walker.CurrentName()); | 921 EXPECT_STREQ("_Float32Array._new", walker.CurrentName()); |
922 EXPECT(walker.Down()); | 922 EXPECT(walker.Down()); |
923 EXPECT_STREQ("_Float32Array._Float32Array", walker.CurrentName()); | 923 EXPECT_STREQ("_Float32Array._Float32Array", walker.CurrentName()); |
924 EXPECT(walker.Down()); | 924 EXPECT(walker.Down()); |
925 EXPECT_STREQ("Float32List.Float32List", walker.CurrentName()); | 925 EXPECT_STREQ("Float32List.Float32List", walker.CurrentName()); |
926 EXPECT(walker.Down()); | 926 EXPECT(walker.Down()); |
927 EXPECT_STREQ("foo", walker.CurrentName()); | 927 EXPECT_STREQ("foo", walker.CurrentName()); |
928 EXPECT(!walker.Down()); | 928 EXPECT(!walker.Down()); |
929 } | 929 } |
930 | 930 |
931 float32_list_class.SetTraceAllocation(false); | 931 float32_list_class.SetTraceAllocation(false); |
932 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 932 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
933 EXPECT_VALID(result); | 933 EXPECT_VALID(result); |
934 | 934 |
935 { | 935 { |
936 StackZone zone(thread); | 936 StackZone zone(thread); |
937 HANDLESCOPE(thread); | 937 HANDLESCOPE(thread); |
938 Profile profile(isolate); | 938 Profile profile(isolate); |
939 AllocationFilter filter(isolate, float32_list_class.id()); | 939 AllocationFilter filter(isolate, float32_list_class.id()); |
940 profile.Build(&filter, Profile::kNoTags); | 940 profile.Build(thread, &filter, Profile::kNoTags); |
941 // We should still only have one allocation sample. | 941 // We should still only have one allocation sample. |
942 EXPECT_EQ(1, profile.sample_count()); | 942 EXPECT_EQ(1, profile.sample_count()); |
943 } | 943 } |
944 | 944 |
945 float32_list_class.SetTraceAllocation(true); | 945 float32_list_class.SetTraceAllocation(true); |
946 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); | 946 result = Dart_Invoke(lib, NewString("foo"), 0, NULL); |
947 EXPECT_VALID(result); | 947 EXPECT_VALID(result); |
948 | 948 |
949 { | 949 { |
950 StackZone zone(thread); | 950 StackZone zone(thread); |
951 HANDLESCOPE(thread); | 951 HANDLESCOPE(thread); |
952 Profile profile(isolate); | 952 Profile profile(isolate); |
953 AllocationFilter filter(isolate, float32_list_class.id()); | 953 AllocationFilter filter(isolate, float32_list_class.id()); |
954 profile.Build(&filter, Profile::kNoTags); | 954 profile.Build(thread, &filter, Profile::kNoTags); |
955 // We should now have two allocation samples. | 955 // We should now have two allocation samples. |
956 EXPECT_EQ(2, profile.sample_count()); | 956 EXPECT_EQ(2, profile.sample_count()); |
957 } | 957 } |
958 } | 958 } |
959 | 959 |
960 | 960 |
961 TEST_CASE(Profiler_StringAllocation) { | 961 TEST_CASE(Profiler_StringAllocation) { |
962 DisableNativeProfileScope dnps; | 962 DisableNativeProfileScope dnps; |
963 const char* kScript = "String foo(String a, String b) => a + b;"; | 963 const char* kScript = "String foo(String a, String b) => a + b;"; |
964 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); | 964 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
965 EXPECT_VALID(lib); | 965 EXPECT_VALID(lib); |
966 Library& root_library = Library::Handle(); | 966 Library& root_library = Library::Handle(); |
967 root_library ^= Api::UnwrapHandle(lib); | 967 root_library ^= Api::UnwrapHandle(lib); |
968 Isolate* isolate = thread->isolate(); | 968 Isolate* isolate = thread->isolate(); |
969 | 969 |
970 const Class& one_byte_string_class = | 970 const Class& one_byte_string_class = |
971 Class::Handle(isolate->object_store()->one_byte_string_class()); | 971 Class::Handle(isolate->object_store()->one_byte_string_class()); |
972 EXPECT(!one_byte_string_class.IsNull()); | 972 EXPECT(!one_byte_string_class.IsNull()); |
973 | 973 |
974 Dart_Handle args[2] = { NewString("a"), NewString("b"), }; | 974 Dart_Handle args[2] = { NewString("a"), NewString("b"), }; |
975 | 975 |
976 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); | 976 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); |
977 EXPECT_VALID(result); | 977 EXPECT_VALID(result); |
978 | 978 |
979 { | 979 { |
980 StackZone zone(thread); | 980 StackZone zone(thread); |
981 HANDLESCOPE(thread); | 981 HANDLESCOPE(thread); |
982 Profile profile(isolate); | 982 Profile profile(isolate); |
983 AllocationFilter filter(isolate, one_byte_string_class.id()); | 983 AllocationFilter filter(isolate, one_byte_string_class.id()); |
984 profile.Build(&filter, Profile::kNoTags); | 984 profile.Build(thread, &filter, Profile::kNoTags); |
985 // We should have no allocation samples. | 985 // We should have no allocation samples. |
986 EXPECT_EQ(0, profile.sample_count()); | 986 EXPECT_EQ(0, profile.sample_count()); |
987 } | 987 } |
988 | 988 |
989 one_byte_string_class.SetTraceAllocation(true); | 989 one_byte_string_class.SetTraceAllocation(true); |
990 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); | 990 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); |
991 EXPECT_VALID(result); | 991 EXPECT_VALID(result); |
992 | 992 |
993 { | 993 { |
994 StackZone zone(thread); | 994 StackZone zone(thread); |
995 HANDLESCOPE(thread); | 995 HANDLESCOPE(thread); |
996 Profile profile(isolate); | 996 Profile profile(isolate); |
997 AllocationFilter filter(isolate, one_byte_string_class.id()); | 997 AllocationFilter filter(isolate, one_byte_string_class.id()); |
998 profile.Build(&filter, Profile::kNoTags); | 998 profile.Build(thread, &filter, Profile::kNoTags); |
999 // We should still only have one allocation sample. | 999 // We should still only have one allocation sample. |
1000 EXPECT_EQ(1, profile.sample_count()); | 1000 EXPECT_EQ(1, profile.sample_count()); |
1001 ProfileTrieWalker walker(&profile); | 1001 ProfileTrieWalker walker(&profile); |
1002 | 1002 |
1003 walker.Reset(Profile::kExclusiveCode); | 1003 walker.Reset(Profile::kExclusiveCode); |
1004 EXPECT(walker.Down()); | 1004 EXPECT(walker.Down()); |
1005 EXPECT_STREQ("_StringBase.+", walker.CurrentName()); | 1005 EXPECT_STREQ("_StringBase.+", walker.CurrentName()); |
1006 EXPECT(walker.Down()); | 1006 EXPECT(walker.Down()); |
1007 EXPECT_STREQ("foo", walker.CurrentName()); | 1007 EXPECT_STREQ("foo", walker.CurrentName()); |
1008 EXPECT(!walker.Down()); | 1008 EXPECT(!walker.Down()); |
1009 } | 1009 } |
1010 | 1010 |
1011 one_byte_string_class.SetTraceAllocation(false); | 1011 one_byte_string_class.SetTraceAllocation(false); |
1012 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); | 1012 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); |
1013 EXPECT_VALID(result); | 1013 EXPECT_VALID(result); |
1014 | 1014 |
1015 { | 1015 { |
1016 StackZone zone(thread); | 1016 StackZone zone(thread); |
1017 HANDLESCOPE(thread); | 1017 HANDLESCOPE(thread); |
1018 Profile profile(isolate); | 1018 Profile profile(isolate); |
1019 AllocationFilter filter(isolate, one_byte_string_class.id()); | 1019 AllocationFilter filter(isolate, one_byte_string_class.id()); |
1020 profile.Build(&filter, Profile::kNoTags); | 1020 profile.Build(thread, &filter, Profile::kNoTags); |
1021 // We should still only have one allocation sample. | 1021 // We should still only have one allocation sample. |
1022 EXPECT_EQ(1, profile.sample_count()); | 1022 EXPECT_EQ(1, profile.sample_count()); |
1023 } | 1023 } |
1024 | 1024 |
1025 one_byte_string_class.SetTraceAllocation(true); | 1025 one_byte_string_class.SetTraceAllocation(true); |
1026 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); | 1026 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); |
1027 EXPECT_VALID(result); | 1027 EXPECT_VALID(result); |
1028 | 1028 |
1029 { | 1029 { |
1030 StackZone zone(thread); | 1030 StackZone zone(thread); |
1031 HANDLESCOPE(thread); | 1031 HANDLESCOPE(thread); |
1032 Profile profile(isolate); | 1032 Profile profile(isolate); |
1033 AllocationFilter filter(isolate, one_byte_string_class.id()); | 1033 AllocationFilter filter(isolate, one_byte_string_class.id()); |
1034 profile.Build(&filter, Profile::kNoTags); | 1034 profile.Build(thread, &filter, Profile::kNoTags); |
1035 // We should now have two allocation samples. | 1035 // We should now have two allocation samples. |
1036 EXPECT_EQ(2, profile.sample_count()); | 1036 EXPECT_EQ(2, profile.sample_count()); |
1037 } | 1037 } |
1038 } | 1038 } |
1039 | 1039 |
1040 | 1040 |
1041 TEST_CASE(Profiler_StringInterpolation) { | 1041 TEST_CASE(Profiler_StringInterpolation) { |
1042 DisableNativeProfileScope dnps; | 1042 DisableNativeProfileScope dnps; |
1043 const char* kScript = "String foo(String a, String b) => '$a | $b';"; | 1043 const char* kScript = "String foo(String a, String b) => '$a | $b';"; |
1044 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); | 1044 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
1045 EXPECT_VALID(lib); | 1045 EXPECT_VALID(lib); |
1046 Library& root_library = Library::Handle(); | 1046 Library& root_library = Library::Handle(); |
1047 root_library ^= Api::UnwrapHandle(lib); | 1047 root_library ^= Api::UnwrapHandle(lib); |
1048 Isolate* isolate = thread->isolate(); | 1048 Isolate* isolate = thread->isolate(); |
1049 | 1049 |
1050 const Class& one_byte_string_class = | 1050 const Class& one_byte_string_class = |
1051 Class::Handle(isolate->object_store()->one_byte_string_class()); | 1051 Class::Handle(isolate->object_store()->one_byte_string_class()); |
1052 EXPECT(!one_byte_string_class.IsNull()); | 1052 EXPECT(!one_byte_string_class.IsNull()); |
1053 | 1053 |
1054 Dart_Handle args[2] = { NewString("a"), NewString("b"), }; | 1054 Dart_Handle args[2] = { NewString("a"), NewString("b"), }; |
1055 | 1055 |
1056 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); | 1056 Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); |
1057 EXPECT_VALID(result); | 1057 EXPECT_VALID(result); |
1058 | 1058 |
1059 { | 1059 { |
1060 StackZone zone(thread); | 1060 StackZone zone(thread); |
1061 HANDLESCOPE(thread); | 1061 HANDLESCOPE(thread); |
1062 Profile profile(isolate); | 1062 Profile profile(isolate); |
1063 AllocationFilter filter(isolate, one_byte_string_class.id()); | 1063 AllocationFilter filter(isolate, one_byte_string_class.id()); |
1064 profile.Build(&filter, Profile::kNoTags); | 1064 profile.Build(thread, &filter, Profile::kNoTags); |
1065 // We should have no allocation samples. | 1065 // We should have no allocation samples. |
1066 EXPECT_EQ(0, profile.sample_count()); | 1066 EXPECT_EQ(0, profile.sample_count()); |
1067 } | 1067 } |
1068 | 1068 |
1069 one_byte_string_class.SetTraceAllocation(true); | 1069 one_byte_string_class.SetTraceAllocation(true); |
1070 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); | 1070 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); |
1071 EXPECT_VALID(result); | 1071 EXPECT_VALID(result); |
1072 | 1072 |
1073 { | 1073 { |
1074 StackZone zone(thread); | 1074 StackZone zone(thread); |
1075 HANDLESCOPE(thread); | 1075 HANDLESCOPE(thread); |
1076 Profile profile(isolate); | 1076 Profile profile(isolate); |
1077 AllocationFilter filter(isolate, one_byte_string_class.id()); | 1077 AllocationFilter filter(isolate, one_byte_string_class.id()); |
1078 profile.Build(&filter, Profile::kNoTags); | 1078 profile.Build(thread, &filter, Profile::kNoTags); |
1079 // We should still only have one allocation sample. | 1079 // We should still only have one allocation sample. |
1080 EXPECT_EQ(1, profile.sample_count()); | 1080 EXPECT_EQ(1, profile.sample_count()); |
1081 ProfileTrieWalker walker(&profile); | 1081 ProfileTrieWalker walker(&profile); |
1082 | 1082 |
1083 walker.Reset(Profile::kExclusiveCode); | 1083 walker.Reset(Profile::kExclusiveCode); |
1084 EXPECT(walker.Down()); | 1084 EXPECT(walker.Down()); |
1085 EXPECT_STREQ("_OneByteString._allocate", walker.CurrentName()); | 1085 EXPECT_STREQ("_OneByteString._allocate", walker.CurrentName()); |
1086 EXPECT(walker.Down()); | 1086 EXPECT(walker.Down()); |
1087 EXPECT_STREQ("_OneByteString._concatAll", walker.CurrentName()); | 1087 EXPECT_STREQ("_OneByteString._concatAll", walker.CurrentName()); |
1088 EXPECT(walker.Down()); | 1088 EXPECT(walker.Down()); |
1089 EXPECT_STREQ("_StringBase._interpolate", walker.CurrentName()); | 1089 EXPECT_STREQ("_StringBase._interpolate", walker.CurrentName()); |
1090 EXPECT(walker.Down()); | 1090 EXPECT(walker.Down()); |
1091 EXPECT_STREQ("foo", walker.CurrentName()); | 1091 EXPECT_STREQ("foo", walker.CurrentName()); |
1092 EXPECT(!walker.Down()); | 1092 EXPECT(!walker.Down()); |
1093 } | 1093 } |
1094 | 1094 |
1095 one_byte_string_class.SetTraceAllocation(false); | 1095 one_byte_string_class.SetTraceAllocation(false); |
1096 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); | 1096 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); |
1097 EXPECT_VALID(result); | 1097 EXPECT_VALID(result); |
1098 | 1098 |
1099 { | 1099 { |
1100 StackZone zone(thread); | 1100 StackZone zone(thread); |
1101 HANDLESCOPE(thread); | 1101 HANDLESCOPE(thread); |
1102 Profile profile(isolate); | 1102 Profile profile(isolate); |
1103 AllocationFilter filter(isolate, one_byte_string_class.id()); | 1103 AllocationFilter filter(isolate, one_byte_string_class.id()); |
1104 profile.Build(&filter, Profile::kNoTags); | 1104 profile.Build(thread, &filter, Profile::kNoTags); |
1105 // We should still only have one allocation sample. | 1105 // We should still only have one allocation sample. |
1106 EXPECT_EQ(1, profile.sample_count()); | 1106 EXPECT_EQ(1, profile.sample_count()); |
1107 } | 1107 } |
1108 | 1108 |
1109 one_byte_string_class.SetTraceAllocation(true); | 1109 one_byte_string_class.SetTraceAllocation(true); |
1110 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); | 1110 result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]); |
1111 EXPECT_VALID(result); | 1111 EXPECT_VALID(result); |
1112 | 1112 |
1113 { | 1113 { |
1114 StackZone zone(thread); | 1114 StackZone zone(thread); |
1115 HANDLESCOPE(thread); | 1115 HANDLESCOPE(thread); |
1116 Profile profile(isolate); | 1116 Profile profile(isolate); |
1117 AllocationFilter filter(isolate, one_byte_string_class.id()); | 1117 AllocationFilter filter(isolate, one_byte_string_class.id()); |
1118 profile.Build(&filter, Profile::kNoTags); | 1118 profile.Build(thread, &filter, Profile::kNoTags); |
1119 // We should now have two allocation samples. | 1119 // We should now have two allocation samples. |
1120 EXPECT_EQ(2, profile.sample_count()); | 1120 EXPECT_EQ(2, profile.sample_count()); |
1121 } | 1121 } |
1122 } | 1122 } |
1123 | 1123 |
1124 | 1124 |
1125 TEST_CASE(Profiler_FunctionInline) { | 1125 TEST_CASE(Profiler_FunctionInline) { |
1126 DisableNativeProfileScope dnps; | 1126 DisableNativeProfileScope dnps; |
1127 const char* kScript = | 1127 const char* kScript = |
1128 "class A {\n" | 1128 "class A {\n" |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1166 EXPECT_VALID(result); | 1166 EXPECT_VALID(result); |
1167 // At this point B.boo should be optimized and inlined B.foo and B.choo. | 1167 // At this point B.boo should be optimized and inlined B.foo and B.choo. |
1168 | 1168 |
1169 { | 1169 { |
1170 Thread* thread = Thread::Current(); | 1170 Thread* thread = Thread::Current(); |
1171 Isolate* isolate = thread->isolate(); | 1171 Isolate* isolate = thread->isolate(); |
1172 StackZone zone(thread); | 1172 StackZone zone(thread); |
1173 HANDLESCOPE(thread); | 1173 HANDLESCOPE(thread); |
1174 Profile profile(isolate); | 1174 Profile profile(isolate); |
1175 AllocationFilter filter(isolate, class_a.id()); | 1175 AllocationFilter filter(isolate, class_a.id()); |
1176 profile.Build(&filter, Profile::kNoTags); | 1176 profile.Build(thread, &filter, Profile::kNoTags); |
1177 // We should have no allocation samples. | 1177 // We should have no allocation samples. |
1178 EXPECT_EQ(0, profile.sample_count()); | 1178 EXPECT_EQ(0, profile.sample_count()); |
1179 } | 1179 } |
1180 | 1180 |
1181 // Turn on allocation tracing for A. | 1181 // Turn on allocation tracing for A. |
1182 class_a.SetTraceAllocation(true); | 1182 class_a.SetTraceAllocation(true); |
1183 | 1183 |
1184 // Allocate 50,000 instances of A. | 1184 // Allocate 50,000 instances of A. |
1185 result = Dart_Invoke(lib, NewString("mainA"), 0, NULL); | 1185 result = Dart_Invoke(lib, NewString("mainA"), 0, NULL); |
1186 EXPECT_VALID(result); | 1186 EXPECT_VALID(result); |
1187 | 1187 |
1188 { | 1188 { |
1189 Thread* thread = Thread::Current(); | 1189 Thread* thread = Thread::Current(); |
1190 Isolate* isolate = thread->isolate(); | 1190 Isolate* isolate = thread->isolate(); |
1191 StackZone zone(thread); | 1191 StackZone zone(thread); |
1192 HANDLESCOPE(thread); | 1192 HANDLESCOPE(thread); |
1193 Profile profile(isolate); | 1193 Profile profile(isolate); |
1194 AllocationFilter filter(isolate, class_a.id()); | 1194 AllocationFilter filter(isolate, class_a.id()); |
1195 profile.Build(&filter, Profile::kNoTags); | 1195 profile.Build(thread, &filter, Profile::kNoTags); |
1196 // We should have 50,000 allocation samples. | 1196 // We should have 50,000 allocation samples. |
1197 EXPECT_EQ(50000, profile.sample_count()); | 1197 EXPECT_EQ(50000, profile.sample_count()); |
1198 ProfileTrieWalker walker(&profile); | 1198 ProfileTrieWalker walker(&profile); |
1199 // We have two code objects: mainA and B.boo. | 1199 // We have two code objects: mainA and B.boo. |
1200 walker.Reset(Profile::kExclusiveCode); | 1200 walker.Reset(Profile::kExclusiveCode); |
1201 EXPECT(walker.Down()); | 1201 EXPECT(walker.Down()); |
1202 EXPECT_STREQ("B.boo", walker.CurrentName()); | 1202 EXPECT_STREQ("B.boo", walker.CurrentName()); |
1203 EXPECT_EQ(1, walker.SiblingCount()); | 1203 EXPECT_EQ(1, walker.SiblingCount()); |
1204 EXPECT_EQ(50000, walker.CurrentNodeTickCount()); | 1204 EXPECT_EQ(50000, walker.CurrentNodeTickCount()); |
1205 EXPECT_EQ(50000, walker.CurrentInclusiveTicks()); | 1205 EXPECT_EQ(50000, walker.CurrentInclusiveTicks()); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1287 } | 1287 } |
1288 | 1288 |
1289 // Test code transition tags. | 1289 // Test code transition tags. |
1290 { | 1290 { |
1291 Thread* thread = Thread::Current(); | 1291 Thread* thread = Thread::Current(); |
1292 Isolate* isolate = thread->isolate(); | 1292 Isolate* isolate = thread->isolate(); |
1293 StackZone zone(thread); | 1293 StackZone zone(thread); |
1294 HANDLESCOPE(thread); | 1294 HANDLESCOPE(thread); |
1295 Profile profile(isolate); | 1295 Profile profile(isolate); |
1296 AllocationFilter filter(isolate, class_a.id()); | 1296 AllocationFilter filter(isolate, class_a.id()); |
1297 profile.Build(&filter, | 1297 profile.Build(thread, |
| 1298 &filter, |
1298 Profile::kNoTags, | 1299 Profile::kNoTags, |
1299 ProfilerService::kCodeTransitionTagsBit); | 1300 ProfilerService::kCodeTransitionTagsBit); |
1300 // We should have 50,000 allocation samples. | 1301 // We should have 50,000 allocation samples. |
1301 EXPECT_EQ(50000, profile.sample_count()); | 1302 EXPECT_EQ(50000, profile.sample_count()); |
1302 ProfileTrieWalker walker(&profile); | 1303 ProfileTrieWalker walker(&profile); |
1303 // We have two code objects: mainA and B.boo. | 1304 // We have two code objects: mainA and B.boo. |
1304 walker.Reset(Profile::kExclusiveCode); | 1305 walker.Reset(Profile::kExclusiveCode); |
1305 EXPECT(walker.Down()); | 1306 EXPECT(walker.Down()); |
1306 EXPECT_STREQ("B.boo", walker.CurrentName()); | 1307 EXPECT_STREQ("B.boo", walker.CurrentName()); |
1307 EXPECT(walker.Down()); | 1308 EXPECT(walker.Down()); |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1419 EXPECT_VALID(result); | 1420 EXPECT_VALID(result); |
1420 | 1421 |
1421 | 1422 |
1422 { | 1423 { |
1423 Thread* thread = Thread::Current(); | 1424 Thread* thread = Thread::Current(); |
1424 Isolate* isolate = thread->isolate(); | 1425 Isolate* isolate = thread->isolate(); |
1425 StackZone zone(thread); | 1426 StackZone zone(thread); |
1426 HANDLESCOPE(thread); | 1427 HANDLESCOPE(thread); |
1427 Profile profile(isolate); | 1428 Profile profile(isolate); |
1428 AllocationFilter filter(isolate, class_a.id()); | 1429 AllocationFilter filter(isolate, class_a.id()); |
1429 profile.Build(&filter, Profile::kNoTags); | 1430 profile.Build(thread, &filter, Profile::kNoTags); |
1430 // We should have 1 allocation sample. | 1431 // We should have 1 allocation sample. |
1431 EXPECT_EQ(1, profile.sample_count()); | 1432 EXPECT_EQ(1, profile.sample_count()); |
1432 ProfileTrieWalker walker(&profile); | 1433 ProfileTrieWalker walker(&profile); |
1433 | 1434 |
1434 walker.Reset(Profile::kExclusiveCode); | 1435 walker.Reset(Profile::kExclusiveCode); |
1435 // Move down from the root. | 1436 // Move down from the root. |
1436 EXPECT(walker.Down()); | 1437 EXPECT(walker.Down()); |
1437 EXPECT_STREQ("B.boo", walker.CurrentName()); | 1438 EXPECT_STREQ("B.boo", walker.CurrentName()); |
1438 EXPECT(walker.Down()); | 1439 EXPECT(walker.Down()); |
1439 EXPECT_STREQ("orange", walker.CurrentName()); | 1440 EXPECT_STREQ("orange", walker.CurrentName()); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1472 EXPECT(walker.Down()); | 1473 EXPECT(walker.Down()); |
1473 EXPECT_STREQ("go", walker.CurrentName()); | 1474 EXPECT_STREQ("go", walker.CurrentName()); |
1474 EXPECT(walker.Down()); | 1475 EXPECT(walker.Down()); |
1475 EXPECT_STREQ("main", walker.CurrentName()); | 1476 EXPECT_STREQ("main", walker.CurrentName()); |
1476 EXPECT(!walker.Down()); | 1477 EXPECT(!walker.Down()); |
1477 } | 1478 } |
1478 } | 1479 } |
1479 | 1480 |
1480 } // namespace dart | 1481 } // namespace dart |
1481 | 1482 |
OLD | NEW |