usecrate::{ConstExpr, Encode, Section, SectionId, encode_section, encoding_size}; use alloc::vec::Vec;
/// An encoder for the data section. /// /// Data sections are only supported for modules. /// /// # Example /// /// ``` /// use wasm_encoder::{ /// ConstExpr, DataSection, Instruction, MemorySection, MemoryType, /// Module, /// }; /// /// let mut memory = MemorySection::new(); /// memory.memory(MemoryType { /// minimum: 1, /// maximum: None, /// memory64: false, /// shared: false, /// page_size_log2: None, /// }); /// /// let mut data = DataSection::new(); /// let memory_index = 0; /// let offset = ConstExpr::i32_const(42); /// let segment_data = b"hello"; /// data.active(memory_index, &offset, segment_data.iter().copied()); /// /// let mut module = Module::new(); /// module /// .section(&memory) /// .section(&data); /// /// let wasm_bytes = module.finish(); /// ``` #[derive(Clone, Default, Debug)] pubstruct DataSection {
bytes: Vec<u8>,
num_added: u32,
}
/// A segment in the data section. #[derive(Clone, Debug)] pubstruct DataSegment<'a, D> { /// This data segment's mode. pub mode: DataSegmentMode<'a>, /// This data segment's data. pub data: D,
}
/// A data segment's mode. #[derive(Clone, Debug)] pubenum DataSegmentMode<'a> { /// An active data segment.
Active { /// The memory this segment applies to.
memory_index: u32, /// The offset where this segment's data is initialized at.
offset: &'a ConstExpr,
}, /// A passive data segment. /// /// Passive data segments are part of the bulk memory proposal.
Passive,
}
impl DataSection { /// Create a new data section encoder. pubfn new() -> Self { Self::default()
}
/// The number of data segments in the section. pubfn len(&self) -> u32 { self.num_added
}
/// Determines if the section is empty. pubfn is_empty(&self) -> bool { self.num_added == 0
}
let data = segment.data.into_iter();
data.len().encode(&mutself.bytes); self.bytes.extend(data);
self.num_added += 1; self
}
/// Define an active data segment. pubfn active<D>(&mutself, memory_index: u32, offset: &ConstExpr, data: D) -> &mutSelf where
D: IntoIterator<Item = u8>,
D::IntoIter: ExactSizeIterator,
{ self.segment(DataSegment {
mode: DataSegmentMode::Active {
memory_index,
offset,
},
data,
})
}
/// Define a passive data segment. /// /// Passive data segments are part of the bulk memory proposal. pubfn passive<D>(&mutself, data: D) -> &mutSelf where
D: IntoIterator<Item = u8>,
D::IntoIter: ExactSizeIterator,
{ self.segment(DataSegment {
mode: DataSegmentMode::Passive,
data,
})
}
/// Copy an already-encoded data segment into this data section. pubfn raw(&mutself, already_encoded_data_segment: &[u8]) -> &style='color:red'>mutSelf { self.bytes.extend_from_slice(already_encoded_data_segment); self.num_added += 1; self
}
}
/// An encoder for the data count section. #[derive(Clone, Copy, Debug)] pubstruct DataCountSection { /// The number of segments in the data section. pub count: u32,
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.