diff options
author | erikchen <erikchen@chromium.org> | 2015-09-08 16:36:29 -0700 |
---|---|---|
committer | erikchen <erikchen@chromium.org> | 2015-09-08 23:38:42 +0000 |
commit | f9ca8f5f0656036f8062be85a38b0f243bb0df34 (patch) | |
tree | 8a4cc4fd492a5522f5e20f39d9df9d3c991b80eb /base | |
parent | 207ddf4c6885c8165363b4f75485665530ab1fbb (diff) | |
download | chromium_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.cc | 5 | ||||
-rw-r--r-- | base/pickle.h | 1 | ||||
-rw-r--r-- | base/pickle_unittest.cc | 14 |
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 |