1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 * vim: set ts=8 sts=2 et sw=2 tw=80:
4 /* This Source Code Form is subject to the terms of the Mozilla Public
5 * License, v. 2.0. If a copy of the MPL was not distributed with this
6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
8 #include "js/ArrayBuffer.h"
9 #include "js/ArrayBufferMaybeShared.h"
10 #include "js/experimental/TypedData.h"
11 #include "js/SharedArrayBuffer.h"
13 #include "jsapi-tests/tests.h"
17 BEGIN_TEST(testLargeArrayBuffers
) {
19 constexpr size_t nbytes
= size_t(6) * 1024 * 1024 * 1024; // 6 GB.
21 RootedObject
buffer(cx
, JS::NewArrayBuffer(cx
, nbytes
));
23 CHECK(JS::IsArrayBufferObject(buffer
));
31 CHECK_EQUAL(JS::GetArrayBufferByteLength(buffer
), nbytes
);
33 JS::GetArrayBufferLengthAndData(buffer
, &length
, &isShared
, &data
);
34 CHECK_EQUAL(length
, nbytes
);
37 JS::GetArrayBufferMaybeSharedLengthAndData(buffer
, &length
, &isShared
,
39 CHECK_EQUAL(length
, nbytes
);
42 CHECK(GetObjectAsArrayBuffer(buffer
, &length
, &data
));
43 CHECK_EQUAL(length
, nbytes
);
48 RootedObject
tarr(cx
, JS_NewUint8Array(cx
, nbytes
));
49 CHECK(JS_IsTypedArrayObject(tarr
));
50 CHECK_EQUAL(JS_GetArrayBufferViewByteOffset(tarr
), 0u);
51 CHECK_EQUAL(JS_GetArrayBufferViewByteLength(tarr
), nbytes
);
52 CHECK_EQUAL(JS_GetTypedArrayByteOffset(tarr
), 0u);
53 CHECK_EQUAL(JS_GetTypedArrayByteLength(tarr
), nbytes
);
54 CHECK_EQUAL(JS_GetTypedArrayLength(tarr
), nbytes
);
57 js::GetArrayBufferViewLengthAndData(tarr
, &length
, &isShared
, &data
);
58 CHECK_EQUAL(length
, nbytes
);
61 js::GetUint8ArrayLengthAndData(tarr
, &length
, &isShared
, &data
);
62 CHECK_EQUAL(length
, nbytes
);
65 JS::AutoCheckCannotGC
nogc(cx
);
66 mozilla::Span
<uint8_t> span
=
67 JS::TypedArray
<Scalar::Uint8
>::unwrap(tarr
).getData(&isShared
, nogc
);
68 CHECK_EQUAL(span
.Length(), nbytes
);
71 CHECK(JS_GetObjectAsArrayBufferView(tarr
, &length
, &isShared
, &data
));
72 CHECK_EQUAL(length
, nbytes
);
78 JS_NewInt16ArrayWithBuffer(cx
, buffer
, 0, nbytes
/ 2));
79 CHECK(JS_IsTypedArrayObject(tarr
));
80 CHECK_EQUAL(JS_GetArrayBufferViewByteOffset(tarr
), 0u);
81 CHECK_EQUAL(JS_GetArrayBufferViewByteLength(tarr
), nbytes
);
82 CHECK_EQUAL(JS_GetTypedArrayByteOffset(tarr
), 0u);
83 CHECK_EQUAL(JS_GetTypedArrayByteLength(tarr
), nbytes
);
84 CHECK_EQUAL(JS_GetTypedArrayLength(tarr
), nbytes
/ 2);
87 js::GetArrayBufferViewLengthAndData(tarr
, &length
, &isShared
, &data
);
88 CHECK_EQUAL(length
, nbytes
);
92 js::GetInt16ArrayLengthAndData(tarr
, &length
, &isShared
, &int16Data
);
93 CHECK_EQUAL(length
, nbytes
/ 2);
96 JS::AutoCheckCannotGC
nogc(cx
);
97 mozilla::Span
<short> span
=
98 JS::TypedArray
<Scalar::Int16
>::unwrap(tarr
).getData(&isShared
, nogc
);
99 CHECK_EQUAL(span
.Length(), nbytes
/ 2);
102 CHECK(JS_GetObjectAsArrayBufferView(tarr
, &length
, &isShared
, &data
));
103 CHECK_EQUAL(length
, nbytes
);
108 RootedObject
dv(cx
, JS_NewDataView(cx
, buffer
, 0, nbytes
- 10));
109 CHECK(JS_IsArrayBufferViewObject(dv
));
110 CHECK_EQUAL(JS_GetArrayBufferViewByteOffset(dv
), 0u);
111 CHECK_EQUAL(JS_GetArrayBufferViewByteLength(dv
), nbytes
- 10);
114 js::GetArrayBufferViewLengthAndData(dv
, &length
, &isShared
, &data
);
115 CHECK_EQUAL(length
, nbytes
- 10);
118 CHECK(JS_GetObjectAsArrayBufferView(dv
, &length
, &isShared
, &data
));
119 CHECK_EQUAL(length
, nbytes
- 10);
122 // Int8Array with large byteOffset.
124 RootedObject
tarr(cx
,
125 JS_NewInt8ArrayWithBuffer(cx
, buffer
, nbytes
- 200, 32));
126 CHECK(JS_IsTypedArrayObject(tarr
));
127 CHECK_EQUAL(JS_GetArrayBufferViewByteOffset(tarr
), nbytes
- 200);
128 CHECK_EQUAL(JS_GetArrayBufferViewByteLength(tarr
), 32u);
129 CHECK_EQUAL(JS_GetTypedArrayByteOffset(tarr
), nbytes
- 200);
130 CHECK_EQUAL(JS_GetTypedArrayByteLength(tarr
), 32u);
131 CHECK_EQUAL(JS_GetTypedArrayLength(tarr
), 32u);
134 // DataView with large byteOffset.
136 RootedObject
dv(cx
, JS_NewDataView(cx
, buffer
, nbytes
- 200, 32));
137 CHECK(JS_IsArrayBufferViewObject(dv
));
138 CHECK_EQUAL(JS_GetArrayBufferViewByteOffset(dv
), nbytes
- 200);
139 CHECK_EQUAL(JS_GetArrayBufferViewByteLength(dv
), 32u);
145 END_TEST(testLargeArrayBuffers
)
147 BEGIN_TEST(testLargeSharedArrayBuffers
) {
149 constexpr size_t nbytes
= size_t(5) * 1024 * 1024 * 1024; // 5 GB.
151 RootedObject
buffer(cx
, JS::NewSharedArrayBuffer(cx
, nbytes
));
153 CHECK(JS::IsSharedArrayBufferObject(buffer
));
154 CHECK_EQUAL(GetSharedArrayBufferByteLength(buffer
), nbytes
);
159 JS::GetSharedArrayBufferLengthAndData(buffer
, &length
, &isShared
, &data
);
160 CHECK_EQUAL(length
, nbytes
);
165 END_TEST(testLargeSharedArrayBuffers
)