Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index 60a8fc6651eae7169cb475cbff66770811633008..2cbaad10fc8566914961340cbb9a9889c47cede1 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -712,18 +712,13 @@ void Runtime::SetupArrayBuffer(Isolate* isolate, |
bool Runtime::SetupArrayBufferAllocatingData( |
Isolate* isolate, |
Handle<JSArrayBuffer> array_buffer, |
- size_t allocated_length, |
- bool initialize) { |
+ size_t allocated_length) { |
void* data; |
CHECK(V8::ArrayBufferAllocator() != NULL); |
if (allocated_length != 0) { |
- if (initialize) { |
- data = V8::ArrayBufferAllocator()->Allocate(allocated_length); |
- } else { |
- data = |
- V8::ArrayBufferAllocator()->AllocateUninitialized(allocated_length); |
- } |
+ data = V8::ArrayBufferAllocator()->Allocate(allocated_length); |
if (data == NULL) return false; |
+ memset(data, 0, allocated_length); |
} else { |
data = NULL; |
} |
@@ -810,69 +805,65 @@ enum TypedArrayId { |
ARRAY_ID_UINT8C = 9 |
}; |
-static void ArrayIdToTypeAndSize( |
- int arrayId, ExternalArrayType* array_type, size_t* element_size) { |
+ |
+RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitialize) { |
+ HandleScope scope(isolate); |
+ ASSERT(args.length() == 5); |
+ CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0); |
+ CONVERT_SMI_ARG_CHECKED(arrayId, 1); |
+ CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, buffer, 2); |
+ CONVERT_ARG_HANDLE_CHECKED(Object, byte_offset_object, 3); |
+ CONVERT_ARG_HANDLE_CHECKED(Object, byte_length_object, 4); |
+ |
+ ASSERT(holder->GetInternalFieldCount() == |
+ v8::ArrayBufferView::kInternalFieldCount); |
+ for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) { |
+ holder->SetInternalField(i, Smi::FromInt(0)); |
+ } |
+ |
+ ExternalArrayType arrayType; |
+ size_t elementSize; |
switch (arrayId) { |
case ARRAY_ID_UINT8: |
- *array_type = kExternalUnsignedByteArray; |
- *element_size = 1; |
+ arrayType = kExternalUnsignedByteArray; |
+ elementSize = 1; |
break; |
case ARRAY_ID_INT8: |
- *array_type = kExternalByteArray; |
- *element_size = 1; |
+ arrayType = kExternalByteArray; |
+ elementSize = 1; |
break; |
case ARRAY_ID_UINT16: |
- *array_type = kExternalUnsignedShortArray; |
- *element_size = 2; |
+ arrayType = kExternalUnsignedShortArray; |
+ elementSize = 2; |
break; |
case ARRAY_ID_INT16: |
- *array_type = kExternalShortArray; |
- *element_size = 2; |
+ arrayType = kExternalShortArray; |
+ elementSize = 2; |
break; |
case ARRAY_ID_UINT32: |
- *array_type = kExternalUnsignedIntArray; |
- *element_size = 4; |
+ arrayType = kExternalUnsignedIntArray; |
+ elementSize = 4; |
break; |
case ARRAY_ID_INT32: |
- *array_type = kExternalIntArray; |
- *element_size = 4; |
+ arrayType = kExternalIntArray; |
+ elementSize = 4; |
break; |
case ARRAY_ID_FLOAT32: |
- *array_type = kExternalFloatArray; |
- *element_size = 4; |
+ arrayType = kExternalFloatArray; |
+ elementSize = 4; |
break; |
case ARRAY_ID_FLOAT64: |
- *array_type = kExternalDoubleArray; |
- *element_size = 8; |
+ arrayType = kExternalDoubleArray; |
+ elementSize = 8; |
break; |
case ARRAY_ID_UINT8C: |
- *array_type = kExternalPixelArray; |
- *element_size = 1; |
+ arrayType = kExternalPixelArray; |
+ elementSize = 1; |
break; |
default: |
UNREACHABLE(); |
+ return NULL; |
} |
-} |
- |
- |
-RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitialize) { |
- HandleScope scope(isolate); |
- ASSERT(args.length() == 5); |
- CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0); |
- CONVERT_SMI_ARG_CHECKED(arrayId, 1); |
- CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, buffer, 2); |
- CONVERT_ARG_HANDLE_CHECKED(Object, byte_offset_object, 3); |
- CONVERT_ARG_HANDLE_CHECKED(Object, byte_length_object, 4); |
- |
- ASSERT(holder->GetInternalFieldCount() == |
- v8::ArrayBufferView::kInternalFieldCount); |
- for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) { |
- holder->SetInternalField(i, Smi::FromInt(0)); |
- } |
- |
- ExternalArrayType array_type; |
- size_t element_size; |
- ArrayIdToTypeAndSize(arrayId, &array_type, &element_size); |
holder->set_buffer(*buffer); |
holder->set_byte_offset(*byte_offset_object); |
@@ -880,8 +871,8 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitialize) { |
size_t byte_offset = NumberToSize(isolate, *byte_offset_object); |
size_t byte_length = NumberToSize(isolate, *byte_length_object); |
- ASSERT(byte_length % element_size == 0); |
- size_t length = byte_length / element_size; |
+ ASSERT(byte_length % elementSize == 0); |
+ size_t length = byte_length / elementSize; |
Handle<Object> length_obj = isolate->factory()->NewNumberFromSize(length); |
holder->set_length(*length_obj); |
@@ -890,99 +881,13 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitialize) { |
Handle<ExternalArray> elements = |
isolate->factory()->NewExternalArray( |
- static_cast<int>(length), array_type, |
+ static_cast<int>(length), arrayType, |
static_cast<uint8_t*>(buffer->backing_store()) + byte_offset); |
holder->set_elements(*elements); |
return isolate->heap()->undefined_value(); |
} |
-// Initializes a typed array from an array-like object. |
-// If an array-like object happens to be a typed array of the same type, |
-// initializes backing store using memove. |
-// |
-// Returns true if backing store was initialized or false otherwise. |
-RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitializeFromArrayLike) { |
- HandleScope scope(isolate); |
- ASSERT(args.length() == 4); |
- CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0); |
- CONVERT_SMI_ARG_CHECKED(arrayId, 1); |
- CONVERT_ARG_HANDLE_CHECKED(Object, source, 2); |
- CONVERT_ARG_HANDLE_CHECKED(Object, length_obj, 3); |
- |
- ASSERT(holder->GetInternalFieldCount() == |
- v8::ArrayBufferView::kInternalFieldCount); |
- for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) { |
- holder->SetInternalField(i, Smi::FromInt(0)); |
- } |
- |
- ExternalArrayType array_type; |
- size_t element_size; |
- ArrayIdToTypeAndSize(arrayId, &array_type, &element_size); |
- |
- Handle<JSArrayBuffer> buffer = isolate->factory()->NewJSArrayBuffer(); |
- size_t length = NumberToSize(isolate, *length_obj); |
- size_t byte_length = length * element_size; |
- if (byte_length < length) { // Overflow |
- return isolate->Throw(*isolate->factory()-> |
- NewRangeError("invalid_array_buffer_length", |
- HandleVector<Object>(NULL, 0))); |
- } |
- |
- // We assume that the caller of this function will initialize holder |
- // with the loop |
- // for(i = 0; i < length; i++) { holder[i] = source[i]; } |
- // If source is a typed array, this loop will always run to completion, |
- // so we are sure that the backing store will be initialized. |
- // Otherwise, we do not know (the indexing operation might throw). |
- // Hence we require zero initialization unless our source is a typed array. |
- bool should_zero_initialize = !source->IsJSTypedArray(); |
- |
- if (!Runtime::SetupArrayBufferAllocatingData( |
- isolate, buffer, byte_length, should_zero_initialize)) { |
- return isolate->Throw(*isolate->factory()-> |
- NewRangeError("invalid_array_buffer_length", |
- HandleVector<Object>(NULL, 0))); |
- } |
- |
- holder->set_buffer(*buffer); |
- holder->set_byte_offset(Smi::FromInt(0)); |
- Handle<Object> byte_length_obj( |
- isolate->factory()->NewNumberFromSize(byte_length)); |
- holder->set_byte_length(*byte_length_obj); |
- holder->set_length(*length_obj); |
- holder->set_weak_next(buffer->weak_first_view()); |
- buffer->set_weak_first_view(*holder); |
- |
- Handle<ExternalArray> elements = |
- isolate->factory()->NewExternalArray( |
- static_cast<int>(length), array_type, |
- static_cast<uint8_t*>(buffer->backing_store())); |
- holder->set_elements(*elements); |
- |
- if (source->IsJSTypedArray()) { |
- Handle<JSTypedArray> typed_array(JSTypedArray::cast(*source)); |
- |
- if (typed_array->type() == holder->type()) { |
- uint8_t* backing_store = |
- static_cast<uint8_t*>( |
- JSArrayBuffer::cast(typed_array->buffer())->backing_store()); |
- size_t source_byte_offset = |
- NumberToSize(isolate, typed_array->byte_offset()); |
- OS::MemCopy( |
- buffer->backing_store(), |
- backing_store + source_byte_offset, |
- byte_length); |
- return *isolate->factory()->true_value(); |
- } else { |
- return *isolate->factory()->false_value(); |
- } |
- } |
- |
- return *isolate->factory()->false_value(); |
-} |
- |
- |
#define TYPED_ARRAY_GETTER(getter, accessor) \ |
RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayGet##getter) { \ |
HandleScope scope(isolate); \ |