summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-20 02:34:57 +0000
committerjhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-20 02:34:57 +0000
commit0d0ed0c73c9710e8ab6ff80dd3750b70f0f751bf (patch)
treea9f66bd0f7c2df003a6f9066eee37dee067ce5dd
parent0a7be8d8aed47cc460e1e848092377c2c426b89c (diff)
downloadchromium_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.cc36
-rw-r--r--base/values.h26
-rw-r--r--base/values_unittest.cc30
-rw-r--r--chrome/browser/extensions/api/socket/socket_api.cc8
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);