diff --git a/compiler/gen_wasm/src/serialize.rs b/compiler/gen_wasm/src/serialize.rs index 2b88c4159c..e40d34667e 100644 --- a/compiler/gen_wasm/src/serialize.rs +++ b/compiler/gen_wasm/src/serialize.rs @@ -2,6 +2,52 @@ use std::fmt::Debug; use bumpalo::collections::vec::Vec; +pub trait Serialize { + fn serialize(&self, buffer: &mut T); +} + +impl Serialize for str { + fn serialize(&self, buffer: &mut T) { + buffer.encode_u32(self.len() as u32); + buffer.append_slice(self.as_bytes()); + } +} + +impl Serialize for u32 { + fn serialize(&self, buffer: &mut T) { + buffer.encode_u32(*self); + } +} + +// Unit is used as a placeholder in parts of the Wasm spec we don't use yet +impl Serialize for () { + fn serialize(&self, _buffer: &mut T) {} +} + +impl Serialize for [S] { + fn serialize(&self, buffer: &mut T) { + buffer.encode_u32(self.len() as u32); + for item in self.iter() { + item.serialize(buffer); + } + } +} + +impl Serialize for Option { + /// serialize Option as a vector of length 1 or 0 + fn serialize(&self, buffer: &mut T) { + match self { + Some(x) => { + buffer.append_u8(1); + x.serialize(buffer); + } + None => { + buffer.append_u8(0); + } + } + } +} + /// Write an unsigned integer into the provided buffer in LEB-128 format, returning byte length /// /// All integers in Wasm are variable-length encoded, which saves space for small values. @@ -105,52 +151,6 @@ pub trait SerialBuffer: Debug { encode_padded_sleb128!(encode_padded_i64, i64); } -pub trait Serialize { - fn serialize(&self, buffer: &mut T); -} - -impl Serialize for str { - fn serialize(&self, buffer: &mut T) { - buffer.encode_u32(self.len() as u32); - buffer.append_slice(self.as_bytes()); - } -} - -impl Serialize for u32 { - fn serialize(&self, buffer: &mut T) { - buffer.encode_u32(*self); - } -} - -// Unit is used as a placeholder in parts of the Wasm spec we don't use yet -impl Serialize for () { - fn serialize(&self, _buffer: &mut T) {} -} - -impl Serialize for [S] { - fn serialize(&self, buffer: &mut T) { - buffer.encode_u32(self.len() as u32); - for item in self.iter() { - item.serialize(buffer); - } - } -} - -impl Serialize for Option { - /// serialize Option as a vector of length 1 or 0 - fn serialize(&self, buffer: &mut T) { - match self { - Some(x) => { - buffer.append_u8(1); - x.serialize(buffer); - } - None => { - buffer.append_u8(0); - } - } - } -} - fn overwrite_padded_u32_help(buffer: &mut [u8], value: u32) { let mut x = value; for byte in buffer.iter_mut().take(4) {