summaryrefslogtreecommitdiffstats
path: root/base
diff options
context:
space:
mode:
authorerikchen <erikchen@chromium.org>2015-09-08 16:36:29 -0700
committererikchen <erikchen@chromium.org>2015-09-08 23:38:42 +0000
commitf9ca8f5f0656036f8062be85a38b0f243bb0df34 (patch)
tree8a4cc4fd492a5522f5e20f39d9df9d3c991b80eb /base
parent207ddf4c6885c8165363b4f75485665530ab1fbb (diff)
downloadchromium_src-f9ca8f5f0656036f8062be85a38b0f243bb0df34.zip
chromium_src-f9ca8f5f0656036f8062be85a38b0f243bb0df34.tar.gz
chromium_src-f9ca8f5f0656036f8062be85a38b0f243bb0df34.tar.bz2
base: Fix an inefficiency in base::Pickle that caused extraneous allocations.
The Resize() method is supposed to be passed the size of the payload, not including the header. In the copy constructor, it was being passed the size of the payload plus the header. BUG= R=mark@chromium.org Review URL: https://codereview.chromium.org/1327523006 . Cr-Commit-Position: refs/heads/master@{#347826}
Diffstat (limited to 'base')
-rw-r--r--base/pickle.cc5
-rw-r--r--base/pickle.h1
-rw-r--r--base/pickle_unittest.cc14
3 files changed, 17 insertions, 3 deletions
diff --git a/base/pickle.cc b/base/pickle.cc
index d4487d4..7c8ffed 100644
--- a/base/pickle.cc
+++ b/base/pickle.cc
@@ -254,9 +254,8 @@ Pickle::Pickle(const Pickle& other)
header_size_(other.header_size_),
capacity_after_header_(0),
write_offset_(other.write_offset_) {
- size_t payload_size = header_size_ + other.header_->payload_size;
- Resize(payload_size);
- memcpy(header_, other.header_, payload_size);
+ Resize(other.header_->payload_size);
+ memcpy(header_, other.header_, header_size_ + other.header_->payload_size);
}
Pickle::~Pickle() {
diff --git a/base/pickle.h b/base/pickle.h
index 40a983b..b6ec116 100644
--- a/base/pickle.h
+++ b/base/pickle.h
@@ -296,6 +296,7 @@ class BASE_EXPORT Pickle {
}
inline void WriteBytesCommon(const void* data, size_t length);
+ FRIEND_TEST_ALL_PREFIXES(PickleTest, DeepCopyResize);
FRIEND_TEST_ALL_PREFIXES(PickleTest, Resize);
FRIEND_TEST_ALL_PREFIXES(PickleTest, FindNext);
FRIEND_TEST_ALL_PREFIXES(PickleTest, FindNextWithIncompleteHeader);
diff --git a/base/pickle_unittest.cc b/base/pickle_unittest.cc
index b0a8f21..6f9fcc7 100644
--- a/base/pickle_unittest.cc
+++ b/base/pickle_unittest.cc
@@ -428,4 +428,18 @@ TEST(PickleTest, ReadBytes) {
EXPECT_EQ(data, outdata);
}
+// Checks that when a pickle is deep-copied, the result is not larger than
+// needed.
+TEST(PickleTest, DeepCopyResize) {
+ Pickle pickle;
+ while (pickle.capacity_after_header() != pickle.payload_size())
+ pickle.WriteBool(true);
+
+ // Make a deep copy.
+ Pickle pickle2(pickle);
+
+ // Check that there isn't any extraneous capacity.
+ EXPECT_EQ(pickle.capacity_after_header(), pickle2.capacity_after_header());
+}
+
} // namespace base