sophon_wasm/elements/
segment.rs

1use std::io;
2use super::{Deserialize, Serialize, Error, VarUint32, CountedList, InitExpr, CountedListWriter};
3
4/// Entry in the element section.
5#[derive(Debug, Clone)]
6pub struct ElementSegment {
7    index: u32,
8    offset: InitExpr,
9    members: Vec<u32>,
10}
11
12impl ElementSegment {
13    /// New element segment.
14    pub fn new(index: u32, offset: InitExpr, members: Vec<u32>) -> Self {
15        ElementSegment { index: index, offset: offset, members: members }
16    }
17
18    /// Sequence of function indices.
19    pub fn members(&self) -> &[u32] { &self.members }
20
21    /// Sequence of function indices (mutable)
22    pub fn members_mut(&mut self) -> &mut Vec<u32> { &mut self.members }
23
24    /// Table index (currently valid only value of `0`)
25    pub fn index(&self) -> u32 { self.index }
26
27    /// An i32 initializer expression that computes the offset at which to place the elements.
28    pub fn offset(&self) -> &InitExpr { &self.offset }
29
30    /// An i32 initializer expression that computes the offset at which to place the elements (mutable)
31    pub fn offset_mut(&mut self) -> &mut InitExpr { &mut self.offset }
32}
33
34impl Deserialize for ElementSegment {
35     type Error = Error;
36
37    fn deserialize<R: io::Read>(reader: &mut R) -> Result<Self, Self::Error> {
38        let index = VarUint32::deserialize(reader)?;
39        let offset = InitExpr::deserialize(reader)?;
40        let funcs: Vec<u32> = CountedList::<VarUint32>::deserialize(reader)?
41            .into_inner()
42            .into_iter()
43            .map(Into::into)
44            .collect();
45
46        Ok(ElementSegment {
47            index: index.into(),
48            offset: offset,
49            members: funcs,
50        })
51    }
52}
53
54impl Serialize for ElementSegment {
55    type Error = Error;
56
57    fn serialize<W: io::Write>(self, writer: &mut W) -> Result<(), Self::Error> {
58        VarUint32::from(self.index).serialize(writer)?;
59        self.offset.serialize(writer)?;
60        let data = self.members;
61        let counted_list = CountedListWriter::<VarUint32, _>(
62            data.len(),
63            data.into_iter().map(Into::into),
64        );
65        counted_list.serialize(writer)?;
66        Ok(())
67    }
68}
69
70/// Data segment definition.
71#[derive(Clone)]
72pub struct DataSegment {
73    index: u32,
74    offset: InitExpr,
75    value: Vec<u8>,
76}
77
78impl DataSegment {
79    /// New data segments.
80    pub fn new(index: u32, offset: InitExpr, value: Vec<u8>) -> Self {
81        DataSegment {
82            index: index,
83            offset: offset,
84            value: value,
85        }
86    }
87
88    /// Linear memory index (currently the only valid value is `0`).
89    pub fn index(&self) -> u32 { self.index }
90
91    /// An i32 initializer expression that computes the offset at which to place the data.
92    pub fn offset(&self) -> &InitExpr { &self.offset }
93
94    /// An i32 initializer expression that computes the offset at which to place the data (mutable)
95    pub fn offset_mut(&mut self) -> &mut InitExpr { &mut self.offset }
96
97    /// Initial value of the data segment.
98    pub fn value(&self) -> &[u8] { &self.value }
99
100    /// Initial value of the data segment (mutable).
101    pub fn value_mut(&mut self) -> &mut Vec<u8> { &mut self.value }
102}
103
104impl Deserialize for DataSegment {
105     type Error = Error;
106
107    fn deserialize<R: io::Read>(reader: &mut R) -> Result<Self, Self::Error> {
108        let index = VarUint32::deserialize(reader)?;
109        let offset = InitExpr::deserialize(reader)?;
110        let value_len = VarUint32::deserialize(reader)?;
111
112        let mut value_buf = vec![0u8; value_len.into()];
113        reader.read_exact(&mut value_buf[..])?;
114
115        Ok(DataSegment {
116            index: index.into(),
117            offset: offset,
118            value: value_buf,
119        })
120    }
121}
122
123impl Serialize for DataSegment {
124    type Error = Error;
125
126    fn serialize<W: io::Write>(self, writer: &mut W) -> Result<(), Self::Error> {
127        VarUint32::from(self.index).serialize(writer)?;
128        self.offset.serialize(writer)?;
129
130        let value = self.value;
131        VarUint32::from(value.len()).serialize(writer)?;
132        writer.write_all(&value[..])?;
133        Ok(())
134    }
135}