Skip to content

Commit ae8ac77

Browse files
authored
[lldb][test] Provide TrackingOutputBufferDeleter for custom unique_ptr deleter (#142815)
Suggested in #142676 as a way to automatically free the buffer in tests
1 parent 2917040 commit ae8ac77

File tree

1 file changed

+56
-36
lines changed

1 file changed

+56
-36
lines changed

lldb/unittests/Core/MangledTest.cpp

Lines changed: 56 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,31 @@
2626

2727
#include "gtest/gtest.h"
2828

29+
#include <cstdlib>
30+
#include <memory>
31+
2932
using namespace lldb;
3033
using namespace lldb_private;
3134

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+
3254
TEST(MangledTest, ResultForValidName) {
3355
ConstString MangledName("_ZN1a1b1cIiiiEEvm");
3456
Mangled TheMangled(MangledName);
@@ -589,25 +611,25 @@ TEST_P(DemanglingPartsTestFixture, DemanglingParts) {
589611

590612
ASSERT_NE(nullptr, Root);
591613

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);
595618

596-
ASSERT_EQ(OB.NameInfo.hasBasename(), valid_basename);
619+
ASSERT_EQ(OB->NameInfo.hasBasename(), valid_basename);
597620

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);
602625

603626
auto get_part = [&](const std::pair<size_t, size_t> &loc) {
604627
return demangled.substr(loc.first, loc.second - loc.first);
605628
};
606629

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);
611633
}
612634

613635
INSTANTIATE_TEST_SUITE_P(DemanglingPartsTests, DemanglingPartsTestFixture,
@@ -635,44 +657,42 @@ TEST_P(DemanglingInfoCorrectnessTestFixutre, Correctness) {
635657

636658
ASSERT_NE(nullptr, Root);
637659

638-
TrackingOutputBuffer OB;
639-
Root->print(OB);
660+
auto OB = std::unique_ptr<TrackingOutputBuffer, TrackingOutputBufferDeleter>(
661+
new TrackingOutputBuffer());
662+
Root->print(*OB);
640663

641664
// Filter out cases which would never show up in frames. We only care about
642665
// function names.
643666
if (Root->getKind() !=
644667
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)
647669
return;
648-
}
649670

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,
668689
llvm::StringRef::npos);
669690

670691
auto reconstructed_name =
671692
llvm::join_items("", return_left, scope, basename, template_args, args,
672693
return_right, qualifiers, suffix);
673694

674695
EXPECT_EQ(reconstructed_name, demangled);
675-
std::free(OB.getBuffer());
676696
}
677697

678698
INSTANTIATE_TEST_SUITE_P(

0 commit comments

Comments
 (0)