Skip to content

Commit b61265e

Browse files
committed
Handle fixed list with different API
Signed-off-by: James Sturtevant <[email protected]>
1 parent 6b7b92a commit b61265e

File tree

9 files changed

+152
-11
lines changed

9 files changed

+152
-11
lines changed

src/hyperlight_component_util/src/elaborate.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -429,12 +429,12 @@ impl<'p, 'a> Ctx<'p, 'a> {
429429
Defined::Handleable(h) => Ok(Value::Borrow(h.clone())),
430430
_ => Err(Error::HandleToNonResource),
431431
},
432+
ComponentDefinedType::FixedSizeList(vt, size) => {
433+
Ok(Value::FixList(Box::new(self.elab_value(vt)?), *size))
434+
}
432435
ComponentDefinedType::Future(_) | ComponentDefinedType::Stream(_) => {
433436
panic!("async not yet supported")
434437
}
435-
ComponentDefinedType::FixedSizeList(vt, _) => {
436-
Ok(Value::List(Box::new(self.elab_value(vt)?)))
437-
}
438438
}
439439
}
440440

@@ -450,10 +450,11 @@ impl<'p, 'a> Ctx<'p, 'a> {
450450
})
451451
})
452452
.collect::<Result<Vec<_>, Error<'a>>>()?,
453-
result: match &ft.result {
454-
Some(vt) => Some(self.elab_value(vt)?),
455-
None => None,
456-
},
453+
result: ft
454+
.result
455+
.as_ref()
456+
.map(|vt| self.elab_value(vt))
457+
.transpose()?,
457458
})
458459
}
459460

src/hyperlight_component_util/src/etypes.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ pub enum Value<'a> {
8383
Char,
8484
String,
8585
List(Box<Value<'a>>),
86+
FixList(Box<Value<'a>>, u32),
8687
Record(Vec<RecordField<'a>>),
8788
Tuple(Vec<Value<'a>>),
8889
Flags(Vec<Name<'a>>),

src/hyperlight_component_util/src/hl.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,20 @@ pub fn emit_hl_unmarshal_value(s: &mut State, id: Ident, vt: &Value) -> TokenStr
223223
(#retid, cursor)
224224
}
225225
}
226+
Value::FixList(vt, _) => {
227+
let inid = format_ident!("{}_elem", id);
228+
let vtun = emit_hl_unmarshal_value(s, inid.clone(), vt);
229+
quote! {
230+
let mut cursor = 0;
231+
let arr = ::core::array::from_fn(|_i| {
232+
let #inid = &#id[cursor..];
233+
let (x, b) = { #vtun };
234+
cursor += b;
235+
x
236+
});
237+
(arr, cursor)
238+
}
239+
}
226240
Value::Record(_) => panic!("record not at top level of valtype"),
227241
Value::Tuple(vts) => {
228242
let inid = format_ident!("{}_elem", id);
@@ -515,6 +529,18 @@ pub fn emit_hl_marshal_value(s: &mut State, id: Ident, vt: &Value) -> TokenStrea
515529
#retid
516530
}
517531
}
532+
Value::FixList(vt, _size) => {
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 })
540+
}
541+
#retid
542+
}
543+
}
518544
Value::Record(_) => panic!("record not at top level of valtype"),
519545
Value::Tuple(vts) => {
520546
let retid = format_ident!("{}_tuple", id);

src/hyperlight_component_util/src/rtypes.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,11 @@ pub fn emit_value(s: &mut State, vt: &Value) -> TokenStream {
281281
let vt = emit_value(s, vt);
282282
quote! { alloc::vec::Vec<#vt> }
283283
}
284+
Value::FixList(vt, size) => {
285+
let vt = emit_value(s, vt);
286+
let size = *size as usize;
287+
quote! { [#vt; #size] }
288+
}
284289
Value::Record(_) => panic!("record not at top level of valtype"),
285290
Value::Tuple(vts) => {
286291
let vts = vts.iter().map(|vt| emit_value(s, vt)).collect::<Vec<_>>();

src/hyperlight_component_util/src/substitute.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ where
9696
Value::Char => Value::Char,
9797
Value::String => Value::String,
9898
Value::List(vt) => Value::List(Box::new(self.value(vt)?)),
99+
Value::FixList(vt, size) => Value::FixList(Box::new(self.value(vt)?), *size),
99100
Value::Record(rfs) => Value::Record(self.record_fields(rfs)?),
100101
Value::Variant(vcs) => Value::Variant(self.variant_cases(vcs)?),
101102
Value::Flags(ns) => Value::Flags(ns.clone()),

src/hyperlight_component_util/src/wf.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ impl<'p, 'a> Ctx<'p, 'a> {
213213
Value::Char => Ok(()),
214214
Value::String => Ok(()),
215215
Value::List(vt) => self.wf_value(p_, vt),
216+
Value::FixList(vt, _) => self.wf_value(p_, vt),
216217
Value::Record(rfs) => anon_err.and(self.wf_record_fields(p_, rfs)),
217218
Value::Variant(vcs) => anon_err.and(self.wf_variant_cases(p_, vcs)),
218219
Value::Flags(ns) => anon_err.and(error_if_duplicates_by(

src/hyperlight_host/tests/wit_test.rs

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,46 @@ impl test::wit::Roundtrip for Host {
155155
) -> test::wit::roundtrip::Testenum {
156156
x
157157
}
158-
fn roundtrip_fix_list(&mut self, x: Vec<u8>) -> Vec<u8> {
158+
fn roundtrip_fix_list(&mut self, x: [u8; 4]) -> [u8; 4] {
159+
x
160+
}
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+
}
191+
fn roundtrip_fix_list_string(&mut self, x: [String; 4]) -> [String; 4] {
192+
x
193+
}
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] {
159198
x
160199
}
161200

@@ -334,10 +373,23 @@ mod wit_test {
334373
make_test! { roundtrip_flags_large, in arb_largeflags() }
335374
make_test! { roundtrip_variant, in arb_testvariant() }
336375
make_test! { roundtrip_enum, in arb_testenum() }
337-
make_test! { roundtrip_fix_list, : Vec<u8> }
376+
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] }
387+
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] }
338390

339391
#[test]
340-
fn test_simple_func() {
392+
fn test_roundtrip_no_result() {
341393
sb().roundtrip().roundtrip_no_result(42);
342394
}
343395

src/tests/rust_guests/witguest/guest.wit

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +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>;
40+
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>;
3043

3144
record testrecord {
3245
contents: string,

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

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ extern crate alloc;
2121
extern crate hyperlight_guest;
2222

2323
mod bindings;
24+
use alloc::string::String;
25+
2426
use bindings::*;
2527

2628
struct Guest {}
@@ -113,9 +115,48 @@ impl test::wit::Roundtrip for Guest {
113115
) -> test::wit::roundtrip::Testenum {
114116
(Host {}).roundtrip_enum(x)
115117
}
116-
fn roundtrip_fix_list(&mut self, x: Vec<u8>) -> Vec<u8> {
118+
fn roundtrip_fix_list(&mut self, x: [u8; 4]) -> [u8; 4] {
117119
(Host {}).roundtrip_fix_list(x)
118120
}
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+
}
151+
fn roundtrip_fix_list_string(&mut self, x: [String; 4]) -> [String; 4] {
152+
(Host {}).roundtrip_fix_list_string(x)
153+
}
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+
}
119160
fn roundtrip_no_result(&mut self, x: u32) {
120161
(Host {}).roundtrip_no_result(x)
121162
}

0 commit comments

Comments
 (0)