Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion ci/generate-spec-tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,6 @@ fn copy_test(src: &Path, dst: &Path, features: fn(&Path) -> &str) {
let directive = match dst.file_name().and_then(|s| s.to_str()) {
// Disable tests by doing something like:
// Some("exact-func-import.wast") => "FAIL",
Some("max-value-size.wast") => "FAIL", // not yet implemented here

// Temporary exception until WebAssembly/component-model#704 lands
Some("kebab.wast") => "FAIL",
Expand Down
1 change: 1 addition & 0 deletions crates/wasmparser/src/limits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ mod component_limits {
pub const MAX_WASM_FLAG_NAMES: usize = 1_000;
pub const MAX_WASM_ENUM_CASES: usize = 10_000;
pub const MAX_WASM_COMPONENT_TYPE_DEPTH: u32 = 100;
pub const MAX_WASM_VALUE_TYPE_BYTE_SIZE: u32 = 1 << 28;
pub const MAX_WASM_INSTANTIATION_EXPORTS: usize = 100_000;
pub const MAX_WASM_CANONICAL_OPTIONS: usize = 10;
pub const MAX_WASM_INSTANTIATION_ARGS: usize = 100_000;
Expand Down
48 changes: 37 additions & 11 deletions crates/wasmparser/src/validator/component.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
use super::{
check_max,
component_types::{
Abi, AliasableResourceId, ComponentAnyTypeId, ComponentCoreInstanceTypeId,
Abi, AbiInfo, AliasableResourceId, ComponentAnyTypeId, ComponentCoreInstanceTypeId,
ComponentCoreModuleTypeId, ComponentCoreTypeId, ComponentDefinedType,
ComponentDefinedTypeId, ComponentEntityType, ComponentFuncType, ComponentFuncTypeId,
ComponentInstanceType, ComponentInstanceTypeId, ComponentItem, ComponentType,
Expand Down Expand Up @@ -3148,8 +3148,7 @@ impl ComponentState {
.result
.map(|ty| {
let ty = self.create_component_val_type(ty, offset)?;
let ty_info = ty.info(types);
if ty_info.contains_borrow() {
if ty.abi(types).contains_borrow() {
bail!(offset, "function result cannot contain a `borrow` type");
}
info.combine(ty.info(types), offset)?;
Expand Down Expand Up @@ -3984,7 +3983,8 @@ impl ComponentState {
let element = self.create_component_val_type(ty, offset)?;
let mut info = TypeInfo::new();
info.combine(element.info(types), offset)?;
Ok(ComponentDefinedType::List { element, info })
let abi = AbiInfo::list(element.abi(types));
Ok(ComponentDefinedType::List { element, info, abi })
}
crate::ComponentDefinedType::Map(key, value) => {
require_feature::cm_map(
Expand All @@ -3997,7 +3997,13 @@ impl ComponentState {
let mut info = TypeInfo::new();
info.combine(key.info(types), offset)?;
info.combine(value.info(types), offset)?;
Ok(ComponentDefinedType::Map { key, value, info })
let abi = AbiInfo::map(key.abi(types), value.abi(types));
Ok(ComponentDefinedType::Map {
key,
value,
info,
abi,
})
}
crate::ComponentDefinedType::FixedLengthList(ty, elements) => {
require_feature::cm_fixed_length_lists(
Expand All @@ -4021,10 +4027,12 @@ impl ComponentState {
let element = self.create_component_val_type(ty, offset)?;
let mut info = TypeInfo::new();
info.combine(element.info(types), offset)?;
let abi = AbiInfo::fixed_length_list(element.abi(types), elements, offset)?;
Ok(ComponentDefinedType::FixedLengthList {
element,
length: elements,
info,
abi,
})
}
crate::ComponentDefinedType::Tuple(tys) => {
Expand All @@ -4040,7 +4048,9 @@ impl ComponentState {
let ty = self.create_component_val_type(ty, offset)?;
let mut info = TypeInfo::new();
info.combine(ty.info(types), offset)?;
Ok(ComponentDefinedType::Option { ty, info })
let abis = [None, Some(ty.abi(types))];
let abi = AbiInfo::variant(abis.into_iter(), offset)?;
Ok(ComponentDefinedType::Option { ty, info, abi })
}
crate::ComponentDefinedType::Result { ok, err } => {
let ok = ok
Expand All @@ -4056,7 +4066,9 @@ impl ComponentState {
if let Some(ty) = &err {
info.combine(ty.info(types), offset)?;
}
Ok(ComponentDefinedType::Result { ok, err, info })
let abis = [ok.map(|ty| ty.abi(types)), err.map(|ty| ty.abi(types))];
let abi = AbiInfo::variant(abis.into_iter(), offset)?;
Ok(ComponentDefinedType::Result { ok, err, info, abi })
}
crate::ComponentDefinedType::Own(idx) => Ok(ComponentDefinedType::Own(
self.resource_at(idx, types, offset)?,
Expand All @@ -4077,7 +4089,8 @@ impl ComponentState {
if let Some(ty) = &ty {
info.combine(ty.info(types), offset)?;
}
Ok(ComponentDefinedType::Future { ty, info })
let abi = AbiInfo::future_or_stream(ty.map(|ty| ty.abi(types)));
Ok(ComponentDefinedType::Future { ty, info, abi })
}
crate::ComponentDefinedType::Stream(ty) => {
require_feature::cm_async(
Expand Down Expand Up @@ -4107,7 +4120,8 @@ impl ComponentState {
if let Some(ty) = &ty {
info.combine(ty.info(types), offset)?;
}
Ok(ComponentDefinedType::Stream { ty, info })
let abi = AbiInfo::future_or_stream(ty.map(|ty| ty.abi(types)));
Ok(ComponentDefinedType::Stream { ty, info, abi })
}
}
}
Expand Down Expand Up @@ -4143,8 +4157,10 @@ impl ComponentState {
}
}

let abi = AbiInfo::record(field_map.values().map(|ty| ty.abi(types)), offset)?;
Ok(ComponentDefinedType::Record(RecordType {
info,
abi,
fields: field_map,
}))
}
Expand Down Expand Up @@ -4194,8 +4210,13 @@ impl ComponentState {
}
}

let abi = AbiInfo::variant(
case_map.values().map(|c| c.ty.map(|ty| ty.abi(types))),
offset,
)?;
Ok(ComponentDefinedType::Variant(VariantType {
info,
abi,
cases: case_map,
}))
}
Expand All @@ -4210,7 +4231,7 @@ impl ComponentState {
if tys.is_empty() {
bail!(offset, "tuple type must have at least one type");
}
let types = tys
let tuple_types: Box<[_]> = tys
.iter()
.map(|ty| {
let ty = self.create_component_val_type(*ty, offset)?;
Expand All @@ -4219,7 +4240,12 @@ impl ComponentState {
})
.collect::<Result<_>>()?;

Ok(ComponentDefinedType::Tuple(TupleType { info, types }))
let abi = AbiInfo::record(tuple_types.iter().map(|ty| ty.abi(types)), offset)?;
Ok(ComponentDefinedType::Tuple(TupleType {
info,
abi,
types: tuple_types,
}))
}

fn create_flags_type(&self, names: &[&str], offset: u64) -> Result<ComponentDefinedType> {
Expand Down
Loading
Loading