wasm_core/
module.rs

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>) // (args...) -> (ret)
47}
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}