| Index: base/pickle.cc
|
| diff --git a/base/pickle.cc b/base/pickle.cc
|
| index cf4a865d35c337421b0acea57a05211fa076b06f..d4487d45b24d61238309d3db48b1f17f4f2e0cca 100644
|
| --- a/base/pickle.cc
|
| +++ b/base/pickle.cc
|
| @@ -8,6 +8,9 @@
|
|
|
| #include <algorithm> // for max()
|
|
|
| +#include "base/bits.h"
|
| +#include "base/macros.h"
|
| +
|
| namespace base {
|
|
|
| // static
|
| @@ -34,7 +37,7 @@ inline bool PickleIterator::ReadBuiltinType(Type* result) {
|
| }
|
|
|
| inline void PickleIterator::Advance(size_t size) {
|
| - size_t aligned_size = AlignInt(size, sizeof(uint32_t));
|
| + size_t aligned_size = bits::Align(size, sizeof(uint32_t));
|
| if (end_index_ - read_index_ < aligned_size) {
|
| read_index_ = end_index_;
|
| } else {
|
| @@ -210,13 +213,15 @@ Pickle::Pickle()
|
| header_size_(sizeof(Header)),
|
| capacity_after_header_(0),
|
| write_offset_(0) {
|
| + static_assert((Pickle::kPayloadUnit & (Pickle::kPayloadUnit - 1)) == 0,
|
| + "Pickle::kPayloadUnit must be a power of two");
|
| Resize(kPayloadUnit);
|
| header_->payload_size = 0;
|
| }
|
|
|
| Pickle::Pickle(int header_size)
|
| : header_(NULL),
|
| - header_size_(AlignInt(header_size, sizeof(uint32))),
|
| + header_size_(bits::Align(header_size, sizeof(uint32))),
|
| capacity_after_header_(0),
|
| write_offset_(0) {
|
| DCHECK_GE(static_cast<size_t>(header_size), sizeof(Header));
|
| @@ -236,7 +241,7 @@ Pickle::Pickle(const char* data, int data_len)
|
| if (header_size_ > static_cast<unsigned int>(data_len))
|
| header_size_ = 0;
|
|
|
| - if (header_size_ != AlignInt(header_size_, sizeof(uint32)))
|
| + if (header_size_ != bits::Align(header_size_, sizeof(uint32)))
|
| header_size_ = 0;
|
|
|
| // If there is anything wrong with the data, we're not going to use it.
|
| @@ -305,7 +310,7 @@ bool Pickle::WriteBytes(const void* data, int length) {
|
| }
|
|
|
| void Pickle::Reserve(size_t length) {
|
| - size_t data_len = AlignInt(length, sizeof(uint32));
|
| + size_t data_len = bits::Align(length, sizeof(uint32));
|
| DCHECK_GE(data_len, length);
|
| #ifdef ARCH_CPU_64_BITS
|
| DCHECK_LE(data_len, kuint32max);
|
| @@ -318,7 +323,7 @@ void Pickle::Reserve(size_t length) {
|
|
|
| void Pickle::Resize(size_t new_capacity) {
|
| CHECK_NE(capacity_after_header_, kCapacityReadOnly);
|
| - capacity_after_header_ = AlignInt(new_capacity, kPayloadUnit);
|
| + capacity_after_header_ = bits::Align(new_capacity, kPayloadUnit);
|
| void* p = realloc(header_, GetTotalAllocatedSize());
|
| CHECK(p);
|
| header_ = reinterpret_cast<Header*>(p);
|
| @@ -334,7 +339,7 @@ size_t Pickle::GetTotalAllocatedSize() const {
|
| const char* Pickle::FindNext(size_t header_size,
|
| const char* start,
|
| const char* end) {
|
| - DCHECK_EQ(header_size, AlignInt(header_size, sizeof(uint32)));
|
| + DCHECK_EQ(header_size, bits::Align(header_size, sizeof(uint32)));
|
| DCHECK_LE(header_size, static_cast<size_t>(kPayloadUnit));
|
|
|
| size_t length = static_cast<size_t>(end - start);
|
| @@ -359,7 +364,7 @@ inline void Pickle::WriteBytesCommon(const void* data, size_t length) {
|
| DCHECK_NE(kCapacityReadOnly, capacity_after_header_)
|
| << "oops: pickle is readonly";
|
| MSAN_CHECK_MEM_IS_INITIALIZED(data, length);
|
| - size_t data_len = AlignInt(length, sizeof(uint32));
|
| + size_t data_len = bits::Align(length, sizeof(uint32));
|
| DCHECK_GE(data_len, length);
|
| #ifdef ARCH_CPU_64_BITS
|
| DCHECK_LE(data_len, kuint32max);
|
| @@ -367,7 +372,11 @@ inline void Pickle::WriteBytesCommon(const void* data, size_t length) {
|
| DCHECK_LE(write_offset_, kuint32max - data_len);
|
| size_t new_size = write_offset_ + data_len;
|
| if (new_size > capacity_after_header_) {
|
| - Resize(std::max(capacity_after_header_ * 2, new_size));
|
| + size_t new_capacity = capacity_after_header_ * 2;
|
| + const size_t kPickleHeapAlign = 4096;
|
| + if (new_capacity > kPickleHeapAlign)
|
| + new_capacity = bits::Align(new_capacity, kPickleHeapAlign) - kPayloadUnit;
|
| + Resize(std::max(new_capacity, new_size));
|
| }
|
|
|
| char* write = mutable_payload() + write_offset_;
|
|
|