1use prelude::{Vec, String, BTreeMap};
2
3use value::Value;
4
5use opcode::Opcode;
6use bincode;
7
8#[derive(Clone, Debug, Serialize, Deserialize, Default)]
9pub struct Module {
10 pub types: Vec<Type>,
11 pub functions: Vec<Function>,
12 pub data_segments: Vec<DataSegment>,
13 pub exports: BTreeMap<String, Export>,
14 pub tables: Vec<Table>,
15 pub globals: Vec<Global>,
16 pub natives: Vec<Native>,
17 pub start_function: Option<u32>
18}
19
20#[derive(Clone, Debug, Serialize, Deserialize)]
21pub struct Native {
22 pub module: String,
23 pub field: String,
24 pub typeidx: u32
25}
26
27#[derive(Clone, Debug, Serialize, Deserialize)]
28pub struct Global {
29 pub value: Value
30}
31
32#[derive(Clone, Debug, Serialize, Deserialize)]
33pub struct Table {
34 pub min: u32,
35 pub max: Option<u32>,
36 pub elements: Vec<Option<u32>>
37}
38
39#[derive(Clone, Debug, Serialize, Deserialize)]
40pub enum Export {
41 Function(u32)
42}
43
44#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
45pub enum Type {
46 Func(Vec<ValType>, Vec<ValType>) }
48
49#[derive(Clone, Debug, Serialize, Deserialize)]
50pub struct Function {
51 pub name: Option<String>,
52 pub typeidx: u32,
53 pub locals: Vec<ValType>,
54 pub body: FunctionBody
55}
56
57#[derive(Clone, Debug, Serialize, Deserialize)]
58pub struct FunctionBody {
59 pub opcodes: Vec<Opcode>
60}
61
62#[derive(Clone, Debug, Serialize, Deserialize)]
63pub struct DataSegment {
64 pub offset: u32,
65 pub data: Vec<u8>
66}
67
68#[derive(Copy, Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
69pub enum ValType {
70 I32,
71 I64,
72 F32,
73 F64
74}
75
76impl Module {
77 pub fn std_serialize(&self) -> Result<Vec<u8>, String> {
78 match bincode::serialize(self) {
79 Ok(v) => Ok(v),
80 Err(e) => Err(format!("{:?}", e))
81 }
82 }
83
84 pub fn std_deserialize(data: &[u8]) -> Result<Module, String> {
85 match bincode::deserialize(data) {
86 Ok(v) => Ok(v),
87 Err(e) => Err(format!("{:?}", e))
88 }
89 }
90
91 pub fn lookup_exported_func(&self, name: &str) -> Option<usize> {
92 match self.exports.get(name) {
93 Some(v) => match *v {
94 Export::Function(id) => Some(id as usize)
95 },
96 None => None
97 }
98 }
99}