Skip to content

Commit d88cf6b

Browse files
committed
address pr reviews
1 parent f04a442 commit d88cf6b

4 files changed

Lines changed: 100 additions & 0 deletions

File tree

src/rust/jsg-test/tests/arrays.rs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1377,3 +1377,62 @@ fn biguint64_array_to_js_and_from_js() {
13771377
Ok(())
13781378
});
13791379
}
1380+
1381+
#[test]
1382+
fn uint8clamped_array_from_js() {
1383+
let harness = crate::Harness::new();
1384+
harness.run_in_context(|lock, ctx| {
1385+
use jsg::v8::Local;
1386+
use jsg::v8::Uint8ClampedArray;
1387+
1388+
let val = ctx
1389+
.eval_raw("new Uint8ClampedArray([0, 128, 255])")
1390+
.unwrap();
1391+
assert!(val.is_uint8clamped_array());
1392+
assert!(!val.is_uint8_array());
1393+
1394+
let arr: Local<Uint8ClampedArray> =
1395+
// SAFETY: isolate valid; val is a Uint8ClampedArray Local.
1396+
unsafe { Local::from_ffi(lock.isolate(), val.into_ffi()) };
1397+
assert_eq!(arr.len(), 3);
1398+
assert_eq!(arr.get(0), 0u8);
1399+
assert_eq!(arr.get(1), 128u8);
1400+
assert_eq!(arr.get(2), 255u8);
1401+
assert_eq!(arr.as_slice(), &[0u8, 128, 255]);
1402+
assert!(arr.is_integer_type());
1403+
assert_eq!(arr.element_size(), 1);
1404+
1405+
Ok(())
1406+
});
1407+
}
1408+
1409+
#[test]
1410+
fn uint8clamped_array_rejects_wrong_type() {
1411+
let harness = crate::Harness::new();
1412+
harness.run_in_context(|lock, ctx| {
1413+
use jsg::FromJS;
1414+
use jsg::v8::Local;
1415+
use jsg::v8::Uint8ClampedArray;
1416+
1417+
let val = ctx.eval_raw("new Uint8Array([1, 2, 3])").unwrap();
1418+
let result = Local::<Uint8ClampedArray>::from_js(lock, val);
1419+
assert!(result.is_err());
1420+
1421+
Ok(())
1422+
});
1423+
}
1424+
1425+
#[test]
1426+
fn is_float16_array_check() {
1427+
let harness = crate::Harness::new();
1428+
harness.run_in_context(|_lock, ctx| {
1429+
let f16_val = ctx.eval_raw("new Float16Array([1.0, 2.0])").unwrap();
1430+
assert!(f16_val.is_float16_array());
1431+
assert!(!f16_val.is_float32_array());
1432+
1433+
let f32_val = ctx.eval_raw("new Float32Array([1.0])").unwrap();
1434+
assert!(!f32_val.is_float16_array());
1435+
1436+
Ok(())
1437+
});
1438+
}

src/rust/jsg/ffi.c++

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,14 @@ bool local_is_biguint64_array(const Local& val) {
210210
return local_as_ref_from_ffi<v8::Value>(val)->IsBigUint64Array();
211211
}
212212

213+
bool local_is_float16_array(const Local& val) {
214+
return local_as_ref_from_ffi<v8::Value>(val)->IsFloat16Array();
215+
}
216+
217+
bool local_is_uint8clamped_array(const Local& val) {
218+
return local_as_ref_from_ffi<v8::Value>(val)->IsUint8ClampedArray();
219+
}
220+
213221
bool local_is_array_buffer(const Local& val) {
214222
return local_as_ref_from_ffi<v8::Value>(val)->IsArrayBuffer();
215223
}
@@ -601,6 +609,7 @@ DEFINE_TYPED_ARRAY_GET(float32_array, Float32Array, float)
601609
DEFINE_TYPED_ARRAY_GET(float64_array, Float64Array, double)
602610
DEFINE_TYPED_ARRAY_GET(bigint64_array, BigInt64Array, int64_t)
603611
DEFINE_TYPED_ARRAY_GET(biguint64_array, BigUint64Array, uint64_t)
612+
DEFINE_TYPED_ARRAY_GET(uint8clamped_array, Uint8ClampedArray, uint8_t)
604613

605614
// Global<T>
606615
void global_reset(Global& value) {

src/rust/jsg/ffi.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ bool local_is_float32_array(const Local& val);
139139
bool local_is_float64_array(const Local& val);
140140
bool local_is_bigint64_array(const Local& val);
141141
bool local_is_biguint64_array(const Local& val);
142+
bool local_is_float16_array(const Local& val);
143+
bool local_is_uint8clamped_array(const Local& val);
142144
bool local_is_array_buffer(const Local& val);
143145
bool local_is_array_buffer_view(const Local& val);
144146
bool local_is_function(const Local& val);
@@ -220,6 +222,7 @@ float local_float32_array_get(Isolate* isolate, const Local& array, size_t index
220222
double local_float64_array_get(Isolate* isolate, const Local& array, size_t index);
221223
int64_t local_bigint64_array_get(Isolate* isolate, const Local& array, size_t index);
222224
uint64_t local_biguint64_array_get(Isolate* isolate, const Local& array, size_t index);
225+
uint8_t local_uint8clamped_array_get(Isolate* isolate, const Local& array, size_t index);
223226

224227
// Global<T>
225228
void global_reset(Global& value);

src/rust/jsg/v8.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,8 @@ pub mod ffi {
209209
pub unsafe fn local_is_float64_array(value: &Local) -> bool;
210210
pub unsafe fn local_is_bigint64_array(value: &Local) -> bool;
211211
pub unsafe fn local_is_biguint64_array(value: &Local) -> bool;
212+
pub unsafe fn local_is_float16_array(value: &Local) -> bool;
213+
pub unsafe fn local_is_uint8clamped_array(value: &Local) -> bool;
212214
pub unsafe fn local_is_array_buffer(value: &Local) -> bool;
213215
pub unsafe fn local_is_array_buffer_view(value: &Local) -> bool;
214216
pub unsafe fn local_is_function(value: &Local) -> bool;
@@ -376,6 +378,11 @@ pub mod ffi {
376378
array: &Local,
377379
index: usize,
378380
) -> u64;
381+
pub unsafe fn local_uint8clamped_array_get(
382+
isolate: *mut Isolate,
383+
array: &Local,
384+
index: usize,
385+
) -> u8;
379386

380387
// Global<T>
381388
pub unsafe fn global_reset(value: Pin<&mut Global>);
@@ -815,6 +822,7 @@ pub struct Float32Array;
815822
pub struct Float64Array;
816823
pub struct BigInt64Array;
817824
pub struct BigUint64Array;
825+
pub struct Uint8ClampedArray;
818826

819827
// Generic Local<'a, T> handle with lifetime
820828
#[derive(Debug)]
@@ -1010,6 +1018,18 @@ impl<'a, T> Local<'a, T> {
10101018
unsafe { ffi::local_is_biguint64_array(&self.handle) }
10111019
}
10121020

1021+
/// Returns true if the value is a `Float16Array`.
1022+
pub fn is_float16_array(&self) -> bool {
1023+
// SAFETY: handle is valid within the current HandleScope.
1024+
unsafe { ffi::local_is_float16_array(&self.handle) }
1025+
}
1026+
1027+
/// Returns true if the value is a `Uint8ClampedArray`.
1028+
pub fn is_uint8clamped_array(&self) -> bool {
1029+
// SAFETY: handle is valid within the current HandleScope.
1030+
unsafe { ffi::local_is_uint8clamped_array(&self.handle) }
1031+
}
1032+
10131033
/// Returns true if the value is an `ArrayBuffer`.
10141034
pub fn is_array_buffer(&self) -> bool {
10151035
// SAFETY: handle is valid within the current HandleScope.
@@ -1229,6 +1249,7 @@ impl_local_cast!(Float32Array -> Value, is_float32_array);
12291249
impl_local_cast!(Float64Array -> Value, is_float64_array);
12301250
impl_local_cast!(BigInt64Array -> Value, is_bigint64_array);
12311251
impl_local_cast!(BigUint64Array -> Value, is_biguint64_array);
1252+
impl_local_cast!(Uint8ClampedArray -> Value, is_uint8clamped_array);
12321253

12331254
// TypedArray base type to Value. Uses `is_array_buffer_view` which also matches
12341255
// `DataView`, but this is acceptable because `TypedArray` is only constructed from
@@ -1246,6 +1267,7 @@ impl_local_cast!(Float32Array -> TypedArray, is_float32_array);
12461267
impl_local_cast!(Float64Array -> TypedArray, is_float64_array);
12471268
impl_local_cast!(BigInt64Array -> TypedArray, is_bigint64_array);
12481269
impl_local_cast!(BigUint64Array -> TypedArray, is_biguint64_array);
1270+
impl_local_cast!(Uint8ClampedArray -> TypedArray, is_uint8clamped_array);
12491271

12501272
// Upcasts to Object (Function, Array, TypedArray are all Object subtypes in V8)
12511273
impl_local_cast!(Function -> Object, is_function);
@@ -1634,6 +1656,11 @@ impl_typed_array_from_js!(Float32Array, is_float32_array, "Float32Array");
16341656
impl_typed_array_from_js!(Float64Array, is_float64_array, "Float64Array");
16351657
impl_typed_array_from_js!(BigInt64Array, is_bigint64_array, "BigInt64Array");
16361658
impl_typed_array_from_js!(BigUint64Array, is_biguint64_array, "BigUint64Array");
1659+
impl_typed_array_from_js!(
1660+
Uint8ClampedArray,
1661+
is_uint8clamped_array,
1662+
"Uint8ClampedArray"
1663+
);
16371664

16381665
impl_typed_array!(Uint8Array, u8, local_uint8_array_get);
16391666
impl_typed_array!(Uint16Array, u16, local_uint16_array_get);
@@ -1645,6 +1672,8 @@ impl_typed_array!(Float32Array, f32, local_float32_array_get);
16451672
impl_typed_array!(Float64Array, f64, local_float64_array_get);
16461673
impl_typed_array!(BigInt64Array, i64, local_bigint64_array_get);
16471674
impl_typed_array!(BigUint64Array, u64, local_biguint64_array_get);
1675+
// Uint8ClampedArray has the same element type as Uint8Array; clamping is a write-side JS concern.
1676+
impl_typed_array!(Uint8ClampedArray, u8, local_uint8clamped_array_get);
16481677

16491678
// =============================================================================
16501679
// `String`-specific implementations

0 commit comments

Comments
 (0)