Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index c3610fbe3ffb6df22c959dd2384d79759cc3011c..9c201c38d7c46a170ccc2327238f67f2c90df0af 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -960,13 +960,6 @@ RUNTIME_FUNCTION(Runtime_TypedArrayInitialize) { |
RUNTIME_ASSERT(arrayId >= Runtime::ARRAY_ID_FIRST && |
arrayId <= Runtime::ARRAY_ID_LAST); |
- RUNTIME_ASSERT(maybe_buffer->IsNull() || maybe_buffer->IsJSArrayBuffer()); |
- |
- ASSERT(holder->GetInternalFieldCount() == |
- v8::ArrayBufferView::kInternalFieldCount); |
- for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) { |
- holder->SetInternalField(i, Smi::FromInt(0)); |
- } |
ExternalArrayType array_type = kExternalInt8Array; // Bogus initialization. |
size_t element_size = 1; // Bogus initialization. |
@@ -978,7 +971,6 @@ RUNTIME_FUNCTION(Runtime_TypedArrayInitialize) { |
&external_elements_kind, |
&fixed_elements_kind, |
&element_size); |
- |
RUNTIME_ASSERT(holder->map()->elements_kind() == fixed_elements_kind); |
size_t byte_offset = 0; |
@@ -986,8 +978,15 @@ RUNTIME_FUNCTION(Runtime_TypedArrayInitialize) { |
RUNTIME_ASSERT(TryNumberToSize(isolate, *byte_offset_object, &byte_offset)); |
RUNTIME_ASSERT(TryNumberToSize(isolate, *byte_length_object, &byte_length)); |
- holder->set_byte_offset(*byte_offset_object); |
- holder->set_byte_length(*byte_length_object); |
+ if (maybe_buffer->IsJSArrayBuffer()) { |
+ Handle<JSArrayBuffer> buffer = Handle<JSArrayBuffer>::cast(maybe_buffer); |
+ size_t array_buffer_byte_length = |
+ NumberToSize(isolate, buffer->byte_length()); |
+ RUNTIME_ASSERT(byte_offset <= array_buffer_byte_length); |
+ RUNTIME_ASSERT(array_buffer_byte_length - byte_offset >= byte_length); |
+ } else { |
+ RUNTIME_ASSERT(maybe_buffer->IsNull()); |
+ } |
RUNTIME_ASSERT(byte_length % element_size == 0); |
size_t length = byte_length / element_size; |
@@ -998,16 +997,20 @@ RUNTIME_FUNCTION(Runtime_TypedArrayInitialize) { |
HandleVector<Object>(NULL, 0))); |
} |
+ // All checks are done, now we can modify objects. |
+ |
+ ASSERT(holder->GetInternalFieldCount() == |
+ v8::ArrayBufferView::kInternalFieldCount); |
+ for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) { |
+ holder->SetInternalField(i, Smi::FromInt(0)); |
+ } |
Handle<Object> length_obj = isolate->factory()->NewNumberFromSize(length); |
holder->set_length(*length_obj); |
- if (!maybe_buffer->IsNull()) { |
- Handle<JSArrayBuffer> buffer(JSArrayBuffer::cast(*maybe_buffer)); |
- |
- size_t array_buffer_byte_length = |
- NumberToSize(isolate, buffer->byte_length()); |
- RUNTIME_ASSERT(byte_offset <= array_buffer_byte_length); |
- RUNTIME_ASSERT(array_buffer_byte_length - byte_offset >= byte_length); |
+ holder->set_byte_offset(*byte_offset_object); |
+ holder->set_byte_length(*byte_length_object); |
+ if (!maybe_buffer->IsNull()) { |
+ Handle<JSArrayBuffer> buffer = Handle<JSArrayBuffer>::cast(maybe_buffer); |
holder->set_buffer(*buffer); |
holder->set_weak_next(buffer->weak_first_view()); |
buffer->set_weak_first_view(*holder); |
@@ -1048,12 +1051,6 @@ RUNTIME_FUNCTION(Runtime_TypedArrayInitializeFromArrayLike) { |
RUNTIME_ASSERT(arrayId >= Runtime::ARRAY_ID_FIRST && |
arrayId <= Runtime::ARRAY_ID_LAST); |
- ASSERT(holder->GetInternalFieldCount() == |
- v8::ArrayBufferView::kInternalFieldCount); |
- for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) { |
- holder->SetInternalField(i, Smi::FromInt(0)); |
- } |
- |
ExternalArrayType array_type = kExternalInt8Array; // Bogus initialization. |
size_t element_size = 1; // Bogus initialization. |
ElementsKind external_elements_kind = |
@@ -1083,6 +1080,12 @@ RUNTIME_FUNCTION(Runtime_TypedArrayInitializeFromArrayLike) { |
} |
size_t byte_length = length * element_size; |
+ ASSERT(holder->GetInternalFieldCount() == |
+ v8::ArrayBufferView::kInternalFieldCount); |
+ for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) { |
+ holder->SetInternalField(i, Smi::FromInt(0)); |
+ } |
+ |
// NOTE: not initializing backing store. |
// We assume that the caller of this function will initialize holder |
// with the loop |