1use error::*;
2use byteorder::{LittleEndian, ByteOrder};
3
4#[derive(Copy, Clone, Debug)]
5pub struct Module<'a> {
6 pub memory_initializers: &'a [u8], pub code: &'a [u8] }
9
10impl<'a> Module<'a> {
11 pub fn from_raw(mut s: &'a [u8]) -> ExecuteResult<Module<'a>> {
12 if s.len() < 4 {
13 return Err(ExecuteError::Bounds);
14 }
15 let initializers_len = LittleEndian::read_u32(s) as usize;
16 s = &s[4..];
17
18 if s.len() < initializers_len {
19 return Err(ExecuteError::Bounds);
20 }
21 let memory_initializers = &s[0..initializers_len];
22 s = &s[initializers_len..];
23
24 let code = s;
25
26 Ok(Module {
27 memory_initializers: memory_initializers,
28 code: code
29 })
30 }
31}
32
33#[derive(Copy, Clone, Debug)]
34#[repr(u8)]
35pub enum Opcode {
36 Drop = 1,
37 Dup,
38 Swap2,
39 Select,
40
41 Call,
42 Return,
43 Halt,
44
45 GetLocal,
46 SetLocal,
47 TeeLocal,
48
49 GetSlotIndirect,
50 GetSlot,
51 SetSlot,
52 ResetSlots,
53
54 NativeInvoke,
55
56 CurrentMemory,
57 GrowMemory,
58
59 Nop,
60 Unreachable,
61 NotSupported,
62
63 Jmp,
64 JmpIf,
65 JmpEither,
66 JmpTable,
67
68 I32Load,
69 I32Load8U,
70 I32Load8S,
71 I32Load16U,
72 I32Load16S,
73 I32Store,
74 I32Store8,
75 I32Store16,
76
77 I32Const,
78 I32Ctz,
79 I32Clz,
80 I32Popcnt,
81 I32Add,
82 I32Sub,
83 I32Mul,
84 I32DivU,
85 I32DivS,
86 I32RemU,
87 I32RemS,
88 I32And,
89 I32Or,
90 I32Xor,
91 I32Shl,
92 I32ShrU,
93 I32ShrS,
94 I32Rotl,
95 I32Rotr,
96
97 I32Eq,
98 I32Ne,
99 I32LtU,
100 I32LtS,
101 I32LeU,
102 I32LeS,
103 I32GtU,
104 I32GtS,
105 I32GeU,
106 I32GeS,
107
108 I32WrapI64,
109
110 I64Load,
111 I64Load8U,
112 I64Load8S,
113 I64Load16U,
114 I64Load16S,
115 I64Load32U,
116 I64Load32S,
117 I64Store,
118 I64Store8,
119 I64Store16,
120 I64Store32,
121
122 I64Const,
123 I64Ctz,
124 I64Clz,
125 I64Popcnt,
126 I64Add,
127 I64Sub,
128 I64Mul,
129 I64DivU,
130 I64DivS,
131 I64RemU,
132 I64RemS,
133 I64And,
134 I64Or,
135 I64Xor,
136 I64Shl,
137 I64ShrU,
138 I64ShrS,
139 I64Rotl,
140 I64Rotr,
141
142 I64Eq,
143 I64Ne,
144 I64LtU,
145 I64LtS,
146 I64LeU,
147 I64LeS,
148 I64GtU,
149 I64GtS,
150 I64GeU,
151 I64GeS,
152
153 I64ExtendI32U,
154 I64ExtendI32S,
155
156 Never
157}
158
159impl Opcode {
160 #[inline]
161 pub fn from_raw(v: u8) -> ExecuteResult<Opcode> {
162 if v > 0 && v < Opcode::Never as u8 {
163 Ok(unsafe { ::core::mem::transmute(v) })
164 } else {
165 Err(ExecuteError::IllegalOpcode)
166 }
167 }
168}