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
4 changes: 1 addition & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,7 @@ num_cpus = "1.13"
rand = { version = "0.8.4", features = ["small_rng"] }
rayon = "1.3"
serde = { version = "1.0.166", features = ["derive"] }
wasmtime = { version = "3.0.0", default-features = false, features = [
'cranelift',
] }
wasmtime = { version = "11.0.1", default-features = false, features = ['cranelift', 'component-model'] }
url = "2.0.0"
pretty_assertions = "1.3.0"
semver = "1.0.0"
Expand Down
14 changes: 10 additions & 4 deletions crates/fuzz-stats/src/limits.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use anyhow::Result;
use wasmtime::*;

#[derive(Clone)]
Expand All @@ -22,12 +23,17 @@ impl StoreLimits {
}

impl ResourceLimiter for StoreLimits {
fn memory_growing(&mut self, current: usize, desired: usize, _maximum: Option<usize>) -> bool {
self.alloc(desired - current)
fn memory_growing(
&mut self,
current: usize,
desired: usize,
_maximum: Option<usize>,
) -> Result<bool> {
Ok(self.alloc(desired - current))
}

fn table_growing(&mut self, current: u32, desired: u32, _maximum: Option<u32>) -> bool {
fn table_growing(&mut self, current: u32, desired: u32, _maximum: Option<u32>) -> Result<bool> {
let delta = (desired - current) as usize * std::mem::size_of::<usize>();
self.alloc(delta)
Ok(self.alloc(delta))
}
}
3 changes: 3 additions & 0 deletions crates/wit-component/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,8 @@ pretty_assertions = "1.3.0"
env_logger = { workspace = true }
wat = { workspace = true }

[target.'cfg(not(target_family = "wasm"))'.dev-dependencies]
wasmtime = { workspace = true }

[features]
dummy-module = ['dep:wat']
354 changes: 267 additions & 87 deletions crates/wit-component/src/encoding.rs

Large diffs are not rendered by default.

61 changes: 48 additions & 13 deletions crates/wit-component/src/encoding/world.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
use super::{ComponentEncoder, RequiredOptions};
use super::{Adapter, ComponentEncoder, LibraryInfo, RequiredOptions};
use crate::validation::{
validate_adapter_module, validate_module, RequiredImports, ValidatedAdapter, ValidatedModule,
BARE_FUNC_MODULE_NAME, RESOURCE_DROP,
};
use anyhow::{Context, Result};
use indexmap::{IndexMap, IndexSet};
use std::borrow::Borrow;
use std::borrow::{Borrow, Cow};
use std::collections::{HashMap, HashSet};
use std::hash::Hash;
use wasmparser::FuncType;
Expand All @@ -15,6 +15,12 @@ use wit_parser::{
WorldKey,
};

pub struct WorldAdapter<'a> {
pub wasm: Cow<'a, [u8]>,
pub info: ValidatedAdapter<'a>,
pub library_info: Option<&'a LibraryInfo>,
}

/// Metadata discovered from the state configured in a `ComponentEncoder`.
///
/// This is stored separately from `EncodingState` to be stored as a borrow in
Expand All @@ -28,7 +34,7 @@ pub struct ComponentWorld<'a> {
pub info: ValidatedModule<'a>,
/// Validation information about adapters populated only for required
/// adapters. Additionally stores the gc'd wasm for each adapter.
pub adapters: IndexMap<&'a str, (ValidatedAdapter<'a>, Vec<u8>)>,
pub adapters: IndexMap<&'a str, WorldAdapter<'a>>,
/// Map of all imports and descriptions of what they're importing.
pub import_map: IndexMap<Option<String>, ImportedInterface>,
/// Set of all live types which must be exported either because they're
Expand Down Expand Up @@ -96,18 +102,47 @@ impl<'a> ComponentWorld<'a> {
fn process_adapters(&mut self) -> Result<()> {
let resolve = &self.encoder.metadata.resolve;
let world = self.encoder.metadata.world;
for (name, (wasm, metadata, required_exports)) in self.encoder.adapters.iter() {
for (
name,
Adapter {
wasm,
metadata,
required_exports,
library_info,
},
) in self.encoder.adapters.iter()
{
let required_by_import = self.info.adapters_required.get(name.as_str());
let required =
self.required_adapter_exports(resolve, world, required_exports, required_by_import);
if required.is_empty() {
if required.is_empty() && library_info.is_none() {
continue;
}
let wasm = crate::gc::run(wasm, &required, self.info.realloc)
.context("failed to reduce input adapter module to its minimal size")?;
let info = validate_adapter_module(&wasm, resolve, world, metadata, &required)
.context("failed to validate the imports of the minimized adapter module")?;
self.adapters.insert(name, (info, wasm));
let wasm = if library_info.is_some() {
Cow::Borrowed(wasm as &[u8])
} else {
Cow::Owned(
crate::gc::run(wasm, &required, self.info.realloc)
.context("failed to reduce input adapter module to its minimal size")?,
)
};
let info = validate_adapter_module(
&wasm,
resolve,
world,
metadata,
&required,
library_info.is_some(),
)
.context("failed to validate the imports of the minimized adapter module")?;
self.adapters.insert(
name,
WorldAdapter {
info,
wasm,
library_info: library_info.as_ref(),
},
);
}
Ok(())
}
Expand Down Expand Up @@ -173,7 +208,7 @@ impl<'a> ComponentWorld<'a> {
let resolve = &self.encoder.metadata.resolve;
let world = self.encoder.metadata.world;
let mut all_required_imports = IndexMap::new();
for map in self.adapters.values().map(|(i, _)| &i.required_imports) {
for map in self.adapters.values().map(|a| &a.info.required_imports) {
for (k, v) in map {
all_required_imports
.entry(k.as_str())
Expand Down Expand Up @@ -256,9 +291,9 @@ impl<'a> ComponentWorld<'a> {
// First use the previously calculated metadata about live imports to
// determine the set of live types in those imports.
self.add_live_imports(world, &self.info.required_imports, &mut live);
for (adapter_name, (info, _wasm)) in self.adapters.iter() {
for (adapter_name, adapter) in self.adapters.iter() {
log::trace!("processing adapter `{adapter_name}`");
self.add_live_imports(world, &info.required_imports, &mut live);
self.add_live_imports(world, &adapter.info.required_imports, &mut live);
}

// Next any imported types used by an export must also be considered
Expand Down
2 changes: 2 additions & 0 deletions crates/wit-component/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,14 @@ use wasm_encoder::CanonicalOption;
mod decoding;
mod encoding;
mod gc;
mod linking;
mod printing;
mod targets;
mod validation;

pub use decoding::{decode, DecodedWasm};
pub use encoding::{encode, ComponentEncoder};
pub use linking::Linker;
pub use printing::*;
pub use targets::*;

Expand Down
Loading