@@ -18,39 +18,62 @@ use core::ops::Range;
18
18
use crate :: error:: * ;
19
19
use crate :: module:: Parser ;
20
20
21
- #[ allow( dead_code) ]
22
- pub struct SideTable < ' m > {
23
- indices : & ' m [ u16 ] , // including 0 and the length of metadata_array
24
- metadata : & ' m [ u16 ] ,
21
+ pub struct SideTableView < ' m > {
22
+ pub func_idx : usize ,
23
+ pub indices : & ' m [ u16 ] , // including 0 and the length of metadata_array
24
+ pub metadata : & ' m [ u16 ] ,
25
+ pub branch_table_view : Metadata < ' m > ,
25
26
}
26
27
27
- #[ allow( dead_code) ]
28
- impl < ' m > SideTable < ' m > {
29
- fn metadata ( & self , func_idx : usize ) -> Metadata < ' m > {
28
+ impl < ' m > SideTableView < ' m > {
29
+ pub fn new ( parser : & mut crate :: valid:: Parser < ' m > ) -> Result < Self , Error > {
30
+ Ok ( SideTableView {
31
+ func_idx : 0 ,
32
+ indices : parse_side_table_field ( parser) ?,
33
+ metadata : parse_side_table_field ( parser) ?,
34
+ branch_table_view : Default :: default ( ) ,
35
+ } )
36
+ }
37
+
38
+ pub fn metadata ( & self , func_idx : usize ) -> Metadata < ' m > {
30
39
Metadata (
31
40
& self . metadata [ self . indices [ func_idx] as usize .. self . indices [ func_idx + 1 ] as usize ] ,
32
41
)
33
42
}
34
43
}
35
44
36
- #[ allow( dead_code) ]
37
- #[ derive( Copy , Clone ) ]
38
- struct Metadata < ' m > ( & ' m [ u16 ] ) ;
45
+ fn parse_u16 ( data : & [ u8 ] ) -> u16 {
46
+ bytemuck:: pod_read_unaligned :: < u16 > ( bytemuck:: cast_slice ( & data[ 0 .. 2 ] ) )
47
+ }
48
+
49
+ fn parse_side_table_field < ' m > ( parser : & mut crate :: valid:: Parser < ' m > ) -> Result < & ' m [ u16 ] , Error > {
50
+ let len = parse_u16 ( parser. save ( ) ) as usize ;
51
+ let parser = parser. split_at ( len) ?;
52
+ let bytes = parser. save ( ) . get ( 0 .. len * 2 ) . unwrap ( ) ;
53
+ Ok ( bytemuck:: cast_slice :: < _ , u16 > ( bytes) )
54
+ }
55
+
56
+ #[ derive( Default , Copy , Clone ) ]
57
+ pub struct Metadata < ' m > ( & ' m [ u16 ] ) ;
39
58
40
- #[ allow( dead_code) ]
41
59
impl < ' m > Metadata < ' m > {
42
60
pub fn type_idx ( & self ) -> usize {
43
61
self . 0 [ 0 ] as usize
44
62
}
45
63
64
+ #[ allow( dead_code) ]
46
65
pub fn parser ( & self , module : & ' m [ u8 ] ) -> Parser < ' m > {
47
- unsafe { Parser :: new ( & module[ self . read_u32 ( 1 ) .. self . read_u32 ( 3 ) ] ) }
66
+ unsafe { Parser :: new ( & module[ self . parser_range ( ) ] ) }
48
67
}
49
68
50
69
pub fn branch_table ( & self ) -> & [ BranchTableEntry ] {
51
70
bytemuck:: cast_slice ( & self . 0 [ 5 ..] )
52
71
}
53
72
73
+ pub fn parser_range ( & self ) -> Range < usize > {
74
+ self . read_u32 ( 1 ) .. self . read_u32 ( 3 )
75
+ }
76
+
54
77
fn read_u32 ( & self , idx : usize ) -> usize {
55
78
bytemuck:: pod_read_unaligned :: < u32 > ( bytemuck:: cast_slice ( & self . 0 [ idx .. idx + 2 ] ) ) as usize
56
79
}
0 commit comments