mirror of
https://github.com/fluencelabs/parity-wasm
synced 2025-05-23 12:41:34 +00:00
add macro for buf read
This commit is contained in:
parent
5a2b924e3b
commit
cc0cd414aa
@ -4,9 +4,9 @@ use std::error;
|
|||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::io;
|
use std::io;
|
||||||
|
|
||||||
|
mod primitives;
|
||||||
mod module;
|
mod module;
|
||||||
mod section;
|
mod section;
|
||||||
mod primitives;
|
|
||||||
mod types;
|
mod types;
|
||||||
mod import_entry;
|
mod import_entry;
|
||||||
mod export_entry;
|
mod export_entry;
|
||||||
|
@ -2,6 +2,23 @@ use std::io;
|
|||||||
use byteorder::{LittleEndian, ByteOrder};
|
use byteorder::{LittleEndian, ByteOrder};
|
||||||
use super::{Error, Deserialize, Serialize};
|
use super::{Error, Deserialize, Serialize};
|
||||||
|
|
||||||
|
macro_rules! buffered_read {
|
||||||
|
($buffer_size: expr, $length: expr, $reader: expr) => {
|
||||||
|
{
|
||||||
|
let mut vec_buf = Vec::new();
|
||||||
|
let mut total_read = 0;
|
||||||
|
let mut buf = [0u8; $buffer_size];
|
||||||
|
while total_read < $length {
|
||||||
|
let next_to_read = if $length - total_read > $buffer_size { $buffer_size } else { $length - total_read };
|
||||||
|
$reader.read_exact(&mut buf[0..next_to_read])?;
|
||||||
|
vec_buf.extend_from_slice(&buf[0..next_to_read]);
|
||||||
|
total_read += next_to_read;
|
||||||
|
}
|
||||||
|
vec_buf
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Unsigned variable-length integer, limited to 32 bits,
|
/// Unsigned variable-length integer, limited to 32 bits,
|
||||||
/// represented by at most 5 bytes that may contain padding 0x80 bytes.
|
/// represented by at most 5 bytes that may contain padding 0x80 bytes.
|
||||||
#[derive(Debug, Copy, Clone)]
|
#[derive(Debug, Copy, Clone)]
|
||||||
@ -494,18 +511,7 @@ impl Deserialize for String {
|
|||||||
fn deserialize<R: io::Read>(reader: &mut R) -> Result<Self, Self::Error> {
|
fn deserialize<R: io::Read>(reader: &mut R) -> Result<Self, Self::Error> {
|
||||||
let length = u32::from(VarUint32::deserialize(reader)?) as usize;
|
let length = u32::from(VarUint32::deserialize(reader)?) as usize;
|
||||||
if length > 0 {
|
if length > 0 {
|
||||||
let mut str_buf = Vec::new();
|
String::from_utf8(buffered_read!(1024, length, reader)).map_err(|_| Error::NonUtf8String)
|
||||||
|
|
||||||
let mut total_read = 0;
|
|
||||||
let mut buf = [0u8; 65536];
|
|
||||||
while total_read < length {
|
|
||||||
let next_to_read = if length - total_read > 65536 { 65536 } else { length - total_read };
|
|
||||||
reader.read_exact(&mut buf[0..next_to_read])?;
|
|
||||||
str_buf.extend_from_slice(&buf[0..next_to_read]);
|
|
||||||
total_read += next_to_read;
|
|
||||||
}
|
|
||||||
|
|
||||||
String::from_utf8(str_buf).map_err(|_| Error::NonUtf8String)
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Ok(String::new())
|
Ok(String::new())
|
||||||
@ -609,6 +615,7 @@ impl<I: Serialize<Error=::elements::Error>, T: IntoIterator<Item=I>> Serialize f
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user