|
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