From 5b19c5fb941c5bd969464c549fbcdbb95f5fa984 Mon Sep 17 00:00:00 2001 From: Simon Heath Date: Wed, 17 Jan 2018 13:16:31 -0500 Subject: [PATCH] Added VarUint8 serialization/deserialization type. --- src/elements/mod.rs | 2 +- src/elements/ops.rs | 8 ++++---- src/elements/primitives.rs | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/elements/mod.rs b/src/elements/mod.rs index 25cf74f..27f1010 100644 --- a/src/elements/mod.rs +++ b/src/elements/mod.rs @@ -25,7 +25,7 @@ pub use self::import_entry::{ImportEntry, ResizableLimits, MemoryType, TableType pub use self::export_entry::{ExportEntry, Internal}; pub use self::global_entry::GlobalEntry; pub use self::primitives::{ - VarUint32, VarUint7, VarUint1, VarInt7, Uint32, VarInt32, VarInt64, + VarUint32, VarUint7, VarUint8, VarUint1, VarInt7, Uint32, VarInt32, VarInt64, Uint64, VarUint64, CountedList, CountedWriter, CountedListWriter, }; pub use self::types::{Type, ValueType, BlockType, FunctionType, TableElementType}; diff --git a/src/elements/ops.rs b/src/elements/ops.rs index 5dd5ae1..cccea83 100644 --- a/src/elements/ops.rs +++ b/src/elements/ops.rs @@ -1,7 +1,7 @@ use std::{io, fmt}; use super::{ Serialize, Deserialize, Error, VarUint7, - VarUint32, CountedList, BlockType, + VarUint8, VarUint32, CountedList, BlockType, Uint32, Uint64, CountedListWriter, VarInt32, VarInt64, }; @@ -346,7 +346,7 @@ impl Deserialize for Opcode { 0x10 => Call(VarUint32::deserialize(reader)?.into()), 0x11 => CallIndirect( VarUint32::deserialize(reader)?.into(), - VarUint7::deserialize(reader)?.into()), + VarUint8::deserialize(reader)?.into()), 0x1a => Drop, 0x1b => Select, @@ -449,8 +449,8 @@ impl Deserialize for Opcode { VarUint32::deserialize(reader)?.into()), - 0x3f => CurrentMemory(VarUint7::deserialize(reader)?.into()), - 0x40 => GrowMemory(VarUint7::deserialize(reader)?.into()), + 0x3f => CurrentMemory(VarUint8::deserialize(reader)?.into()), + 0x40 => GrowMemory(VarUint8::deserialize(reader)?.into()), 0x41 => I32Const(VarInt32::deserialize(reader)?.into()), 0x42 => I64Const(VarInt64::deserialize(reader)?.into()), diff --git a/src/elements/primitives.rs b/src/elements/primitives.rs index 4d67418..d2deeb0 100644 --- a/src/elements/primitives.rs +++ b/src/elements/primitives.rs @@ -206,6 +206,43 @@ impl Serialize for VarInt7 { } } +/// 8-bit unsigned integer, NOT encoded in LEB128; +/// it's just a single byte. +#[derive(Debug, Copy, Clone)] +pub struct VarUint8(u8); + +impl From for u8 { + fn from(v: VarUint8) -> u8 { + v.0 + } +} + +impl From for VarUint8 { + fn from(v: u8) -> Self { + VarUint8(v) + } +} + +impl Deserialize for VarUint8 { + type Error = Error; + + fn deserialize(reader: &mut R) -> Result { + let mut u8buf = [0u8; 1]; + reader.read_exact(&mut u8buf)?; + Ok(VarUint8(u8buf[0])) + } +} + +impl Serialize for VarUint8 { + type Error = Error; + + fn serialize(self, writer: &mut W) -> Result<(), Self::Error> { + writer.write_all(&[self.0])?; + Ok(()) + } +} + + /// 32-bit signed integer, encoded in LEB128 (can be 1-5 bytes length) #[derive(Debug, Copy, Clone)] pub struct VarInt32(i32);