Skip to content

Commit 1750683

Browse files
Merge pull request #156 from cpetig/fixed-size-lists
support composing with fixed size lists
2 parents 6a88b29 + 461419c commit 1750683

File tree

7 files changed

+74
-43
lines changed

7 files changed

+74
-43
lines changed

Cargo.lock

Lines changed: 34 additions & 34 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,13 @@ wac-parser = { path = "crates/wac-parser", version = "0.7.0-dev", default-featur
6363
wac-resolver = { path = "crates/wac-resolver", version = "0.7.0-dev", default-features = false }
6464
wac-graph = { path = "crates/wac-graph", version = "0.7.0-dev" }
6565
wac-types = { path = "crates/wac-types", version = "0.7.0-dev" }
66-
wit-parser = "0.229.0"
67-
wasmparser = "0.229.0"
68-
wit-component = "0.229.0"
69-
wasm-encoder = "0.229.0"
70-
wasmprinter = "0.229.0"
71-
wasm-metadata = "0.229.0"
72-
wat = "1.229.0"
66+
wit-parser = "0.235.0"
67+
wasmparser = "0.235.0"
68+
wit-component = "0.235.0"
69+
wasm-encoder = "0.235.0"
70+
wasmprinter = "0.235.0"
71+
wasm-metadata = "0.235.0"
72+
wat = "1.235.0"
7373
anyhow = "1.0.81"
7474
clap = { version = "4.5.4", features = ["derive"] }
7575
semver = { version = "1.0.22", features = ["serde"] }

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",

crates/wac-types/src/package.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,10 @@ impl<'a> TypeConverter<'a> {
754754
let option = ty.map(|ty| self.component_val_type(ty)).transpose()?;
755755
ValueType::Defined(self.types.add_defined_type(DefinedType::Future(option)))
756756
}
757+
wasm::ComponentDefinedType::FixedSizeList(ty, _) => {
758+
let ty = self.component_val_type(*ty)?;
759+
ValueType::Defined(self.types.add_defined_type(DefinedType::List(ty)))
760+
}
757761
};
758762

759763
self.cache.insert(key, Entity::Type(Type::Value(ty)));

0 commit comments

Comments
 (0)