diff options
author | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-20 02:34:57 +0000 |
---|---|---|
committer | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-20 02:34:57 +0000 |
commit | 0d0ed0c73c9710e8ab6ff80dd3750b70f0f751bf (patch) | |
tree | a9f66bd0f7c2df003a6f9066eee37dee067ce5dd | |
parent | 0a7be8d8aed47cc460e1e848092377c2c426b89c (diff) | |
download | chromium_src-0d0ed0c73c9710e8ab6ff80dd3750b70f0f751bf.zip chromium_src-0d0ed0c73c9710e8ab6ff80dd3750b70f0f751bf.tar.gz chromium_src-0d0ed0c73c9710e8ab6ff80dd3750b70f0f751bf.tar.bz2 |
Reverting due to memory waterfall failures.
Revert 138044 - Allowed BinaryValue to take a NULL buffer.
BUG=127630
Review URL: https://chromiumcodereview.appspot.com/10389088
TBR=mitchellwrosen@chromium.org
Review URL: https://chromiumcodereview.appspot.com/10388207
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@138050 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | base/values.cc | 36 | ||||
-rw-r--r-- | base/values.h | 26 | ||||
-rw-r--r-- | base/values_unittest.cc | 30 | ||||
-rw-r--r-- | chrome/browser/extensions/api/socket/socket_api.cc | 8 |
4 files changed, 60 insertions, 40 deletions
diff --git a/base/values.cc b/base/values.cc index 648d0bc..d561d68 100644 --- a/base/values.cc +++ b/base/values.cc @@ -298,32 +298,33 @@ bool StringValue::Equals(const Value* other) const { ///////////////////// BinaryValue //////////////////// -BinaryValue::BinaryValue() - : Value(TYPE_BINARY), - buffer_(NULL), - size_(0) { +BinaryValue::~BinaryValue() { + DCHECK(buffer_); + if (buffer_) + delete[] buffer_; } -BinaryValue::BinaryValue(scoped_ptr<char> buffer, size_t size) - : Value(TYPE_BINARY), - buffer_(buffer.release()), - size_(size) { -} +// static +BinaryValue* BinaryValue::Create(char* buffer, size_t size) { + if (!buffer) + return NULL; -BinaryValue::~BinaryValue() { + return new BinaryValue(buffer, size); } // static BinaryValue* BinaryValue::CreateWithCopiedBuffer(const char* buffer, size_t size) { + if (!buffer) + return NULL; + char* buffer_copy = new char[size]; memcpy(buffer_copy, buffer, size); - scoped_ptr<char> scoped_buffer_copy(buffer_copy); - return new BinaryValue(scoped_buffer_copy.Pass(), size); + return new BinaryValue(buffer_copy, size); } BinaryValue* BinaryValue::DeepCopy() const { - return CreateWithCopiedBuffer(buffer_.get(), size_); + return CreateWithCopiedBuffer(buffer_, size_); } bool BinaryValue::Equals(const Value* other) const { @@ -332,7 +333,14 @@ bool BinaryValue::Equals(const Value* other) const { const BinaryValue* other_binary = static_cast<const BinaryValue*>(other); if (other_binary->size_ != size_) return false; - return !memcmp(GetBuffer(), other_binary->GetBuffer(), size_); + return !memcmp(buffer_, other_binary->buffer_, size_); +} + +BinaryValue::BinaryValue(char* buffer, size_t size) + : Value(TYPE_BINARY), + buffer_(buffer), + size_(size) { + DCHECK(buffer_); } ///////////////////// DictionaryValue //////////////////// diff --git a/base/values.h b/base/values.h index adb795f..1d35d63 100644 --- a/base/values.h +++ b/base/values.h @@ -30,7 +30,6 @@ #include "base/base_export.h" #include "base/basictypes.h" #include "base/compiler_specific.h" -#include "base/memory/scoped_ptr.h" #include "base/string16.h" // This file declares "using base::Value", etc. at the bottom, so that @@ -178,32 +177,33 @@ class BASE_EXPORT StringValue : public Value { class BASE_EXPORT BinaryValue: public Value { public: - // Creates a BinaryValue with a null buffer and size of 0. - BinaryValue(); - - // Creates a BinaryValue, taking ownership of the bytes pointed to by - // |buffer|. - BinaryValue(scoped_ptr<char> buffer, size_t size); - virtual ~BinaryValue(); + // Creates a Value to represent a binary buffer. The new object takes + // ownership of the pointer passed in, if successful. + // Returns NULL if buffer is NULL. + static BinaryValue* Create(char* buffer, size_t size); + // For situations where you want to keep ownership of your buffer, this // factory method creates a new BinaryValue by copying the contents of the // buffer that's passed in. + // Returns NULL if buffer is NULL. static BinaryValue* CreateWithCopiedBuffer(const char* buffer, size_t size); size_t GetSize() const { return size_; } - - // May return NULL. - char* GetBuffer() { return buffer_.get(); } - const char* GetBuffer() const { return buffer_.get(); } + char* GetBuffer() { return buffer_; } + const char* GetBuffer() const { return buffer_; } // Overridden from Value: virtual BinaryValue* DeepCopy() const OVERRIDE; virtual bool Equals(const Value* other) const OVERRIDE; private: - scoped_ptr<char> buffer_; + // Constructor is private so that only objects with valid buffer pointers + // and size values can be created. + BinaryValue(char* buffer, size_t size); + + char* buffer_; size_t size_; DISALLOW_COPY_AND_ASSIGN(BinaryValue); diff --git a/base/values_unittest.cc b/base/values_unittest.cc index b0dd22e..9b92949 100644 --- a/base/values_unittest.cc +++ b/base/values_unittest.cc @@ -105,15 +105,23 @@ TEST(ValuesTest, List) { } TEST(ValuesTest, BinaryValue) { - // Default constructor creates a BinaryValue with a null buffer and size 0. - scoped_ptr<BinaryValue> binary(new BinaryValue()); + char* buffer = NULL; + // Passing a null buffer pointer doesn't yield a BinaryValue + scoped_ptr<BinaryValue> binary(BinaryValue::Create(buffer, 0)); + ASSERT_FALSE(binary.get()); + + // If you want to represent an empty binary value, use a zero-length buffer. + buffer = new char[1]; + ASSERT_TRUE(buffer); + binary.reset(BinaryValue::Create(buffer, 0)); ASSERT_TRUE(binary.get()); - ASSERT_EQ(NULL, binary->GetBuffer()); + ASSERT_TRUE(binary->GetBuffer()); + ASSERT_EQ(buffer, binary->GetBuffer()); ASSERT_EQ(0U, binary->GetSize()); // Test the common case of a non-empty buffer - char* buffer = new char[15]; - binary.reset(new BinaryValue(scoped_ptr<char>(buffer), 15)); + buffer = new char[15]; + binary.reset(BinaryValue::Create(buffer, 15)); ASSERT_TRUE(binary.get()); ASSERT_TRUE(binary->GetBuffer()); ASSERT_EQ(buffer, binary->GetBuffer()); @@ -342,9 +350,9 @@ TEST(ValuesTest, DeepCopy) { Value::CreateStringValue(ASCIIToUTF16("hello16")); original_dict.Set("string16", original_string16); - scoped_ptr<char> original_buffer(new char[42]); - memset(original_buffer.get(), '!', 42); - BinaryValue* original_binary = new BinaryValue(original_buffer.Pass(), 42); + char* original_buffer = new char[42]; + memset(original_buffer, '!', 42); + BinaryValue* original_binary = BinaryValue::Create(original_buffer, 42); original_dict.Set("binary", original_binary); ListValue* original_list = new ListValue(); @@ -550,9 +558,9 @@ TEST(ValuesTest, DeepCopyCovariantReturnTypes) { Value::CreateStringValue(ASCIIToUTF16("hello16")); original_dict.Set("string16", original_string16); - scoped_ptr<char> original_buffer(new char[42]); - memset(original_buffer.get(), '!', 42); - BinaryValue* original_binary = new BinaryValue(original_buffer.Pass(), 42); + char* original_buffer = new char[42]; + memset(original_buffer, '!', 42); + BinaryValue* original_binary = BinaryValue::Create(original_buffer, 42); original_dict.Set("binary", original_binary); ListValue* original_list = new ListValue(); diff --git a/chrome/browser/extensions/api/socket/socket_api.cc b/chrome/browser/extensions/api/socket/socket_api.cc index 122f2bc..98fa6f2 100644 --- a/chrome/browser/extensions/api/socket/socket_api.cc +++ b/chrome/browser/extensions/api/socket/socket_api.cc @@ -173,7 +173,9 @@ void SocketReadFunction::OnCompleted(int bytes_read, base::BinaryValue::CreateWithCopiedBuffer(io_buffer->data(), bytes_read)); } else { - result->Set(kDataKey, new base::BinaryValue()); + // BinaryValue does not support NULL buffer. Workaround it with new char[1]. + // http://crbug.com/127630 + result->Set(kDataKey, base::BinaryValue::Create(new char[1], 0)); } result_.reset(result); @@ -254,7 +256,9 @@ void SocketRecvFromFunction::OnCompleted(int bytes_read, base::BinaryValue::CreateWithCopiedBuffer(io_buffer->data(), bytes_read)); } else { - result->Set(kDataKey, new base::BinaryValue()); + // BinaryValue does not support NULL buffer. Workaround it with new char[1]. + // http://crbug.com/127630 + result->Set(kDataKey, base::BinaryValue::Create(new char[1], 0)); } result->SetString(kAddressKey, address); result->SetInteger(kPortKey, port); |