Index: src/objects-inl.h |
diff --git a/src/objects-inl.h b/src/objects-inl.h |
index f284f65d34efaa93b7efaedaf5d1c7d93cc84c9e..a582313ab59d100010de9d0ca265c1562c175e1b 100644 |
--- a/src/objects-inl.h |
+++ b/src/objects-inl.h |
@@ -4375,23 +4375,26 @@ Handle<Object> FixedTypedArray<Traits>::get( |
template <class Traits> |
Handle<Object> FixedTypedArray<Traits>::SetValue( |
- Handle<FixedTypedArray<Traits> > array, |
- uint32_t index, |
- Handle<Object> value) { |
+ Handle<JSObject> holder, Handle<FixedTypedArray<Traits> > array, |
+ uint32_t index, Handle<Object> value) { |
ElementType cast_value = Traits::defaultValue(); |
- if (index < static_cast<uint32_t>(array->length())) { |
- if (value->IsSmi()) { |
- int int_value = Handle<Smi>::cast(value)->value(); |
- cast_value = from_int(int_value); |
- } else if (value->IsHeapNumber()) { |
- double double_value = Handle<HeapNumber>::cast(value)->value(); |
- cast_value = from_double(double_value); |
- } else { |
- // Clamp undefined to the default value. All other types have been |
- // converted to a number type further up in the call chain. |
- DCHECK(value->IsUndefined()); |
+ Handle<JSArrayBufferView> view = Handle<JSArrayBufferView>::cast(holder); |
+ if (view->buffer()->IsSmi() || |
+ !JSArrayBuffer::cast(view->buffer())->was_neutered()) { |
Toon Verwaest
2015/04/17 13:25:55
What about a nicer method to avoid duplicating thi
|
+ if (index < static_cast<uint32_t>(array->length())) { |
+ if (value->IsSmi()) { |
+ int int_value = Handle<Smi>::cast(value)->value(); |
+ cast_value = from_int(int_value); |
+ } else if (value->IsHeapNumber()) { |
+ double double_value = Handle<HeapNumber>::cast(value)->value(); |
+ cast_value = from_double(double_value); |
+ } else { |
+ // Clamp undefined to the default value. All other types have been |
+ // converted to a number type further up in the call chain. |
+ DCHECK(value->IsUndefined()); |
+ } |
+ array->set(index, cast_value); |
} |
- array->set(index, cast_value); |
} |
return Traits::ToHandle(array->GetIsolate(), cast_value); |
} |
@@ -6453,15 +6456,63 @@ void JSArrayBuffer::set_is_neuterable(bool value) { |
} |
+bool JSArrayBuffer::was_neutered() { |
+ return BooleanBit::get(flag(), kWasNeuteredBit); |
+} |
+ |
+ |
+void JSArrayBuffer::set_was_neutered(bool value) { |
+ set_flag(BooleanBit::set(flag(), kWasNeuteredBit, value)); |
+} |
+ |
+ |
ACCESSORS(JSArrayBuffer, weak_next, Object, kWeakNextOffset) |
-ACCESSORS(JSArrayBuffer, weak_first_view, Object, kWeakFirstViewOffset) |
+ |
+ |
+Object* JSArrayBufferView::byte_offset() const { |
+ if (!buffer()->IsSmi() && JSArrayBuffer::cast(buffer())->was_neutered()) { |
+ return Smi::FromInt(0); |
+ } |
+ return Object::cast(READ_FIELD(this, kByteOffsetOffset)); |
+} |
+ |
+ |
+void JSArrayBufferView::set_byte_offset(Object* value, WriteBarrierMode mode) { |
+ WRITE_FIELD(this, kByteOffsetOffset, value); |
+ CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kByteOffsetOffset, value, mode); |
+} |
+ |
+ |
+Object* JSArrayBufferView::byte_length() const { |
+ if (!buffer()->IsSmi() && JSArrayBuffer::cast(buffer())->was_neutered()) { |
+ return Smi::FromInt(0); |
+ } |
+ return Object::cast(READ_FIELD(this, kByteLengthOffset)); |
+} |
+ |
+ |
+void JSArrayBufferView::set_byte_length(Object* value, WriteBarrierMode mode) { |
+ WRITE_FIELD(this, kByteLengthOffset, value); |
+ CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kByteLengthOffset, value, mode); |
+} |
ACCESSORS(JSArrayBufferView, buffer, Object, kBufferOffset) |
-ACCESSORS(JSArrayBufferView, byte_offset, Object, kByteOffsetOffset) |
-ACCESSORS(JSArrayBufferView, byte_length, Object, kByteLengthOffset) |
-ACCESSORS(JSArrayBufferView, weak_next, Object, kWeakNextOffset) |
-ACCESSORS(JSTypedArray, length, Object, kLengthOffset) |
+ |
+ |
+Object* JSTypedArray::length() const { |
+ if (!buffer()->IsSmi() && JSArrayBuffer::cast(buffer())->was_neutered()) { |
+ return Smi::FromInt(0); |
+ } |
+ return Object::cast(READ_FIELD(this, kLengthOffset)); |
+} |
+ |
+ |
+void JSTypedArray::set_length(Object* value, WriteBarrierMode mode) { |
+ WRITE_FIELD(this, kLengthOffset, value); |
+ CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kLengthOffset, value, mode); |
+} |
+ |
ACCESSORS(JSRegExp, data, Object, kDataOffset) |