wasmparser/readers/core/
tables.rs1use crate::{BinaryReader, ConstExpr, FromReader, Result, SectionLimited, TableType};
17
18pub type TableSectionReader<'a> = SectionLimited<'a, Table<'a>>;
20
21#[derive(Clone, Debug)]
24pub struct Table<'a> {
25 pub ty: TableType,
27 pub init: TableInit<'a>,
29}
30
31#[derive(Clone, Debug)]
33pub enum TableInit<'a> {
34 RefNull,
36 Expr(ConstExpr<'a>),
39}
40
41impl<'a> FromReader<'a> for Table<'a> {
42 fn from_reader(reader: &mut BinaryReader<'a>) -> Result<Self> {
43 let has_init_expr = if reader.peek()? == 0x40 {
44 reader.read_u8()?;
45 true
46 } else {
47 false
48 };
49
50 if has_init_expr {
51 if reader.read_u8()? != 0x00 {
52 bail!(reader.original_position() - 1, "invalid table encoding");
53 }
54 }
55
56 let ty = reader.read::<TableType>()?;
57 let init = if has_init_expr {
58 TableInit::Expr(reader.read()?)
59 } else {
60 TableInit::RefNull
61 };
62 Ok(Table { ty, init })
63 }
64}
65
66impl<'a> FromReader<'a> for TableType {
67 fn from_reader(reader: &mut BinaryReader<'a>) -> Result<Self> {
68 let element_type = reader.read()?;
69 let pos = reader.original_position();
70 let flags = reader.read_u8()?;
71 if (flags & !0b111) != 0 {
72 bail!(pos, "invalid table resizable limits flags");
73 }
74 let has_max = (flags & 0b001) != 0;
75 let shared = (flags & 0b010) != 0;
76 let table64 = (flags & 0b100) != 0;
77
78 Ok(TableType {
79 element_type,
80 table64,
81 initial: if reader.memory64() {
82 reader.read_var_u64()?
83 } else {
84 reader.read_var_u32()?.into()
85 },
86 maximum: if !has_max {
87 None
88 } else if reader.memory64() {
89 Some(reader.read_var_u64()?)
90 } else {
91 Some(reader.read_var_u32()?.into())
92 },
93 shared,
94 })
95 }
96}