summaryrefslogtreecommitdiff
path: root/absl/strings/cord.cc
diff options
context:
space:
mode:
Diffstat (limited to 'absl/strings/cord.cc')
-rw-r--r--absl/strings/cord.cc21
1 files changed, 11 insertions, 10 deletions
diff --git a/absl/strings/cord.cc b/absl/strings/cord.cc
index 1c2ff9f2..238532f9 100644
--- a/absl/strings/cord.cc
+++ b/absl/strings/cord.cc
@@ -531,18 +531,19 @@ void Cord::InlineRep::AssignSlow(const Cord::InlineRep& src) {
assert(&src != this);
assert(is_tree() || src.is_tree());
auto constexpr method = CordzUpdateTracker::kAssignCord;
- if (CordRep* tree = this->tree()) {
- CordzUpdateScope scope(data_.cordz_info(), method);
- CordRep::Unref(tree);
- if (CordRep* src_tree = src.tree()) {
- SetTree(CordRep::Ref(src_tree), scope);
- } else {
- scope.SetCordRep(nullptr);
- data_ = src.data_;
- }
+ if (ABSL_PREDICT_TRUE(!is_tree())) {
+ EmplaceTree(CordRep::Ref(src.as_tree()), src.data_, method);
+ return;
+ }
+ CordRep* tree = as_tree();
+ if (CordRep* src_tree = src.tree()) {
+ data_.set_tree(CordRep::Ref(src_tree));
+ CordzInfo::MaybeTrackCord(data_, src.data_, method);
} else {
- EmplaceTree(CordRep::Ref(src.as_tree()), method);
+ CordzInfo::MaybeUntrackCord(data_.cordz_info());
+ data_ = src.data_;
}
+ CordRep::Unref(tree);
}
void Cord::InlineRep::UnrefTree() {