Index: src/runtime/runtime-typedarray.cc |
diff --git a/src/runtime/runtime-typedarray.cc b/src/runtime/runtime-typedarray.cc |
index 02b5579bf82715a362a40c87f55d43af6f42e726..bbc0a9629dad2d57cbc3c67d35f46854a72264cc 100644 |
--- a/src/runtime/runtime-typedarray.cc |
+++ b/src/runtime/runtime-typedarray.cc |
@@ -26,9 +26,15 @@ void Runtime::FreeArrayBuffer(Isolate* isolate, |
reinterpret_cast<v8::Isolate*>(isolate) |
->AdjustAmountOfExternalAllocatedMemory( |
-static_cast<int64_t>(allocated_length)); |
- CHECK(V8::ArrayBufferAllocator() != NULL); |
- V8::ArrayBufferAllocator()->Free(phantom_array_buffer->backing_store(), |
- allocated_length); |
+ if (phantom_array_buffer->is_shared()) { |
+ CHECK(V8::SharedArrayBufferAllocator() != NULL); |
+ V8::SharedArrayBufferAllocator()->Free( |
+ phantom_array_buffer->backing_store(), allocated_length); |
+ } else { |
+ CHECK(V8::ArrayBufferAllocator() != NULL); |
+ V8::ArrayBufferAllocator()->Free(phantom_array_buffer->backing_store(), |
+ allocated_length); |
+ } |
} |
@@ -70,16 +76,27 @@ bool Runtime::SetupArrayBufferAllocatingData(Isolate* isolate, |
Handle<JSArrayBuffer> array_buffer, |
size_t allocated_length, |
bool initialize) { |
+ bool is_shared = array_buffer->is_shared(); |
Jarin
2015/04/29 04:46:01
This should be array_buffer->is_shared() == SHARED
binji
2015/04/29 18:27:22
Done.
|
void* data; |
- CHECK(V8::ArrayBufferAllocator() != NULL); |
+ CHECK(is_shared ? V8::SharedArrayBufferAllocator() != NULL |
+ : V8::ArrayBufferAllocator() != NULL); |
// Prevent creating array buffers when serializing. |
DCHECK(!isolate->serializer_enabled()); |
if (allocated_length != 0) { |
- if (initialize) { |
- data = V8::ArrayBufferAllocator()->Allocate(allocated_length); |
+ if (is_shared) { |
+ if (initialize) { |
+ data = V8::SharedArrayBufferAllocator()->Allocate(allocated_length); |
+ } else { |
+ data = V8::SharedArrayBufferAllocator()->AllocateUninitialized( |
+ allocated_length); |
+ } |
} else { |
- data = |
- V8::ArrayBufferAllocator()->AllocateUninitialized(allocated_length); |
+ if (initialize) { |
+ data = V8::ArrayBufferAllocator()->Allocate(allocated_length); |
+ } else { |
+ data = |
+ V8::ArrayBufferAllocator()->AllocateUninitialized(allocated_length); |
+ } |
} |
if (data == NULL) return false; |
} else { |
@@ -133,6 +150,14 @@ RUNTIME_FUNCTION(Runtime_ArrayBufferGetByteLength) { |
} |
+RUNTIME_FUNCTION(Runtime_ArrayBufferIsShared) { |
+ SealHandleScope shs(isolate); |
+ DCHECK(args.length() == 1); |
+ CONVERT_ARG_CHECKED(JSArrayBuffer, holder, 0); |
+ return isolate->heap()->ToBoolean(holder->is_shared()); |
+} |
+ |
+ |
RUNTIME_FUNCTION(Runtime_ArrayBufferSliceImpl) { |
HandleScope scope(isolate); |
DCHECK(args.length() == 3); |
@@ -172,6 +197,8 @@ RUNTIME_FUNCTION(Runtime_ArrayBufferNeuter) { |
CHECK(Smi::FromInt(0) == array_buffer->byte_length()); |
return isolate->heap()->undefined_value(); |
} |
+ // Shared array buffers should never be neutered. |
+ DCHECK(!array_buffer->is_shared()); |
jochen (gone - plz use gerrit)
2015/04/28 18:31:46
why? What about ArrayBuffer.transfer?
Jarin
2015/04/29 04:46:01
The whole idea of SharedArrayBuffer is that it can
binji
2015/04/29 18:27:22
I asked about this on the spec doc, but I think it
|
DCHECK(!array_buffer->is_external()); |
void* backing_store = array_buffer->backing_store(); |
size_t byte_length = NumberToSize(isolate, array_buffer->byte_length()); |
@@ -442,6 +469,13 @@ RUNTIME_FUNCTION(Runtime_TypedArraySetFastCases) { |
Handle<JSTypedArray> target(JSTypedArray::cast(*target_obj)); |
Handle<JSTypedArray> source(JSTypedArray::cast(*source_obj)); |
+ |
+ if (target->is_shared() != source->is_shared()) { |
+ THROW_NEW_ERROR_RETURN_FAILURE( |
+ isolate, |
+ NewTypeError("invalid_argument", HandleVector<Object>(NULL, 0))); |
+ } |
+ |
size_t offset = 0; |
RUNTIME_ASSERT(TryNumberToSize(isolate, *offset_obj, &offset)); |
size_t target_length = NumberToSize(isolate, target->length()); |