OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 // | 4 // |
5 // Review notes: | 5 // Review notes: |
6 // | 6 // |
7 // - The use of macros in these inline functions may seem superfluous | 7 // - The use of macros in these inline functions may seem superfluous |
8 // but it is absolutely needed to make sure gcc generates optimal | 8 // but it is absolutely needed to make sure gcc generates optimal |
9 // code. gcc is not happy when attempting to inline too deep. | 9 // code. gcc is not happy when attempting to inline too deep. |
10 // | 10 // |
(...skipping 4357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4368 template <class Traits> | 4368 template <class Traits> |
4369 Handle<Object> FixedTypedArray<Traits>::get( | 4369 Handle<Object> FixedTypedArray<Traits>::get( |
4370 Handle<FixedTypedArray<Traits> > array, | 4370 Handle<FixedTypedArray<Traits> > array, |
4371 int index) { | 4371 int index) { |
4372 return Traits::ToHandle(array->GetIsolate(), array->get_scalar(index)); | 4372 return Traits::ToHandle(array->GetIsolate(), array->get_scalar(index)); |
4373 } | 4373 } |
4374 | 4374 |
4375 | 4375 |
4376 template <class Traits> | 4376 template <class Traits> |
4377 Handle<Object> FixedTypedArray<Traits>::SetValue( | 4377 Handle<Object> FixedTypedArray<Traits>::SetValue( |
4378 Handle<FixedTypedArray<Traits> > array, | 4378 Handle<JSObject> holder, Handle<FixedTypedArray<Traits> > array, |
4379 uint32_t index, | 4379 uint32_t index, Handle<Object> value) { |
4380 Handle<Object> value) { | |
4381 ElementType cast_value = Traits::defaultValue(); | 4380 ElementType cast_value = Traits::defaultValue(); |
4382 if (index < static_cast<uint32_t>(array->length())) { | 4381 Handle<JSArrayBufferView> view = Handle<JSArrayBufferView>::cast(holder); |
4383 if (value->IsSmi()) { | 4382 if (view->buffer()->IsSmi() || |
4384 int int_value = Handle<Smi>::cast(value)->value(); | 4383 !JSArrayBuffer::cast(view->buffer())->was_neutered()) { |
Toon Verwaest
2015/04/17 13:25:55
What about a nicer method to avoid duplicating thi
| |
4385 cast_value = from_int(int_value); | 4384 if (index < static_cast<uint32_t>(array->length())) { |
4386 } else if (value->IsHeapNumber()) { | 4385 if (value->IsSmi()) { |
4387 double double_value = Handle<HeapNumber>::cast(value)->value(); | 4386 int int_value = Handle<Smi>::cast(value)->value(); |
4388 cast_value = from_double(double_value); | 4387 cast_value = from_int(int_value); |
4389 } else { | 4388 } else if (value->IsHeapNumber()) { |
4390 // Clamp undefined to the default value. All other types have been | 4389 double double_value = Handle<HeapNumber>::cast(value)->value(); |
4391 // converted to a number type further up in the call chain. | 4390 cast_value = from_double(double_value); |
4392 DCHECK(value->IsUndefined()); | 4391 } else { |
4392 // Clamp undefined to the default value. All other types have been | |
4393 // converted to a number type further up in the call chain. | |
4394 DCHECK(value->IsUndefined()); | |
4395 } | |
4396 array->set(index, cast_value); | |
4393 } | 4397 } |
4394 array->set(index, cast_value); | |
4395 } | 4398 } |
4396 return Traits::ToHandle(array->GetIsolate(), cast_value); | 4399 return Traits::ToHandle(array->GetIsolate(), cast_value); |
4397 } | 4400 } |
4398 | 4401 |
4399 | 4402 |
4400 Handle<Object> Uint8ArrayTraits::ToHandle(Isolate* isolate, uint8_t scalar) { | 4403 Handle<Object> Uint8ArrayTraits::ToHandle(Isolate* isolate, uint8_t scalar) { |
4401 return handle(Smi::FromInt(scalar), isolate); | 4404 return handle(Smi::FromInt(scalar), isolate); |
4402 } | 4405 } |
4403 | 4406 |
4404 | 4407 |
(...skipping 2041 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6446 bool JSArrayBuffer::is_neuterable() { | 6449 bool JSArrayBuffer::is_neuterable() { |
6447 return BooleanBit::get(flag(), kIsNeuterableBit); | 6450 return BooleanBit::get(flag(), kIsNeuterableBit); |
6448 } | 6451 } |
6449 | 6452 |
6450 | 6453 |
6451 void JSArrayBuffer::set_is_neuterable(bool value) { | 6454 void JSArrayBuffer::set_is_neuterable(bool value) { |
6452 set_flag(BooleanBit::set(flag(), kIsNeuterableBit, value)); | 6455 set_flag(BooleanBit::set(flag(), kIsNeuterableBit, value)); |
6453 } | 6456 } |
6454 | 6457 |
6455 | 6458 |
6459 bool JSArrayBuffer::was_neutered() { | |
6460 return BooleanBit::get(flag(), kWasNeuteredBit); | |
6461 } | |
6462 | |
6463 | |
6464 void JSArrayBuffer::set_was_neutered(bool value) { | |
6465 set_flag(BooleanBit::set(flag(), kWasNeuteredBit, value)); | |
6466 } | |
6467 | |
6468 | |
6456 ACCESSORS(JSArrayBuffer, weak_next, Object, kWeakNextOffset) | 6469 ACCESSORS(JSArrayBuffer, weak_next, Object, kWeakNextOffset) |
6457 ACCESSORS(JSArrayBuffer, weak_first_view, Object, kWeakFirstViewOffset) | 6470 |
6471 | |
6472 Object* JSArrayBufferView::byte_offset() const { | |
6473 if (!buffer()->IsSmi() && JSArrayBuffer::cast(buffer())->was_neutered()) { | |
6474 return Smi::FromInt(0); | |
6475 } | |
6476 return Object::cast(READ_FIELD(this, kByteOffsetOffset)); | |
6477 } | |
6478 | |
6479 | |
6480 void JSArrayBufferView::set_byte_offset(Object* value, WriteBarrierMode mode) { | |
6481 WRITE_FIELD(this, kByteOffsetOffset, value); | |
6482 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kByteOffsetOffset, value, mode); | |
6483 } | |
6484 | |
6485 | |
6486 Object* JSArrayBufferView::byte_length() const { | |
6487 if (!buffer()->IsSmi() && JSArrayBuffer::cast(buffer())->was_neutered()) { | |
6488 return Smi::FromInt(0); | |
6489 } | |
6490 return Object::cast(READ_FIELD(this, kByteLengthOffset)); | |
6491 } | |
6492 | |
6493 | |
6494 void JSArrayBufferView::set_byte_length(Object* value, WriteBarrierMode mode) { | |
6495 WRITE_FIELD(this, kByteLengthOffset, value); | |
6496 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kByteLengthOffset, value, mode); | |
6497 } | |
6458 | 6498 |
6459 | 6499 |
6460 ACCESSORS(JSArrayBufferView, buffer, Object, kBufferOffset) | 6500 ACCESSORS(JSArrayBufferView, buffer, Object, kBufferOffset) |
6461 ACCESSORS(JSArrayBufferView, byte_offset, Object, kByteOffsetOffset) | 6501 |
6462 ACCESSORS(JSArrayBufferView, byte_length, Object, kByteLengthOffset) | 6502 |
6463 ACCESSORS(JSArrayBufferView, weak_next, Object, kWeakNextOffset) | 6503 Object* JSTypedArray::length() const { |
6464 ACCESSORS(JSTypedArray, length, Object, kLengthOffset) | 6504 if (!buffer()->IsSmi() && JSArrayBuffer::cast(buffer())->was_neutered()) { |
6505 return Smi::FromInt(0); | |
6506 } | |
6507 return Object::cast(READ_FIELD(this, kLengthOffset)); | |
6508 } | |
6509 | |
6510 | |
6511 void JSTypedArray::set_length(Object* value, WriteBarrierMode mode) { | |
6512 WRITE_FIELD(this, kLengthOffset, value); | |
6513 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kLengthOffset, value, mode); | |
6514 } | |
6515 | |
6465 | 6516 |
6466 ACCESSORS(JSRegExp, data, Object, kDataOffset) | 6517 ACCESSORS(JSRegExp, data, Object, kDataOffset) |
6467 | 6518 |
6468 | 6519 |
6469 JSRegExp::Type JSRegExp::TypeTag() { | 6520 JSRegExp::Type JSRegExp::TypeTag() { |
6470 Object* data = this->data(); | 6521 Object* data = this->data(); |
6471 if (data->IsUndefined()) return JSRegExp::NOT_COMPILED; | 6522 if (data->IsUndefined()) return JSRegExp::NOT_COMPILED; |
6472 Smi* smi = Smi::cast(FixedArray::cast(data)->get(kTagIndex)); | 6523 Smi* smi = Smi::cast(FixedArray::cast(data)->get(kTagIndex)); |
6473 return static_cast<JSRegExp::Type>(smi->value()); | 6524 return static_cast<JSRegExp::Type>(smi->value()); |
6474 } | 6525 } |
(...skipping 1067 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7542 #undef READ_SHORT_FIELD | 7593 #undef READ_SHORT_FIELD |
7543 #undef WRITE_SHORT_FIELD | 7594 #undef WRITE_SHORT_FIELD |
7544 #undef READ_BYTE_FIELD | 7595 #undef READ_BYTE_FIELD |
7545 #undef WRITE_BYTE_FIELD | 7596 #undef WRITE_BYTE_FIELD |
7546 #undef NOBARRIER_READ_BYTE_FIELD | 7597 #undef NOBARRIER_READ_BYTE_FIELD |
7547 #undef NOBARRIER_WRITE_BYTE_FIELD | 7598 #undef NOBARRIER_WRITE_BYTE_FIELD |
7548 | 7599 |
7549 } } // namespace v8::internal | 7600 } } // namespace v8::internal |
7550 | 7601 |
7551 #endif // V8_OBJECTS_INL_H_ | 7602 #endif // V8_OBJECTS_INL_H_ |
OLD | NEW |