summaryrefslogtreecommitdiffstats
path: root/third_party/rust/wasm-encoder/src/component.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/wasm-encoder/src/component.rs')
-rw-r--r--third_party/rust/wasm-encoder/src/component.rs168
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()
+ }
+}