diff options
Diffstat (limited to 'third_party/rust/wasm-encoder/src/component.rs')
-rw-r--r-- | third_party/rust/wasm-encoder/src/component.rs | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/third_party/rust/wasm-encoder/src/component.rs b/third_party/rust/wasm-encoder/src/component.rs new file mode 100644 index 0000000000..e3f36a88a2 --- /dev/null +++ b/third_party/rust/wasm-encoder/src/component.rs @@ -0,0 +1,168 @@ +mod aliases; +mod builder; +mod canonicals; +mod components; +mod exports; +mod imports; +mod instances; +mod modules; +mod names; +mod start; +mod types; + +pub use self::aliases::*; +pub use self::builder::*; +pub use self::canonicals::*; +pub use self::components::*; +pub use self::exports::*; +pub use self::imports::*; +pub use self::instances::*; +pub use self::modules::*; +pub use self::names::*; +pub use self::start::*; +pub use self::types::*; + +use crate::{CustomSection, Encode, ProducersSection, RawCustomSection}; + +// Core sorts extended by the component model +const CORE_TYPE_SORT: u8 = 0x10; +const CORE_MODULE_SORT: u8 = 0x11; +const CORE_INSTANCE_SORT: u8 = 0x12; + +const CORE_SORT: u8 = 0x00; +const FUNCTION_SORT: u8 = 0x01; +const VALUE_SORT: u8 = 0x02; +const TYPE_SORT: u8 = 0x03; +const COMPONENT_SORT: u8 = 0x04; +const INSTANCE_SORT: u8 = 0x05; + +/// A WebAssembly component section. +/// +/// Various builders defined in this crate already implement this trait, but you +/// can also implement it yourself for your own custom section builders, or use +/// `RawSection` to use a bunch of raw bytes as a section. +pub trait ComponentSection: Encode { + /// Gets the section identifier for this section. + fn id(&self) -> u8; + + /// Appends this section to the specified destination list of bytes. + fn append_to_component(&self, dst: &mut Vec<u8>) { + dst.push(self.id()); + self.encode(dst); + } +} + +/// Known section identifiers of WebAssembly components. +/// +/// These sections are supported by the component model proposal. +#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd)] +#[repr(u8)] +pub enum ComponentSectionId { + /// The section is a core custom section. + CoreCustom = 0, + /// The section is a core module section. + CoreModule = 1, + /// The section is a core instance section. + CoreInstance = 2, + /// The section is a core type section. + CoreType = 3, + /// The section is a component section. + Component = 4, + /// The section is an instance section. + Instance = 5, + /// The section is an alias section. + Alias = 6, + /// The section is a type section. + Type = 7, + /// The section is a canonical function section. + CanonicalFunction = 8, + /// The section is a start section. + Start = 9, + /// The section is an import section. + Import = 10, + /// The section is an export section. + Export = 11, +} + +impl From<ComponentSectionId> for u8 { + #[inline] + fn from(id: ComponentSectionId) -> u8 { + id as u8 + } +} + +impl Encode for ComponentSectionId { + fn encode(&self, sink: &mut Vec<u8>) { + sink.push(*self as u8); + } +} + +/// Represents a WebAssembly component that is being encoded. +/// +/// Unlike core WebAssembly modules, the sections of a component +/// may appear in any order and may be repeated. +/// +/// Components may also added as a section to other components. +#[derive(Clone, Debug)] +pub struct Component { + bytes: Vec<u8>, +} + +impl Component { + /// The 8-byte header at the beginning of all components. + #[rustfmt::skip] + pub const HEADER: [u8; 8] = [ + // Magic + 0x00, 0x61, 0x73, 0x6D, + // Version + 0x0d, 0x00, 0x01, 0x00, + ]; + + /// Begin writing a new `Component`. + pub fn new() -> Self { + Self { + bytes: Self::HEADER.to_vec(), + } + } + + /// Finish writing this component and extract ownership of the encoded bytes. + pub fn finish(self) -> Vec<u8> { + self.bytes + } + + /// Write a section to this component. + pub fn section(&mut self, section: &impl ComponentSection) -> &mut Self { + self.bytes.push(section.id()); + section.encode(&mut self.bytes); + self + } + + /// View the encoded bytes. + pub fn as_slice(&self) -> &[u8] { + &self.bytes + } +} + +impl Default for Component { + fn default() -> Self { + Self::new() + } +} + +impl ComponentSection for CustomSection<'_> { + fn id(&self) -> u8 { + ComponentSectionId::CoreCustom.into() + } +} + +impl ComponentSection for RawCustomSection<'_> { + fn id(&self) -> u8 { + ComponentSectionId::CoreCustom.into() + } +} + +impl ComponentSection for ProducersSection { + fn id(&self) -> u8 { + ComponentSectionId::CoreCustom.into() + } +} |