Skip to content

Commit df55ccd

Browse files
committed
more fixed list implementation
1 parent 41b6f4d commit df55ccd

File tree

4 files changed

+53
-8
lines changed

4 files changed

+53
-8
lines changed

crates/core/src/abi.rs

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1401,7 +1401,17 @@ impl<'a, B: Bindgen> Generator<'a, B> {
14011401
});
14021402
}
14031403
TypeDefKind::Unknown => unreachable!(),
1404-
TypeDefKind::FixedSizeList(..) => todo!(),
1404+
TypeDefKind::FixedSizeList(ty, size) => {
1405+
self.emit(&FixedSizeListLower { elements: ty, size: *size, id });
1406+
let mut values = self
1407+
.stack
1408+
.drain(self.stack.len() - (*size as usize)..)
1409+
.collect::<Vec<_>>();
1410+
for value in values.drain(..) {
1411+
self.stack.push(value);
1412+
self.lower(ty);
1413+
}
1414+
}
14051415
},
14061416
}
14071417
}
@@ -1760,7 +1770,15 @@ impl<'a, B: Bindgen> Generator<'a, B> {
17601770
}
17611771

17621772
TypeDefKind::Unknown => unreachable!(),
1763-
TypeDefKind::FixedSizeList(..) => todo!(),
1773+
TypeDefKind::FixedSizeList(ty, size) => {
1774+
let increment = self.bindgen.sizes().size(ty);
1775+
let mut position = offset;
1776+
for _ in 0..*size {
1777+
self.write_to_memory(ty, addr.clone(), position);
1778+
position = position + increment;
1779+
}
1780+
self.emit(&FixedSizeListLower { elements: ty, size: *size, id });
1781+
}
17641782
},
17651783
}
17661784
}
@@ -1947,7 +1965,15 @@ impl<'a, B: Bindgen> Generator<'a, B> {
19471965
}
19481966

19491967
TypeDefKind::Unknown => unreachable!(),
1950-
TypeDefKind::FixedSizeList(..) => todo!(),
1968+
TypeDefKind::FixedSizeList(ty, size) => {
1969+
let increment = self.bindgen.sizes().size(ty);
1970+
let mut position = offset;
1971+
for _ in 0..*size {
1972+
self.read_from_memory(ty, addr.clone(), position);
1973+
position = position + increment;
1974+
}
1975+
self.emit(&FixedSizeListLift { elements: ty, size: *size, id });
1976+
}
19511977
},
19521978
}
19531979
}
@@ -2149,7 +2175,7 @@ impl<'a, B: Bindgen> Generator<'a, B> {
21492175
TypeDefKind::Future(_) => unreachable!(),
21502176
TypeDefKind::Stream(_) => unreachable!(),
21512177
TypeDefKind::Unknown => unreachable!(),
2152-
TypeDefKind::FixedSizeList(..) => todo!(),
2178+
TypeDefKind::FixedSizeList(_, _) => {}
21532179
},
21542180
}
21552181
}

crates/rust/src/bindgen.rs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1207,8 +1207,24 @@ impl Bindgen for FunctionBindgen<'_, '_> {
12071207
Instruction::DropHandle { .. } => {
12081208
uwriteln!(self.src, "let _ = {};", operands[0]);
12091209
}
1210-
Instruction::FixedSizeListLift { .. } => todo!(),
1211-
Instruction::FixedSizeListLower { .. } => todo!(),
1210+
Instruction::FixedSizeListLift { elements: _, size, id: _ } => {
1211+
let tmp = self.tmp();
1212+
let result = format!("result{tmp}");
1213+
self.push_str(&format!(
1214+
"let mut {result} = [",
1215+
));
1216+
for a in operands.drain(0..(*size as usize)) {
1217+
self.push_str(&a);
1218+
self.push_str(", ");
1219+
}
1220+
self.push_str("];\n");
1221+
results.push(result);
1222+
}
1223+
Instruction::FixedSizeListLower { elements: _, size, id: _ } => {
1224+
for i in 0..(*size as usize) {
1225+
results.push(format!("{}[{i}]", operands[0]));
1226+
}
1227+
}
12121228
}
12131229
}
12141230
}

crates/rust/src/interface.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2920,7 +2920,9 @@ impl<'a, 'b> wit_bindgen_core::AnonymousTypeGenerator<'a> for AnonTypeGenerator<
29202920
self.interface.push_str(">");
29212921
}
29222922

2923-
fn anonymous_type_fixed_size_list(&mut self, _id: TypeId, _ty: &Type, _size: u32, _docs: &Docs) {
2924-
todo!()
2923+
fn anonymous_type_fixed_size_list(&mut self, _id: TypeId, ty: &Type, size: u32, _docs: &Docs) {
2924+
self.interface.push_str("[");
2925+
self.interface.print_ty(ty, TypeMode{ lifetime: None, lists_borrowed: false, style: TypeOwnershipStyle::Owned });
2926+
self.interface.push_str(&format!(", {size}]"));
29252927
}
29262928
}

tests/runtime/fixed-size-list/test.wit

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package test:lists;
33
interface to-test {
44
list-param: func(a: list<u32, 4>);
55
list-param2: func(a: list<list<u32, 2>, 2>);
6+
list-param3: func(a: list<s32, 20>);
67
list-result: func() -> list<u8, 8>;
78

89
list-minmax16: func(a: list<u16, 4>, b: list<s16, 4>) -> tuple<list<u16, 4>, list<s16, 4>>;

0 commit comments

Comments
 (0)