Skip to content

Commit eb932b9

Browse files
committed
Add a test cases for fixed arrays of lists
Signed-off-by: James Sturtevant <jsturtevant@gmail.com>
1 parent 0f16403 commit eb932b9

File tree

5 files changed

+119
-26
lines changed

5 files changed

+119
-26
lines changed

src/hyperlight_component_util/src/elaborate.rs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ impl<'p, 'a> Ctx<'p, 'a> {
431431
},
432432
ComponentDefinedType::FixedSizeList(vt, size) => {
433433
Ok(Value::FixList(Box::new(self.elab_value(vt)?), *size))
434-
},
434+
}
435435
ComponentDefinedType::Future(_) | ComponentDefinedType::Stream(_) => {
436436
panic!("async not yet supported")
437437
}
@@ -441,16 +441,20 @@ impl<'p, 'a> Ctx<'p, 'a> {
441441
fn elab_func<'c>(&'c mut self, ft: &ComponentFuncType<'a>) -> Result<Func<'a>, Error<'a>> {
442442
Ok(Func {
443443
params: ft
444-
.params
445-
.iter()
446-
.map(|(n, vt)| {
447-
Ok(Param {
448-
name: Name { name: n },
449-
ty: self.elab_value(vt)?,
444+
.params
445+
.iter()
446+
.map(|(n, vt)| {
447+
Ok(Param {
448+
name: Name { name: n },
449+
ty: self.elab_value(vt)?,
450+
})
450451
})
451-
})
452-
.collect::<Result<Vec<_>, Error<'a>>>()?,
453-
result: ft.result.as_ref().map(|vt| self.elab_value(vt)).transpose()?,
452+
.collect::<Result<Vec<_>, Error<'a>>>()?,
453+
result: ft
454+
.result
455+
.as_ref()
456+
.map(|vt| self.elab_value(vt))
457+
.transpose()?,
454458
})
455459
}
456460

src/hyperlight_component_util/src/hl.rs

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ pub fn emit_hl_unmarshal_value(s: &mut State, id: Ident, vt: &Value) -> TokenStr
223223
(#retid, cursor)
224224
}
225225
}
226-
Value::FixList(vt, _size) => {
226+
Value::FixList(vt, _) => {
227227
let inid = format_ident!("{}_elem", id);
228228
let vtun = emit_hl_unmarshal_value(s, inid.clone(), vt);
229229
quote! {
@@ -530,22 +530,15 @@ pub fn emit_hl_marshal_value(s: &mut State, id: Ident, vt: &Value) -> TokenStrea
530530
}
531531
}
532532
Value::FixList(vt, _size) => {
533-
// Optimize for byte arrays ie. [u8; N]
534-
if matches!(vt.as_ref(), Value::S(_) | Value::U(_) | Value::F(_)) {
535-
quote! {
536-
alloc::vec::Vec::from(#id.as_slice())
537-
}
538-
} else {
539-
let retid = format_ident!("{}_fixlist", id);
540-
let inid = format_ident!("{}_elem", id);
541-
let vtun = emit_hl_marshal_value(s, inid.clone(), vt);
542-
quote! {
543-
let mut #retid = alloc::vec::Vec::new();
544-
for #inid in #id {
545-
#retid.extend({ #vtun })
546-
}
547-
#retid
533+
let retid = format_ident!("{}_fixlist", id);
534+
let inid = format_ident!("{}_elem", id);
535+
let vtun = emit_hl_marshal_value(s, inid.clone(), vt);
536+
quote! {
537+
let mut #retid = alloc::vec::Vec::new();
538+
for #inid in #id {
539+
#retid.extend({ #vtun })
548540
}
541+
#retid
549542
}
550543
}
551544
Value::Record(_) => panic!("record not at top level of valtype"),

src/hyperlight_host/tests/wit_test.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,9 +158,45 @@ impl test::wit::Roundtrip for Host {
158158
fn roundtrip_fix_list(&mut self, x: [u8; 4]) -> [u8; 4] {
159159
x
160160
}
161+
fn roundtrip_fix_list_u32(&mut self, x: [u32; 4]) -> [u32; 4] {
162+
x
163+
}
164+
fn roundtrip_fix_list_u64(&mut self, x: [u64; 4]) -> [u64; 4] {
165+
x
166+
}
167+
fn roundtrip_fix_list_i8(&mut self, x: [i8; 4]) -> [i8; 4] {
168+
x
169+
}
170+
fn roundtrip_fix_list_i16(&mut self, x: [i16; 4]) -> [i16; 4] {
171+
x
172+
}
173+
fn roundtrip_fix_list_i32(&mut self, x: [i32; 4]) -> [i32; 4] {
174+
x
175+
}
176+
fn roundtrip_fix_list_i64(&mut self, x: [i64; 4]) -> [i64; 4] {
177+
x
178+
}
179+
fn roundtrip_fix_list_f32(&mut self, x: [f32; 4]) -> [f32; 4] {
180+
x
181+
}
182+
fn roundtrip_fix_list_f64(&mut self, x: [f64; 4]) -> [f64; 4] {
183+
x
184+
}
185+
fn roundtrip_fix_list_u8_size8(&mut self, x: [u8; 8]) -> [u8; 8] {
186+
x
187+
}
188+
fn roundtrip_fix_list_u64_size2(&mut self, x: [u64; 2]) -> [u64; 2] {
189+
x
190+
}
161191
fn roundtrip_fix_list_string(&mut self, x: [String; 4]) -> [String; 4] {
162192
x
163193
}
194+
fn roundtrip_fix_array_of_lists(&mut self, x: [Vec<u8>; 3]) -> [Vec<u8>; 3] {
195+
x
196+
}
197+
fn roundtrip_fix_array_of_string_lists(&mut self, x: [Vec<String>; 2]) -> [Vec<String>; 2] {
198+
x
199+
}
164200

165201
fn roundtrip_no_result(&mut self, _x: u32) {}
166202
}
@@ -338,7 +374,19 @@ mod wit_test {
338374
make_test! { roundtrip_variant, in arb_testvariant() }
339375
make_test! { roundtrip_enum, in arb_testenum() }
340376
make_test! { roundtrip_fix_list, : [u8; 4] }
377+
make_test! { roundtrip_fix_list_u32, : [u32; 4] }
378+
make_test! { roundtrip_fix_list_u64, : [u64; 4] }
379+
make_test! { roundtrip_fix_list_i8, : [i8; 4] }
380+
make_test! { roundtrip_fix_list_i16, : [i16; 4] }
381+
make_test! { roundtrip_fix_list_i32, : [i32; 4] }
382+
make_test! { roundtrip_fix_list_i64, : [i64; 4] }
383+
make_test! { roundtrip_fix_list_f32, : [f32; 4] }
384+
make_test! { roundtrip_fix_list_f64, : [f64; 4] }
385+
make_test! { roundtrip_fix_list_u8_size8, : [u8; 8] }
386+
make_test! { roundtrip_fix_list_u64_size2, : [u64; 2] }
341387
make_test! { roundtrip_fix_list_string, : [String; 4] }
388+
make_test! { roundtrip_fix_array_of_lists, : [Vec<u8>; 3] }
389+
make_test! { roundtrip_fix_array_of_string_lists, : [Vec<String>; 2] }
342390

343391
#[test]
344392
fn test_roundtrip_no_result() {

src/tests/rust_guests/witguest/guest.wit

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,19 @@ interface roundtrip {
2727
roundtrip-result: func(x: result<char, string>) -> result<char, string>;
2828
roundtrip-no-result: func(x: u32);
2929
roundtrip-fix-list: func(x: list<u8, 4>) -> list<u8, 4>;
30+
roundtrip-fix-list-u32: func(x: list<u32, 4>) -> list<u32, 4>;
31+
roundtrip-fix-list-u64: func(x: list<u64, 4>) -> list<u64, 4>;
32+
roundtrip-fix-list-i8: func(x: list<s8, 4>) -> list<s8, 4>;
33+
roundtrip-fix-list-i16: func(x: list<s16, 4>) -> list<s16, 4>;
34+
roundtrip-fix-list-i32: func(x: list<s32, 4>) -> list<s32, 4>;
35+
roundtrip-fix-list-i64: func(x: list<s64, 4>) -> list<s64, 4>;
36+
roundtrip-fix-list-f32: func(x: list<f32, 4>) -> list<f32, 4>;
37+
roundtrip-fix-list-f64: func(x: list<f64, 4>) -> list<f64, 4>;
38+
roundtrip-fix-list-u8-size8: func(x: list<u8, 8>) -> list<u8, 8>;
39+
roundtrip-fix-list-u64-size2: func(x: list<u64, 2>) -> list<u64, 2>;
3040
roundtrip-fix-list-string: func(x: list<string, 4>) -> list<string, 4>;
41+
roundtrip-fix-array-of-lists: func(x: list<list<u8>, 3>) -> list<list<u8>, 3>;
42+
roundtrip-fix-array-of-string-lists: func(x: list<list<string>, 2>) -> list<list<string>, 2>;
3143

3244
record testrecord {
3345
contents: string,

src/tests/rust_guests/witguest/src/main.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,45 @@ impl test::wit::Roundtrip for Guest {
118118
fn roundtrip_fix_list(&mut self, x: [u8; 4]) -> [u8; 4] {
119119
(Host {}).roundtrip_fix_list(x)
120120
}
121+
fn roundtrip_fix_list_u32(&mut self, x: [u32; 4]) -> [u32; 4] {
122+
(Host {}).roundtrip_fix_list_u32(x)
123+
}
124+
fn roundtrip_fix_list_u64(&mut self, x: [u64; 4]) -> [u64; 4] {
125+
(Host {}).roundtrip_fix_list_u64(x)
126+
}
127+
fn roundtrip_fix_list_i8(&mut self, x: [i8; 4]) -> [i8; 4] {
128+
(Host {}).roundtrip_fix_list_i8(x)
129+
}
130+
fn roundtrip_fix_list_i16(&mut self, x: [i16; 4]) -> [i16; 4] {
131+
(Host {}).roundtrip_fix_list_i16(x)
132+
}
133+
fn roundtrip_fix_list_i32(&mut self, x: [i32; 4]) -> [i32; 4] {
134+
(Host {}).roundtrip_fix_list_i32(x)
135+
}
136+
fn roundtrip_fix_list_i64(&mut self, x: [i64; 4]) -> [i64; 4] {
137+
(Host {}).roundtrip_fix_list_i64(x)
138+
}
139+
fn roundtrip_fix_list_f32(&mut self, x: [f32; 4]) -> [f32; 4] {
140+
(Host {}).roundtrip_fix_list_f32(x)
141+
}
142+
fn roundtrip_fix_list_f64(&mut self, x: [f64; 4]) -> [f64; 4] {
143+
(Host {}).roundtrip_fix_list_f64(x)
144+
}
145+
fn roundtrip_fix_list_u8_size8(&mut self, x: [u8; 8]) -> [u8; 8] {
146+
(Host {}).roundtrip_fix_list_u8_size8(x)
147+
}
148+
fn roundtrip_fix_list_u64_size2(&mut self, x: [u64; 2]) -> [u64; 2] {
149+
(Host {}).roundtrip_fix_list_u64_size2(x)
150+
}
121151
fn roundtrip_fix_list_string(&mut self, x: [String; 4]) -> [String; 4] {
122152
(Host {}).roundtrip_fix_list_string(x)
123153
}
154+
fn roundtrip_fix_array_of_lists(&mut self, x: [Vec<u8>; 3]) -> [Vec<u8>; 3] {
155+
x
156+
}
157+
fn roundtrip_fix_array_of_string_lists(&mut self, x: [Vec<String>; 2]) -> [Vec<String>; 2] {
158+
x
159+
}
124160
fn roundtrip_no_result(&mut self, x: u32) {
125161
(Host {}).roundtrip_no_result(x)
126162
}

0 commit comments

Comments
 (0)