Index: src/objects-inl.h |
diff --git a/src/objects-inl.h b/src/objects-inl.h |
index c358ee6584525e4415aacce8615efd687acda79e..cad7b6389c7c4160b720f3ed5718b075c2102a7e 100644 |
--- a/src/objects-inl.h |
+++ b/src/objects-inl.h |
@@ -1736,6 +1736,11 @@ void JSObject::initialize_elements() { |
ExternalArray* empty_array = GetHeap()->EmptyExternalArrayForMap(map()); |
ASSERT(!GetHeap()->InNewSpace(empty_array)); |
WRITE_FIELD(this, kElementsOffset, empty_array); |
+ } else if (map()->has_fixed_typed_array_elements()) { |
+ FixedTypedArrayBase* empty_array = |
+ GetHeap()->EmptyFixedTypedArrayForMap(map()); |
+ ASSERT(!GetHeap()->InNewSpace(empty_array)); |
+ WRITE_FIELD(this, kElementsOffset, empty_array); |
} else { |
UNREACHABLE(); |
} |
@@ -3676,35 +3681,64 @@ void ExternalFloat64Array::set(int index, double value) { |
} |
-int FixedTypedArrayBase::size() { |
+void* FixedTypedArrayBase::DataPtr() { |
+ return FIELD_ADDR(this, kDataOffset); |
+} |
+ |
+ |
+int FixedTypedArrayBase::DataSize() { |
InstanceType instance_type = map()->instance_type(); |
int element_size; |
switch (instance_type) { |
- case FIXED_UINT8_ARRAY_TYPE: |
- case FIXED_INT8_ARRAY_TYPE: |
- case FIXED_UINT8_CLAMPED_ARRAY_TYPE: |
- element_size = 1; |
- break; |
- case FIXED_UINT16_ARRAY_TYPE: |
- case FIXED_INT16_ARRAY_TYPE: |
- element_size = 2; |
- break; |
- case FIXED_UINT32_ARRAY_TYPE: |
- case FIXED_INT32_ARRAY_TYPE: |
- case FIXED_FLOAT32_ARRAY_TYPE: |
- element_size = 4; |
- break; |
- case FIXED_FLOAT64_ARRAY_TYPE: |
- element_size = 8; |
+#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ |
+ case FIXED_##TYPE##_ARRAY_TYPE: \ |
+ element_size = size; \ |
break; |
+ |
+ TYPED_ARRAYS(TYPED_ARRAY_CASE) |
+#undef TYPED_ARRAY_CASE |
default: |
UNREACHABLE(); |
return 0; |
} |
- return OBJECT_POINTER_ALIGN(kDataOffset + length() * element_size); |
+ return length() * element_size; |
+} |
+ |
+ |
+int FixedTypedArrayBase::size() { |
+ return OBJECT_POINTER_ALIGN(kDataOffset + DataSize()); |
+} |
+ |
+ |
+uint8_t Uint8ArrayTraits::defaultValue() { return 0; } |
+ |
+ |
+uint8_t Uint8ClampedArrayTraits::defaultValue() { return 0; } |
+ |
+ |
+int8_t Int8ArrayTraits::defaultValue() { return 0; } |
+ |
+ |
+uint16_t Uint16ArrayTraits::defaultValue() { return 0; } |
+ |
+ |
+int16_t Int16ArrayTraits::defaultValue() { return 0; } |
+ |
+ |
+uint32_t Uint32ArrayTraits::defaultValue() { return 0; } |
+ |
+ |
+int32_t Int32ArrayTraits::defaultValue() { return 0; } |
+ |
+ |
+float Float32ArrayTraits::defaultValue() { |
+ return static_cast<float>(OS::nan_value()); |
} |
+double Float64ArrayTraits::defaultValue() { return OS::nan_value(); } |
+ |
+ |
template <class Traits> |
typename Traits::ElementType FixedTypedArray<Traits>::get_scalar(int index) { |
ASSERT((index >= 0) && (index < this->length())); |
@@ -3740,6 +3774,47 @@ void FixedTypedArray<Float64ArrayTraits>::set( |
template <class Traits> |
+typename Traits::ElementType FixedTypedArray<Traits>::from_int(int value) { |
+ return static_cast<ElementType>(value); |
+} |
+ |
+ |
+template <> inline |
+uint8_t FixedTypedArray<Uint8ClampedArrayTraits>::from_int(int value) { |
+ if (value < 0) return 0; |
+ if (value > 0xFF) return 0xFF; |
+ return static_cast<uint8_t>(value); |
+} |
+ |
+ |
+template <class Traits> |
+typename Traits::ElementType FixedTypedArray<Traits>::from_double( |
+ double value) { |
+ return static_cast<ElementType>(DoubleToInt32(value)); |
+} |
+ |
+ |
+template<> inline |
+uint8_t FixedTypedArray<Uint8ClampedArrayTraits>::from_double(double value) { |
+ if (value < 0) return 0; |
+ if (value > 0xFF) return 0xFF; |
+ return static_cast<uint8_t>(lrint(value)); |
+} |
+ |
+ |
+template<> inline |
+float FixedTypedArray<Float32ArrayTraits>::from_double(double value) { |
+ return static_cast<float>(value); |
+} |
+ |
+ |
+template<> inline |
+double FixedTypedArray<Float64ArrayTraits>::from_double(double value) { |
+ return value; |
+} |
+ |
+ |
+template <class Traits> |
MaybeObject* FixedTypedArray<Traits>::get(int index) { |
return Traits::ToObject(GetHeap(), get_scalar(index)); |
} |
@@ -3750,10 +3825,10 @@ MaybeObject* FixedTypedArray<Traits>::SetValue(uint32_t index, Object* value) { |
if (index < static_cast<uint32_t>(length())) { |
if (value->IsSmi()) { |
int int_value = Smi::cast(value)->value(); |
- cast_value = static_cast<ElementType>(int_value); |
+ cast_value = from_int(int_value); |
} else if (value->IsHeapNumber()) { |
double double_value = HeapNumber::cast(value)->value(); |
- cast_value = static_cast<ElementType>(DoubleToInt32(double_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. |
@@ -6021,6 +6096,20 @@ bool JSObject::HasFixedTypedArrayElements() { |
} |
+#define FIXED_TYPED_ELEMENTS_CHECK(Type, type, TYPE, ctype, size) \ |
+bool JSObject::HasFixed##Type##Elements() { \ |
+ HeapObject* array = elements(); \ |
+ ASSERT(array != NULL); \ |
+ if (!array->IsHeapObject()) \ |
+ return false; \ |
+ return array->map()->instance_type() == FIXED_##TYPE##_ARRAY_TYPE; \ |
+} |
+ |
+TYPED_ARRAYS(FIXED_TYPED_ELEMENTS_CHECK) |
+ |
+#undef FIXED_TYPED_ELEMENTS_CHECK |
+ |
+ |
bool JSObject::HasNamedInterceptor() { |
return map()->has_named_interceptor(); |
} |