@@ -115,18 +115,40 @@ impl<'a> Iterator for ActiveElementItemsIterator<'a> {
115115
116116#[ derive( Clone ) ]
117117pub struct PassiveElementItems < ' a > {
118+ offset : usize ,
119+ data : & ' a [ u8 ] ,
118120 amt : u32 ,
119- reader : OperatorsReader < ' a > ,
120121}
121122
123+ impl < ' a > PassiveElementItems < ' a > {
124+ pub fn get_items_reader < ' b > ( & self ) -> Result < PassiveElementItemsReader < ' b > >
125+ where
126+ ' a : ' b ,
127+ {
128+ PassiveElementItemsReader :: new ( self . data , self . offset , self . amt )
129+ }
130+ }
131+
132+ #[ derive( Debug , Clone ) ]
122133pub enum PassiveElementItem {
123134 Null ,
124135 Func ( u32 ) ,
125136}
126137
127- impl < ' a > PassiveElementItems < ' a > {
138+ #[ derive( Clone ) ]
139+ pub struct PassiveElementItemsReader < ' a > {
140+ reader : OperatorsReader < ' a > ,
141+ count : u32 ,
142+ }
143+
144+ impl < ' a > PassiveElementItemsReader < ' a > {
145+ pub fn new ( data : & [ u8 ] , offset : usize , count : u32 ) -> Result < PassiveElementItemsReader > {
146+ let reader = OperatorsReader :: new ( data, offset) ;
147+ Ok ( PassiveElementItemsReader { reader, count } )
148+ }
149+
128150 pub fn get_count ( & self ) -> u32 {
129- self . amt
151+ self . count
130152 }
131153
132154 pub fn read ( & mut self ) -> Result < PassiveElementItem > {
@@ -149,14 +171,46 @@ impl<'a> PassiveElementItems<'a> {
149171 } )
150172 }
151173 }
152- self . amt -= 1 ;
153- if self . amt == 0 {
154- self . reader . ensure_end ( ) ?;
155- }
156174 Ok ( ret)
157175 }
158176}
159177
178+ impl < ' a > IntoIterator for PassiveElementItemsReader < ' a > {
179+ type Item = Result < PassiveElementItem > ;
180+ type IntoIter = PassiveElementItemsIterator < ' a > ;
181+ fn into_iter ( self ) -> Self :: IntoIter {
182+ let count = self . count ;
183+ PassiveElementItemsIterator {
184+ reader : self ,
185+ left : count,
186+ err : false ,
187+ }
188+ }
189+ }
190+
191+ pub struct PassiveElementItemsIterator < ' a > {
192+ reader : PassiveElementItemsReader < ' a > ,
193+ left : u32 ,
194+ err : bool ,
195+ }
196+
197+ impl < ' a > Iterator for PassiveElementItemsIterator < ' a > {
198+ type Item = Result < PassiveElementItem > ;
199+ fn next ( & mut self ) -> Option < Self :: Item > {
200+ if self . err || self . left == 0 {
201+ return None ;
202+ }
203+ let result = self . reader . read ( ) ;
204+ self . err = result. is_err ( ) ;
205+ self . left -= 1 ;
206+ Some ( result)
207+ }
208+ fn size_hint ( & self ) -> ( usize , Option < usize > ) {
209+ let count = self . reader . get_count ( ) as usize ;
210+ ( count, Some ( count) )
211+ }
212+ }
213+
160214pub struct ElementSectionReader < ' a > {
161215 reader : BinaryReader < ' a > ,
162216 count : u32 ,
@@ -184,7 +238,8 @@ impl<'a> ElementSectionReader<'a> {
184238 /// # let data: &[u8] = &[0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00,
185239 /// # 0x01, 0x4, 0x01, 0x60, 0x00, 0x00, 0x03, 0x02, 0x01, 0x00,
186240 /// # 0x05, 0x03, 0x01, 0x00, 0x02,
187- /// # 0x09, 0x07, 0x01, 0x00, 0x41, 0x00, 0x0B, 0x01, 0x00,
241+ /// # 0x09, 0x0F, 0x02, 0x00, 0x41, 0x00, 0x0B, 0x01, 0x00,
242+ /// # 0x01, 0x70, 0x02, 0xD0, 0x0B, 0xD2, 0x00, 0x0B,
188243 /// # 0x0a, 0x05, 0x01, 0x03, 0x00, 0x01, 0x0b];
189244 /// use wasmparser::{ModuleReader, ElementKind};
190245 ///use wasmparser::Result;
@@ -206,6 +261,14 @@ impl<'a> ElementSectionReader<'a> {
206261 /// println!(" Item: {}", item);
207262 /// }
208263 /// }
264+ /// if let ElementKind::Passive { ty, items } = element.kind {
265+ /// println!("Type: {:?}", ty);
266+ /// let mut items_reader = items.get_items_reader().expect("items reader");
267+ /// for _ in 0..items_reader.get_count() {
268+ /// let item = items_reader.read().expect("item");
269+ /// println!(" Item: {:?}", item);
270+ /// }
271+ /// }
209272 /// }
210273 /// ```
211274 pub fn read < ' b > ( & mut self ) -> Result < Element < ' b > >
@@ -217,24 +280,14 @@ impl<'a> ElementSectionReader<'a> {
217280 let ty = self . reader . read_type ( ) ?;
218281 let amt = self . reader . read_var_u32 ( ) ?;
219282 let data_start = self . reader . position ;
220- let mut reader = OperatorsReader {
221- reader : self . reader . clone ( ) ,
222- } ;
223283 for _ in 0 ..amt {
224- loop {
225- if let Operator :: End = reader. read ( ) ? {
226- break ;
227- }
228- }
284+ self . reader . skip_init_expr ( ) ?;
229285 }
230- self . reader = reader. reader ;
231286 let data_end = self . reader . position ;
232287 let items = PassiveElementItems {
233288 amt,
234- reader : OperatorsReader :: new (
235- & self . reader . buffer [ data_start..data_end] ,
236- self . reader . original_offset + data_start,
237- ) ,
289+ offset : self . reader . original_offset + data_start,
290+ data : & self . reader . buffer [ data_start..data_end] ,
238291 } ;
239292 ElementKind :: Passive { ty, items }
240293 } else {
0 commit comments