|
26 | 26 |
|
27 | 27 | #include "gtest/gtest.h" |
28 | 28 |
|
| 29 | +#include <cstdlib> |
| 30 | +#include <memory> |
| 31 | + |
29 | 32 | using namespace lldb; |
30 | 33 | using namespace lldb_private; |
31 | 34 |
|
| 35 | +/// Custom deleter to use with unique_ptr. |
| 36 | +/// |
| 37 | +/// Usage: |
| 38 | +/// \code{.cpp} |
| 39 | +/// |
| 40 | +/// auto OB = |
| 41 | +/// std::unique_ptr<TrackingOutputBuffer, TrackingOutputBufferDeleter>( |
| 42 | +/// new TrackingOutputBuffer()); |
| 43 | +/// |
| 44 | +/// \endcode |
| 45 | +struct TrackingOutputBufferDeleter { |
| 46 | + void operator()(TrackingOutputBuffer *TOB) { |
| 47 | + if (!TOB) |
| 48 | + return; |
| 49 | + std::free(TOB->getBuffer()); |
| 50 | + delete TOB; |
| 51 | + } |
| 52 | +}; |
| 53 | + |
32 | 54 | TEST(MangledTest, ResultForValidName) { |
33 | 55 | ConstString MangledName("_ZN1a1b1cIiiiEEvm"); |
34 | 56 | Mangled TheMangled(MangledName); |
@@ -589,25 +611,25 @@ TEST_P(DemanglingPartsTestFixture, DemanglingParts) { |
589 | 611 |
|
590 | 612 | ASSERT_NE(nullptr, Root); |
591 | 613 |
|
592 | | - TrackingOutputBuffer OB; |
593 | | - Root->print(OB); |
594 | | - auto demangled = std::string_view(OB); |
| 614 | + auto OB = std::unique_ptr<TrackingOutputBuffer, TrackingOutputBufferDeleter>( |
| 615 | + new TrackingOutputBuffer()); |
| 616 | + Root->print(*OB); |
| 617 | + auto demangled = std::string_view(*OB); |
595 | 618 |
|
596 | | - ASSERT_EQ(OB.NameInfo.hasBasename(), valid_basename); |
| 619 | + ASSERT_EQ(OB->NameInfo.hasBasename(), valid_basename); |
597 | 620 |
|
598 | | - EXPECT_EQ(OB.NameInfo.BasenameRange, info.BasenameRange); |
599 | | - EXPECT_EQ(OB.NameInfo.ScopeRange, info.ScopeRange); |
600 | | - EXPECT_EQ(OB.NameInfo.ArgumentsRange, info.ArgumentsRange); |
601 | | - EXPECT_EQ(OB.NameInfo.QualifiersRange, info.QualifiersRange); |
| 621 | + EXPECT_EQ(OB->NameInfo.BasenameRange, info.BasenameRange); |
| 622 | + EXPECT_EQ(OB->NameInfo.ScopeRange, info.ScopeRange); |
| 623 | + EXPECT_EQ(OB->NameInfo.ArgumentsRange, info.ArgumentsRange); |
| 624 | + EXPECT_EQ(OB->NameInfo.QualifiersRange, info.QualifiersRange); |
602 | 625 |
|
603 | 626 | auto get_part = [&](const std::pair<size_t, size_t> &loc) { |
604 | 627 | return demangled.substr(loc.first, loc.second - loc.first); |
605 | 628 | }; |
606 | 629 |
|
607 | | - EXPECT_EQ(get_part(OB.NameInfo.BasenameRange), basename); |
608 | | - EXPECT_EQ(get_part(OB.NameInfo.ScopeRange), scope); |
609 | | - EXPECT_EQ(get_part(OB.NameInfo.QualifiersRange), qualifiers); |
610 | | - std::free(OB.getBuffer()); |
| 630 | + EXPECT_EQ(get_part(OB->NameInfo.BasenameRange), basename); |
| 631 | + EXPECT_EQ(get_part(OB->NameInfo.ScopeRange), scope); |
| 632 | + EXPECT_EQ(get_part(OB->NameInfo.QualifiersRange), qualifiers); |
611 | 633 | } |
612 | 634 |
|
613 | 635 | INSTANTIATE_TEST_SUITE_P(DemanglingPartsTests, DemanglingPartsTestFixture, |
@@ -635,44 +657,42 @@ TEST_P(DemanglingInfoCorrectnessTestFixutre, Correctness) { |
635 | 657 |
|
636 | 658 | ASSERT_NE(nullptr, Root); |
637 | 659 |
|
638 | | - TrackingOutputBuffer OB; |
639 | | - Root->print(OB); |
| 660 | + auto OB = std::unique_ptr<TrackingOutputBuffer, TrackingOutputBufferDeleter>( |
| 661 | + new TrackingOutputBuffer()); |
| 662 | + Root->print(*OB); |
640 | 663 |
|
641 | 664 | // Filter out cases which would never show up in frames. We only care about |
642 | 665 | // function names. |
643 | 666 | if (Root->getKind() != |
644 | 667 | llvm::itanium_demangle::Node::Kind::KFunctionEncoding && |
645 | | - Root->getKind() != llvm::itanium_demangle::Node::Kind::KDotSuffix) { |
646 | | - std::free(OB.getBuffer()); |
| 668 | + Root->getKind() != llvm::itanium_demangle::Node::Kind::KDotSuffix) |
647 | 669 | return; |
648 | | - } |
649 | 670 |
|
650 | | - ASSERT_TRUE(OB.NameInfo.hasBasename()); |
651 | | - |
652 | | - auto tracked_name = llvm::StringRef(OB); |
653 | | - |
654 | | - auto return_left = tracked_name.slice(0, OB.NameInfo.ScopeRange.first); |
655 | | - auto scope = tracked_name.slice(OB.NameInfo.ScopeRange.first, |
656 | | - OB.NameInfo.ScopeRange.second); |
657 | | - auto basename = tracked_name.slice(OB.NameInfo.BasenameRange.first, |
658 | | - OB.NameInfo.BasenameRange.second); |
659 | | - auto template_args = tracked_name.slice(OB.NameInfo.BasenameRange.second, |
660 | | - OB.NameInfo.ArgumentsRange.first); |
661 | | - auto args = tracked_name.slice(OB.NameInfo.ArgumentsRange.first, |
662 | | - OB.NameInfo.ArgumentsRange.second); |
663 | | - auto return_right = tracked_name.slice(OB.NameInfo.ArgumentsRange.second, |
664 | | - OB.NameInfo.QualifiersRange.first); |
665 | | - auto qualifiers = tracked_name.slice(OB.NameInfo.QualifiersRange.first, |
666 | | - OB.NameInfo.QualifiersRange.second); |
667 | | - auto suffix = tracked_name.slice(OB.NameInfo.QualifiersRange.second, |
| 671 | + ASSERT_TRUE(OB->NameInfo.hasBasename()); |
| 672 | + |
| 673 | + auto tracked_name = llvm::StringRef(*OB); |
| 674 | + |
| 675 | + auto return_left = tracked_name.slice(0, OB->NameInfo.ScopeRange.first); |
| 676 | + auto scope = tracked_name.slice(OB->NameInfo.ScopeRange.first, |
| 677 | + OB->NameInfo.ScopeRange.second); |
| 678 | + auto basename = tracked_name.slice(OB->NameInfo.BasenameRange.first, |
| 679 | + OB->NameInfo.BasenameRange.second); |
| 680 | + auto template_args = tracked_name.slice(OB->NameInfo.BasenameRange.second, |
| 681 | + OB->NameInfo.ArgumentsRange.first); |
| 682 | + auto args = tracked_name.slice(OB->NameInfo.ArgumentsRange.first, |
| 683 | + OB->NameInfo.ArgumentsRange.second); |
| 684 | + auto return_right = tracked_name.slice(OB->NameInfo.ArgumentsRange.second, |
| 685 | + OB->NameInfo.QualifiersRange.first); |
| 686 | + auto qualifiers = tracked_name.slice(OB->NameInfo.QualifiersRange.first, |
| 687 | + OB->NameInfo.QualifiersRange.second); |
| 688 | + auto suffix = tracked_name.slice(OB->NameInfo.QualifiersRange.second, |
668 | 689 | llvm::StringRef::npos); |
669 | 690 |
|
670 | 691 | auto reconstructed_name = |
671 | 692 | llvm::join_items("", return_left, scope, basename, template_args, args, |
672 | 693 | return_right, qualifiers, suffix); |
673 | 694 |
|
674 | 695 | EXPECT_EQ(reconstructed_name, demangled); |
675 | | - std::free(OB.getBuffer()); |
676 | 696 | } |
677 | 697 |
|
678 | 698 | INSTANTIATE_TEST_SUITE_P( |
|
0 commit comments