Skip to content

Commit d2f883d

Browse files
committed
pass fixed size lists on to encoder
1 parent 6934009 commit d2f883d

4 files changed

Lines changed: 29 additions & 2 deletions

File tree

crates/wac-graph/src/encoding.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ impl<'a> TypeEncoder<'a> {
243243
let index = match ty {
244244
DefinedType::Tuple(types) => self.tuple(state, types),
245245
DefinedType::List(ty) => self.list(state, *ty),
246+
DefinedType::FixedSizeList(ty, elements) => self.fixed_size_list(state, *ty, *elements),
246247
DefinedType::Option(ty) => self.option(state, *ty),
247248
DefinedType::Result { ok, err } => self.result(state, *ok, *err),
248249
DefinedType::Variant(v) => self.variant(state, v),
@@ -552,6 +553,18 @@ impl<'a> TypeEncoder<'a> {
552553
index
553554
}
554555

556+
fn fixed_size_list(&self, state: &mut State, ty: ValueType, elements: u32) -> u32 {
557+
let ty = self.value_type(state, ty);
558+
let index = state.current.encodable.type_count();
559+
state
560+
.current
561+
.encodable
562+
.ty()
563+
.defined_type()
564+
.fixed_size_list(ty, elements);
565+
index
566+
}
567+
555568
fn stream(&self, state: &mut State, ty: Option<ValueType>) -> u32 {
556569
let ty = ty.map(|ty| self.value_type(state, ty));
557570
let index = state.current.encodable.type_count();

crates/wac-types/src/aggregator.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,9 @@ impl TypeAggregator {
789789
.collect::<Result<_>>()?,
790790
),
791791
DefinedType::List(ty) => DefinedType::List(self.remap_value_type(types, *ty, checker)?),
792+
DefinedType::FixedSizeList(ty, elements) => {
793+
DefinedType::FixedSizeList(self.remap_value_type(types, *ty, checker)?, *elements)
794+
}
792795
DefinedType::Option(ty) => {
793796
DefinedType::Option(self.remap_value_type(types, *ty, checker)?)
794797
}

crates/wac-types/src/checker.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -551,6 +551,13 @@ impl<'a> SubtypeChecker<'a> {
551551
(DefinedType::List(a), DefinedType::List(b)) => self
552552
.value_type(*a, at, *b, bt)
553553
.context("mismatched type for list element"),
554+
(DefinedType::FixedSizeList(a, asize), DefinedType::FixedSizeList(b, bsize)) => {
555+
if asize != bsize {
556+
bail!("mismatched size for fixed size list element");
557+
}
558+
self.value_type(*a, at, *b, bt)
559+
.context("mismatched type for fixed size list element")
560+
}
554561
(DefinedType::Future(a), DefinedType::Future(b)) => self
555562
.payload(*a, at, *b, bt)
556563
.context("mismatched type for future payload"),
@@ -583,6 +590,7 @@ impl<'a> SubtypeChecker<'a> {
583590

584591
(DefinedType::Tuple(_), _)
585592
| (DefinedType::List(_), _)
593+
| (DefinedType::FixedSizeList(_, _), _)
586594
| (DefinedType::Option(_), _)
587595
| (DefinedType::Result { .. }, _)
588596
| (DefinedType::Variant(_), _)

crates/wac-types/src/component.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,8 @@ pub enum DefinedType {
659659
Tuple(Vec<ValueType>),
660660
/// A list type.
661661
List(ValueType),
662+
/// A fixed size array
663+
FixedSizeList(ValueType, u32),
662664
/// An option type.
663665
Option(ValueType),
664666
/// A result type.
@@ -689,7 +691,7 @@ impl DefinedType {
689691
pub fn contains_borrow(&self, types: &Types) -> bool {
690692
match self {
691693
Self::Tuple(tys) => tys.iter().any(|ty| ty.contains_borrow(types)),
692-
Self::List(ty) => ty.contains_borrow(types),
694+
Self::List(ty) | Self::FixedSizeList(ty, _) => ty.contains_borrow(types),
693695
Self::Option(ty) => ty.contains_borrow(types),
694696
Self::Result { ok, err } => {
695697
ok.map(|ty| ty.contains_borrow(types)).unwrap_or(false)
@@ -721,7 +723,7 @@ impl DefinedType {
721723

722724
Ok(())
723725
}
724-
DefinedType::List(ty) | DefinedType::Option(ty) => {
726+
DefinedType::List(ty) | DefinedType::Option(ty) | DefinedType::FixedSizeList(ty, _) => {
725727
ty._visit_defined_types(types, visitor, false)
726728
}
727729
DefinedType::Result { ok, err } => {
@@ -765,6 +767,7 @@ impl DefinedType {
765767
match self {
766768
Self::Tuple(_) => "tuple",
767769
Self::List(_) => "list",
770+
Self::FixedSizeList(_, _) => "list<,N>",
768771
Self::Option(_) => "option",
769772
Self::Result { .. } => "result",
770773
Self::Variant(_) => "variant",

0 commit comments

Comments
 (0)