diff --git a/Cargo.lock b/Cargo.lock index 032ad0d..4903087 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4057,7 +4057,7 @@ dependencies = [ "wac-types", "warg-client", "warg-protocol", - "wasmprinter 0.229.0", + "wasmprinter 0.235.0", "wat", "wit-component", "wit-parser", @@ -4078,10 +4078,10 @@ dependencies = [ "serde_json", "thiserror", "wac-types", - "wasm-encoder 0.229.0", + "wasm-encoder 0.235.0", "wasm-metadata", - "wasmparser 0.229.0", - "wasmprinter 0.229.0", + "wasmparser 0.235.0", + "wasmprinter 0.235.0", "wat", "wit-component", "wit-parser", @@ -4108,10 +4108,10 @@ dependencies = [ "tokio", "wac-graph", "wac-resolver", - "wasm-encoder 0.229.0", + "wasm-encoder 0.235.0", "wasm-metadata", - "wasmparser 0.229.0", - "wasmprinter 0.229.0", + "wasmparser 0.235.0", + "wasmprinter 0.235.0", ] [[package]] @@ -4137,7 +4137,7 @@ dependencies = [ "warg-crypto", "warg-protocol", "warg-server", - "wasmprinter 0.229.0", + "wasmprinter 0.235.0", "wat", "wit-component", "wit-parser", @@ -4152,8 +4152,8 @@ dependencies = [ "indexmap 2.7.1", "semver", "serde 1.0.197", - "wasm-encoder 0.229.0", - "wasmparser 0.229.0", + "wasm-encoder 0.235.0", + "wasmparser 0.235.0", ] [[package]] @@ -4455,19 +4455,19 @@ dependencies = [ [[package]] name = "wasm-encoder" -version = "0.229.0" +version = "0.235.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ba1d491ecacb085a2552025c10a675a6fddcbd03b1fc9b36c536010ce265d2" +checksum = "b3bc393c395cb621367ff02d854179882b9a351b4e0c93d1397e6090b53a5c2a" dependencies = [ "leb128fmt", - "wasmparser 0.229.0", + "wasmparser 0.235.0", ] [[package]] name = "wasm-metadata" -version = "0.229.0" +version = "0.235.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78fdb7d29a79191ab363dc90c1ddd3a1e880ffd5348d92d48482393a9e6c5f4d" +checksum = "b055604ba04189d54b8c0ab2c2fc98848f208e103882d5c0b984f045d5ea4d20" dependencies = [ "anyhow", "auditable-serde", @@ -4478,8 +4478,8 @@ dependencies = [ "serde_json", "spdx", "url", - "wasm-encoder 0.229.0", - "wasmparser 0.229.0", + "wasm-encoder 0.235.0", + "wasmparser 0.235.0", ] [[package]] @@ -4508,9 +4508,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.229.0" +version = "0.235.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc3b1f053f5d41aa55640a1fa9b6d1b8a9e4418d118ce308d20e24ff3575a8c" +checksum = "161296c618fa2d63f6ed5fffd1112937e803cb9ec71b32b01a76321555660917" dependencies = [ "bitflags 2.5.0", "hashbrown 0.15.2", @@ -4531,33 +4531,33 @@ dependencies = [ [[package]] name = "wasmprinter" -version = "0.229.0" +version = "0.235.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25dac01892684a99b8fbfaf670eb6b56edea8a096438c75392daeb83156ae2e" +checksum = "75aa8e9076de6b9544e6dab4badada518cca0bf4966d35b131bbd057aed8fa0a" dependencies = [ "anyhow", "termcolor", - "wasmparser 0.229.0", + "wasmparser 0.235.0", ] [[package]] name = "wast" -version = "229.0.0" +version = "235.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63fcaff613c12225696bb163f79ca38ffb40e9300eff0ff4b8aa8b2f7eadf0d9" +checksum = "1eda4293f626c99021bb3a6fbe4fbbe90c0e31a5ace89b5f620af8925de72e13" dependencies = [ "bumpalo", "leb128fmt", "memchr", "unicode-width 0.2.0", - "wasm-encoder 0.229.0", + "wasm-encoder 0.235.0", ] [[package]] name = "wat" -version = "1.229.0" +version = "1.235.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4189bad08b70455a9e9e67dc126d2dcf91fac143a80f1046747a5dde6d4c33e0" +checksum = "e777e0327115793cb96ab220b98f85327ec3d11f34ec9e8d723264522ef206aa" dependencies = [ "wast", ] @@ -4831,9 +4831,9 @@ dependencies = [ [[package]] name = "wit-component" -version = "0.229.0" +version = "0.235.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f550067740e223bfe6c4878998e81cdbe2529dd9a793dc49248dd6613394e8b" +checksum = "64a57a11109cc553396f89f3a38a158a97d0b1adaec113bd73e0f64d30fb601f" dependencies = [ "anyhow", "bitflags 2.5.0", @@ -4842,18 +4842,18 @@ dependencies = [ "serde 1.0.197", "serde_derive", "serde_json", - "wasm-encoder 0.229.0", + "wasm-encoder 0.235.0", "wasm-metadata", - "wasmparser 0.229.0", + "wasmparser 0.235.0", "wat", "wit-parser", ] [[package]] name = "wit-parser" -version = "0.229.0" +version = "0.235.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459c6ba62bf511d6b5f2a845a2a736822e38059c1cfa0b644b467bbbfae4efa6" +checksum = "0a1f95a87d03a33e259af286b857a95911eb46236a0f726cbaec1227b3dfc67a" dependencies = [ "anyhow", "id-arena", @@ -4864,7 +4864,7 @@ dependencies = [ "serde_derive", "serde_json", "unicode-xid", - "wasmparser 0.229.0", + "wasmparser 0.235.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index f22237f..2709695 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -63,13 +63,13 @@ wac-parser = { path = "crates/wac-parser", version = "0.7.0-dev", default-featur wac-resolver = { path = "crates/wac-resolver", version = "0.7.0-dev", default-features = false } wac-graph = { path = "crates/wac-graph", version = "0.7.0-dev" } wac-types = { path = "crates/wac-types", version = "0.7.0-dev" } -wit-parser = "0.229.0" -wasmparser = "0.229.0" -wit-component = "0.229.0" -wasm-encoder = "0.229.0" -wasmprinter = "0.229.0" -wasm-metadata = "0.229.0" -wat = "1.229.0" +wit-parser = "0.235.0" +wasmparser = "0.235.0" +wit-component = "0.235.0" +wasm-encoder = "0.235.0" +wasmprinter = "0.235.0" +wasm-metadata = "0.235.0" +wat = "1.235.0" anyhow = "1.0.81" clap = { version = "4.5.4", features = ["derive"] } semver = { version = "1.0.22", features = ["serde"] } diff --git a/crates/wac-graph/src/encoding.rs b/crates/wac-graph/src/encoding.rs index 691b104..c3c0f05 100644 --- a/crates/wac-graph/src/encoding.rs +++ b/crates/wac-graph/src/encoding.rs @@ -243,6 +243,7 @@ impl<'a> TypeEncoder<'a> { let index = match ty { DefinedType::Tuple(types) => self.tuple(state, types), DefinedType::List(ty) => self.list(state, *ty), + DefinedType::FixedSizeList(ty, elements) => self.fixed_size_list(state, *ty, *elements), DefinedType::Option(ty) => self.option(state, *ty), DefinedType::Result { ok, err } => self.result(state, *ok, *err), DefinedType::Variant(v) => self.variant(state, v), @@ -552,6 +553,18 @@ impl<'a> TypeEncoder<'a> { index } + fn fixed_size_list(&self, state: &mut State, ty: ValueType, elements: u32) -> u32 { + let ty = self.value_type(state, ty); + let index = state.current.encodable.type_count(); + state + .current + .encodable + .ty() + .defined_type() + .fixed_size_list(ty, elements); + index + } + fn stream(&self, state: &mut State, ty: Option) -> u32 { let ty = ty.map(|ty| self.value_type(state, ty)); let index = state.current.encodable.type_count(); diff --git a/crates/wac-types/src/aggregator.rs b/crates/wac-types/src/aggregator.rs index ee40677..cd5d4a3 100644 --- a/crates/wac-types/src/aggregator.rs +++ b/crates/wac-types/src/aggregator.rs @@ -789,6 +789,9 @@ impl TypeAggregator { .collect::>()?, ), DefinedType::List(ty) => DefinedType::List(self.remap_value_type(types, *ty, checker)?), + DefinedType::FixedSizeList(ty, elements) => { + DefinedType::FixedSizeList(self.remap_value_type(types, *ty, checker)?, *elements) + } DefinedType::Option(ty) => { DefinedType::Option(self.remap_value_type(types, *ty, checker)?) } diff --git a/crates/wac-types/src/checker.rs b/crates/wac-types/src/checker.rs index 7acd34f..1c17fb2 100644 --- a/crates/wac-types/src/checker.rs +++ b/crates/wac-types/src/checker.rs @@ -551,6 +551,13 @@ impl<'a> SubtypeChecker<'a> { (DefinedType::List(a), DefinedType::List(b)) => self .value_type(*a, at, *b, bt) .context("mismatched type for list element"), + (DefinedType::FixedSizeList(a, asize), DefinedType::FixedSizeList(b, bsize)) => { + if asize != bsize { + bail!("mismatched size for fixed size list element"); + } + self.value_type(*a, at, *b, bt) + .context("mismatched type for fixed size list element") + } (DefinedType::Future(a), DefinedType::Future(b)) => self .payload(*a, at, *b, bt) .context("mismatched type for future payload"), @@ -583,6 +590,7 @@ impl<'a> SubtypeChecker<'a> { (DefinedType::Tuple(_), _) | (DefinedType::List(_), _) + | (DefinedType::FixedSizeList(_, _), _) | (DefinedType::Option(_), _) | (DefinedType::Result { .. }, _) | (DefinedType::Variant(_), _) diff --git a/crates/wac-types/src/component.rs b/crates/wac-types/src/component.rs index 0cd1bb3..6436e10 100644 --- a/crates/wac-types/src/component.rs +++ b/crates/wac-types/src/component.rs @@ -659,6 +659,8 @@ pub enum DefinedType { Tuple(Vec), /// A list type. List(ValueType), + /// A fixed size array + FixedSizeList(ValueType, u32), /// An option type. Option(ValueType), /// A result type. @@ -689,7 +691,7 @@ impl DefinedType { pub fn contains_borrow(&self, types: &Types) -> bool { match self { Self::Tuple(tys) => tys.iter().any(|ty| ty.contains_borrow(types)), - Self::List(ty) => ty.contains_borrow(types), + Self::List(ty) | Self::FixedSizeList(ty, _) => ty.contains_borrow(types), Self::Option(ty) => ty.contains_borrow(types), Self::Result { ok, err } => { ok.map(|ty| ty.contains_borrow(types)).unwrap_or(false) @@ -721,7 +723,7 @@ impl DefinedType { Ok(()) } - DefinedType::List(ty) | DefinedType::Option(ty) => { + DefinedType::List(ty) | DefinedType::Option(ty) | DefinedType::FixedSizeList(ty, _) => { ty._visit_defined_types(types, visitor, false) } DefinedType::Result { ok, err } => { @@ -765,6 +767,7 @@ impl DefinedType { match self { Self::Tuple(_) => "tuple", Self::List(_) => "list", + Self::FixedSizeList(_, _) => "list<,N>", Self::Option(_) => "option", Self::Result { .. } => "result", Self::Variant(_) => "variant", diff --git a/crates/wac-types/src/package.rs b/crates/wac-types/src/package.rs index 8bb1aab..587d920 100644 --- a/crates/wac-types/src/package.rs +++ b/crates/wac-types/src/package.rs @@ -754,6 +754,10 @@ impl<'a> TypeConverter<'a> { let option = ty.map(|ty| self.component_val_type(ty)).transpose()?; ValueType::Defined(self.types.add_defined_type(DefinedType::Future(option))) } + wasm::ComponentDefinedType::FixedSizeList(ty, _) => { + let ty = self.component_val_type(*ty)?; + ValueType::Defined(self.types.add_defined_type(DefinedType::List(ty))) + } }; self.cache.insert(key, Entity::Type(Type::Value(ty)));