Reviewers: Dmitry Lomov (chromium),

Message:
Committed patchset #2 (id:80001) manually as 24973 (presubmit successful).

Description:
allow disabling of ArrayBuffer neutering

BUG=
[email protected]

Committed: https://code.google.com/p/v8/source/detail?r=24973

Please review this at https://codereview.chromium.org/684103002/

Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files (+49, -2 lines):
  M include/v8.h
  M src/api.cc
  M src/objects.h
  M src/objects.cc
  M src/objects-inl.h
  M src/runtime/runtime-typedarray.cc
  M test/cctest/test-api.cc


Index: include/v8.h
diff --git a/include/v8.h b/include/v8.h
index 92eb11bceca4c6d91db2c1c546d89a5262418a12..e783727c2db5ad7310136342d1aa9a55cb8f8dc1 100644
--- a/include/v8.h
+++ b/include/v8.h
@@ -2956,10 +2956,15 @@ class V8_EXPORT ArrayBuffer : public Object {
   bool IsExternal() const;

   /**
+   * Returns true if this ArrayBuffer may be neutered.
+   */
+  bool IsNeuterable() const;
+
+  /**
    * Neuters this ArrayBuffer and all its views (typed arrays).
* Neutering sets the byte length of the buffer and all typed arrays to zero,
    * preventing JavaScript from ever accessing underlying backing store.
-   * ArrayBuffer should have been externalized.
+   * ArrayBuffer should have been externalized and must be neuterable.
    */
   void Neuter();

Index: src/api.cc
diff --git a/src/api.cc b/src/api.cc
index c04393d8be1ec53c7b6fb0376447c4379e703ec4..6a7c40a06c96cc3246fde4c52f4cf94657e836da 100644
--- a/src/api.cc
+++ b/src/api.cc
@@ -6038,6 +6038,11 @@ bool v8::ArrayBuffer::IsExternal() const {
 }


+bool v8::ArrayBuffer::IsNeuterable() const {
+  return Utils::OpenHandle(this)->is_neuterable();
+}
+
+
 v8::ArrayBuffer::Contents v8::ArrayBuffer::Externalize() {
   i::Handle<i::JSArrayBuffer> obj = Utils::OpenHandle(this);
   Utils::ApiCheck(!obj->is_external(),
@@ -6058,6 +6063,8 @@ void v8::ArrayBuffer::Neuter() {
   Utils::ApiCheck(obj->is_external(),
                   "v8::ArrayBuffer::Neuter",
                   "Only externalized ArrayBuffers can be neutered");
+  Utils::ApiCheck(obj->is_neuterable(), "v8::ArrayBuffer::Neuter",
+                  "Only neuterable ArrayBuffers can be neutered");
   LOG_API(obj->GetIsolate(), "v8::ArrayBuffer::Neuter()");
   ENTER_V8(isolate);
   i::Runtime::NeuterArrayBuffer(obj);
Index: src/objects-inl.h
diff --git a/src/objects-inl.h b/src/objects-inl.h
index c00ecddb565afc5529e44a840c594e9dcf59dfa4..b0996afb82e328fab772a53aaa05f7f3eeb3ddd6 100644
--- a/src/objects-inl.h
+++ b/src/objects-inl.h
@@ -6300,6 +6300,16 @@ void JSArrayBuffer::set_should_be_freed(bool value) {
 }


+bool JSArrayBuffer::is_neuterable() {
+  return BooleanBit::get(flag(), kIsNeuterableBit);
+}
+
+
+void JSArrayBuffer::set_is_neuterable(bool value) {
+  set_flag(BooleanBit::set(flag(), kIsNeuterableBit, value));
+}
+
+
 ACCESSORS(JSArrayBuffer, weak_next, Object, kWeakNextOffset)
 ACCESSORS(JSArrayBuffer, weak_first_view, Object, kWeakFirstViewOffset)

Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index c0814a80cb0e184db7cc4e880a697b560bd85a11..ea07582481a4baff42ad7f8e9a24978991a3a2e9 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -16365,13 +16365,15 @@ void JSDate::SetCachedFields(int64_t local_time_ms, DateCache* date_cache) {


 void JSArrayBuffer::Neuter() {
-  DCHECK(is_external());
+  CHECK(is_neuterable());
+  CHECK(is_external());
   set_backing_store(NULL);
   set_byte_length(Smi::FromInt(0));
 }


 void JSArrayBufferView::NeuterView() {
+  CHECK(JSArrayBuffer::cast(buffer())->is_neuterable());
   set_byte_offset(Smi::FromInt(0));
   set_byte_length(Smi::FromInt(0));
 }
Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index f6c4d19e66e485354f85a2dba7f90cbc76249011..d513f979226806e4be9ae6f5c69b0c64996c1e1b 100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -9961,6 +9961,9 @@ class JSArrayBuffer: public JSObject {
   inline bool should_be_freed();
   inline void set_should_be_freed(bool value);

+  inline bool is_neuterable();
+  inline void set_is_neuterable(bool value);
+
   // [weak_next]: linked list of array buffers.
   DECL_ACCESSORS(weak_next, Object)

@@ -9990,6 +9993,7 @@ class JSArrayBuffer: public JSObject {
   // Bit position in a flag
   static const int kIsExternalBit = 0;
   static const int kShouldBeFreed = 1;
+  static const int kIsNeuterableBit = 2;

   DISALLOW_IMPLICIT_CONSTRUCTORS(JSArrayBuffer);
 };
Index: src/runtime/runtime-typedarray.cc
diff --git a/src/runtime/runtime-typedarray.cc b/src/runtime/runtime-typedarray.cc index d702ff99d63c1b3ee0741dae6e1eb9fb56b185a8..cd2c0eb9fa1a3b5ca90b85b0c949b7f383c92b25 100644
--- a/src/runtime/runtime-typedarray.cc
+++ b/src/runtime/runtime-typedarray.cc
@@ -44,6 +44,7 @@ void Runtime::SetupArrayBuffer(Isolate* isolate,
   array_buffer->set_backing_store(data);
   array_buffer->set_flag(Smi::FromInt(0));
   array_buffer->set_is_external(is_external);
+  array_buffer->set_is_neuterable(true);

   Handle<Object> byte_length =
       isolate->factory()->NewNumberFromSize(allocated_length);
Index: test/cctest/test-api.cc
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
index 717cfb340b21417ec0d296cb68829c1238d63ca0..11393f097ef71be37efbba73753ac9dc362ac6ab 100644
--- a/test/cctest/test-api.cc
+++ b/test/cctest/test-api.cc
@@ -3293,6 +3293,24 @@ THREADED_TEST(ArrayBuffer_External) {
 }


+THREADED_TEST(ArrayBuffer_DisableNeuter) {
+  LocalContext env;
+  v8::Isolate* isolate = env->GetIsolate();
+  v8::HandleScope handle_scope(isolate);
+
+  i::ScopedVector<uint8_t> my_data(100);
+  memset(my_data.start(), 0, 100);
+  Local<v8::ArrayBuffer> ab =
+      v8::ArrayBuffer::New(isolate, my_data.start(), 100);
+  CHECK(ab->IsNeuterable());
+
+  i::Handle<i::JSArrayBuffer> buf = v8::Utils::OpenHandle(*ab);
+  buf->set_is_neuterable(false);
+
+  CHECK(!ab->IsNeuterable());
+}
+
+
 static void CheckDataViewIsNeutered(v8::Handle<v8::DataView> dv) {
   CHECK_EQ(0, static_cast<int>(dv->ByteLength()));
   CHECK_EQ(0, static_cast<int>(dv->ByteOffset()));


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to