Chromium Code Reviews| Index: runtime/lib/byte_array.cc |
| diff --git a/runtime/lib/byte_array.cc b/runtime/lib/byte_array.cc |
| index 2f61030e7a0b75145873cab828df04bebaf4c3d1..667508080104d3e2b42166bc63105ac6fbb91ee0 100644 |
| --- a/runtime/lib/byte_array.cc |
| +++ b/runtime/lib/byte_array.cc |
| @@ -42,6 +42,15 @@ static void LengthCheck(intptr_t len, intptr_t max) { |
| } |
| } |
| +// Returns an aligned array of type T with n entries. |
| +// Alignment must be >= 16 and a power of two. |
| +template<typename T> |
|
cshapiro
2012/11/30 00:23:25
Sorry, this is not what I meant. You should make
Cutch
2012/11/30 04:09:54
If OS::AlignedAllocate is a template where should
cshapiro
2012/11/30 18:02:15
Adding the OS::AllocateAlignedArray<T> template so
|
| +T* AllocateAlignedExternalArray(intptr_t n) { |
| + intptr_t size = n*sizeof(T); // NOLINT |
| + void* p = OS::AlignedAllocate(size, |
| + ExternalByteArrayData<T>::Alignment); |
| + return reinterpret_cast<T*>(p); |
| +} |
| #define GETTER_ARGUMENTS(ArrayT, ValueT) \ |
| GET_NATIVE_ARGUMENT(ArrayT, array, arguments->NativeArgAt(0)); \ |
| @@ -285,6 +294,18 @@ DEFINE_NATIVE_ENTRY(Int8Array_new, 1) { |
| } |
| +DEFINE_NATIVE_ENTRY(Int8Array_newTransferrable, 1) { |
| + GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| + intptr_t len = length.Value(); |
| + LengthCheck(len, Int8Array::kMaxElements); |
| + int8_t* bytes = AllocateAlignedExternalArray<int8_t>(len); |
| + return ExternalInt8Array::New(bytes, |
| + len, |
| + bytes, |
| + OS::AlignedFree); |
| +} |
| + |
| + |
| DEFINE_NATIVE_ENTRY(Int8Array_getIndexed, 2) { |
| GETTER(Int8Array, Smi, int8_t); |
| } |
| @@ -305,6 +326,18 @@ DEFINE_NATIVE_ENTRY(Uint8Array_new, 1) { |
| } |
| +DEFINE_NATIVE_ENTRY(Uint8Array_newTransferrable, 1) { |
| + GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| + intptr_t len = length.Value(); |
| + LengthCheck(len, Uint8Array::kMaxElements); |
| + uint8_t* bytes = AllocateAlignedExternalArray<uint8_t>(len); |
| + return ExternalUint8Array::New(bytes, |
| + len, |
| + bytes, |
| + OS::AlignedFree); |
| +} |
| + |
| + |
| DEFINE_NATIVE_ENTRY(Uint8Array_getIndexed, 2) { |
| GETTER(Uint8Array, Smi, uint8_t); |
| } |
| @@ -325,6 +358,18 @@ DEFINE_NATIVE_ENTRY(Int16Array_new, 1) { |
| } |
| +DEFINE_NATIVE_ENTRY(Int16Array_newTransferrable, 1) { |
| + GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| + intptr_t len = length.Value(); |
| + LengthCheck(len, Int16Array::kMaxElements); |
| + int16_t* bytes = AllocateAlignedExternalArray<int16_t>(len); |
| + return ExternalInt16Array::New(bytes, |
| + len, |
| + bytes, |
| + OS::AlignedFree); |
| +} |
| + |
| + |
| DEFINE_NATIVE_ENTRY(Int16Array_getIndexed, 2) { |
| GETTER(Int16Array, Smi, int16_t); |
| } |
| @@ -345,6 +390,18 @@ DEFINE_NATIVE_ENTRY(Uint16Array_new, 1) { |
| } |
| +DEFINE_NATIVE_ENTRY(Uint16Array_newTransferrable, 1) { |
| + GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| + intptr_t len = length.Value(); |
| + LengthCheck(len, Uint16Array::kMaxElements); |
| + uint16_t* bytes = AllocateAlignedExternalArray<uint16_t>(len); |
| + return ExternalUint16Array::New(bytes, |
| + len, |
| + bytes, |
| + OS::AlignedFree); |
| +} |
| + |
| + |
| DEFINE_NATIVE_ENTRY(Uint16Array_getIndexed, 2) { |
| GETTER(Uint16Array, Smi, uint16_t); |
| } |
| @@ -365,6 +422,18 @@ DEFINE_NATIVE_ENTRY(Int32Array_new, 1) { |
| } |
| +DEFINE_NATIVE_ENTRY(Int32Array_newTransferrable, 1) { |
| + GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| + intptr_t len = length.Value(); |
| + LengthCheck(len, Int32Array::kMaxElements); |
| + int32_t* bytes = AllocateAlignedExternalArray<int32_t>(len); |
| + return ExternalInt32Array::New(bytes, |
| + len, |
| + bytes, |
| + OS::AlignedFree); |
| +} |
| + |
| + |
| DEFINE_NATIVE_ENTRY(Int32Array_getIndexed, 2) { |
| GETTER(Int32Array, Integer, int32_t); |
| } |
| @@ -385,6 +454,18 @@ DEFINE_NATIVE_ENTRY(Uint32Array_new, 1) { |
| } |
| +DEFINE_NATIVE_ENTRY(Uint32Array_newTransferrable, 1) { |
| + GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| + intptr_t len = length.Value(); |
| + LengthCheck(len, Uint32Array::kMaxElements); |
| + uint32_t* bytes = AllocateAlignedExternalArray<uint32_t>(len); |
| + return ExternalUint32Array::New(bytes, |
| + len, |
| + bytes, |
| + OS::AlignedFree); |
| +} |
| + |
| + |
| DEFINE_NATIVE_ENTRY(Uint32Array_getIndexed, 2) { |
| GETTER(Uint32Array, Integer, uint32_t); |
| } |
| @@ -405,6 +486,18 @@ DEFINE_NATIVE_ENTRY(Int64Array_new, 1) { |
| } |
| +DEFINE_NATIVE_ENTRY(Int64Array_newTransferrable, 1) { |
| + GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| + intptr_t len = length.Value(); |
| + LengthCheck(len, Int64Array::kMaxElements); |
| + int64_t* bytes = AllocateAlignedExternalArray<int64_t>(len); |
| + return ExternalInt64Array::New(bytes, |
| + len, |
| + bytes, |
| + OS::AlignedFree); |
| +} |
| + |
| + |
| DEFINE_NATIVE_ENTRY(Int64Array_getIndexed, 2) { |
| GETTER(Int64Array, Integer, int64_t); |
| } |
| @@ -425,6 +518,18 @@ DEFINE_NATIVE_ENTRY(Uint64Array_new, 1) { |
| } |
| +DEFINE_NATIVE_ENTRY(Uint64Array_newTransferrable, 1) { |
| + GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| + intptr_t len = length.Value(); |
| + LengthCheck(len, Uint64Array::kMaxElements); |
| + uint64_t* bytes = AllocateAlignedExternalArray<uint64_t>(len); |
| + return ExternalUint64Array::New(bytes, |
| + len, |
| + bytes, |
| + OS::AlignedFree); |
| +} |
| + |
| + |
| DEFINE_NATIVE_ENTRY(Uint64Array_getIndexed, 2) { |
| GETTER_UINT64(Uint64Array); |
| } |
| @@ -445,6 +550,18 @@ DEFINE_NATIVE_ENTRY(Float32Array_new, 1) { |
| } |
| +DEFINE_NATIVE_ENTRY(Float32Array_newTransferrable, 1) { |
| + GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| + intptr_t len = length.Value(); |
| + LengthCheck(len, Float32Array::kMaxElements); |
| + float* bytes = AllocateAlignedExternalArray<float>(len); |
| + return ExternalFloat32Array::New(bytes, |
| + len, |
| + bytes, |
| + OS::AlignedFree); |
| +} |
| + |
| + |
| DEFINE_NATIVE_ENTRY(Float32Array_getIndexed, 2) { |
| GETTER(Float32Array, Double, float); |
| } |
| @@ -465,6 +582,18 @@ DEFINE_NATIVE_ENTRY(Float64Array_new, 1) { |
| } |
| +DEFINE_NATIVE_ENTRY(Float64Array_newTransferrable, 1) { |
| + GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); |
| + intptr_t len = length.Value(); |
| + LengthCheck(len, Float64Array::kMaxElements); |
| + double* bytes = AllocateAlignedExternalArray<double>(len); |
| + return ExternalFloat64Array::New(bytes, |
| + len, |
| + bytes, |
| + OS::AlignedFree); |
| +} |
| + |
| + |
| DEFINE_NATIVE_ENTRY(Float64Array_getIndexed, 2) { |
| GETTER(Float64Array, Double, double); |
| } |