use std::io; use super::{Deserialize, Serialize, Error, VarUint32, CountedList, InitExpr, CountedListWriter}; /// Entry in the element section. pub struct ElementSegment { index: u32, offset: InitExpr, members: Vec, } impl ElementSegment { /// New element segment. pub fn new(index: u32, offset: InitExpr, members: Vec) -> Self { ElementSegment { index: index, offset: offset, members: members } } /// Sequence of function indices. pub fn members(&self) -> &[u32] { &self.members } /// Table index (currently valid only value of `0`) pub fn index(&self) -> u32 { self.index } /// An i32 initializer expression that computes the offset at which to place the elements. pub fn offset(&self) -> &InitExpr { &self.offset } } impl Deserialize for ElementSegment { type Error = Error; fn deserialize(reader: &mut R) -> Result { let index = VarUint32::deserialize(reader)?; let offset = InitExpr::deserialize(reader)?; let funcs: Vec = CountedList::::deserialize(reader)? .into_inner() .into_iter() .map(Into::into) .collect(); Ok(ElementSegment { index: index.into(), offset: offset, members: funcs, }) } } impl Serialize for ElementSegment { type Error = Error; fn serialize(self, writer: &mut W) -> Result<(), Self::Error> { VarUint32::from(self.index).serialize(writer)?; self.offset.serialize(writer)?; let data = self.members; let counted_list = CountedListWriter::( data.len(), data.into_iter().map(Into::into), ); counted_list.serialize(writer)?; Ok(()) } } /// Data segment definition. pub struct DataSegment { index: u32, offset: InitExpr, value: Vec, } impl DataSegment { /// New data segments. pub fn new(index: u32, offset: InitExpr, value: Vec) -> Self { DataSegment { index: index, offset: offset, value: value, } } /// Linear memory index (currently the only valid value is `0`). pub fn index(&self) -> u32 { self.index } /// An i32 initializer expression that computes the offset at which to place the data. pub fn offset(&self) -> &InitExpr { &self.offset } /// Initial value of the data segment. pub fn value(&self) -> &[u8] { &self.value } } impl Deserialize for DataSegment { type Error = Error; fn deserialize(reader: &mut R) -> Result { let index = VarUint32::deserialize(reader)?; let offset = InitExpr::deserialize(reader)?; let value_len = VarUint32::deserialize(reader)?; let mut value_buf = vec![0u8; value_len.into()]; reader.read_exact(&mut value_buf[..])?; Ok(DataSegment { index: index.into(), offset: offset, value: value_buf, }) } } impl Serialize for DataSegment { type Error = Error; fn serialize(self, writer: &mut W) -> Result<(), Self::Error> { VarUint32::from(self.index).serialize(writer)?; self.offset.serialize(writer)?; let value = self.value; VarUint32::from(value.len()).serialize(writer)?; writer.write_all(&value[..])?; Ok(()) } }