Chromium Code Reviews| 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) |