Skip to content
This repository has been archived by the owner on Aug 14, 2023. It is now read-only.

Unroll ergonomics #258

Merged
merged 8 commits into from
Jul 7, 2021
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 6 additions & 11 deletions crates/abi/decoder/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,13 @@ description = "Spacemesh Virtual Machine"
publish = false

[dependencies]
svm-abi-layout = { path = "./../layout" }
svm-sdk-types = { path = "../../sdk/types", default-features = false }
svm-sdk-std = { path = "../../sdk/std", default-features = false }
seq-macro = "0.2.2"
svm-abi-layout = { path="./../layout" }
svm-sdk-types = { path="../../sdk/types", default-features=false }
svm-sdk-std = { path="../../sdk/std", default-features=false }

[features]
default = []
debug = ["svm-sdk-types/debug"]
static-alloc = [
"svm-sdk-types/static-alloc",
"svm-sdk-std/static-alloc"
]
dynamic-alloc = [
"svm-sdk-types/dynamic-alloc",
"svm-sdk-std/dynamic-alloc"
]
static-alloc = ["svm-sdk-types/static-alloc", "svm-sdk-std/static-alloc"]
dynamic-alloc = ["svm-sdk-types/dynamic-alloc", "svm-sdk-std/dynamic-alloc"]
263 changes: 28 additions & 235 deletions crates/abi/decoder/src/decoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -264,75 +264,30 @@ impl Decoder {
fn decode_array(&self, cursor: &mut Cursor) -> Result<Value, DecodeError> {
assert_no_eof!(cursor);

macro_rules! impl_decode {
(0 $cursor:ident $values:ident) => {{
//
}};
(1 $cursor:ident $values:ident) => {{
impl_decode!(@ $cursor $values);
impl_decode!(0 $cursor $values);
}};
(2 $cursor:ident $values:ident) => {{
impl_decode!(@ $cursor $values);
impl_decode!(1 $cursor $values);
}};
(3 $cursor:ident $values:ident) => {{
impl_decode!(@ $cursor $values);
impl_decode!(2 $cursor $values);
}};
(4 $cursor:ident $values:ident) => {{
impl_decode!(@ $cursor $values);
impl_decode!(3 $cursor $values);
}};
(5 $cursor:ident $values:ident) => {{
impl_decode!(@ $cursor $values);
impl_decode!(4 $cursor $values);
}};
(6 $cursor:ident $values:ident) => {{
impl_decode!(@ $cursor $values);
impl_decode!(5 $cursor $values);
}};
(7 $cursor:ident $values:ident) => {{
impl_decode!(@ $cursor $values);
impl_decode!(6 $cursor $values);
}};
(8 $cursor:ident $values:ident) => {{
impl_decode!(@ $cursor $values);
impl_decode!(7 $cursor $values);
}};
(9 $cursor:ident $values:ident) => {{
impl_decode!(@ $cursor $values);
impl_decode!(8 $cursor $values);
}};
(10 $cursor:ident $values:ident) => {{
impl_decode!(@ $cursor $values);
impl_decode!(9 $cursor $values);
}};
(@ $cursor:ident $values:ident) => {{
let value = safe_try!(self.decode_primitive($cursor));

$values.push(value);
}}
}

let len = safe_try!(self.read_byte(cursor));

let mut values: Vec<Value> = Vec::with_capacity(len as usize);

match len {
layout::ARR_0 => impl_decode!(0 cursor values),
layout::ARR_1 => impl_decode!(1 cursor values),
layout::ARR_2 => impl_decode!(2 cursor values),
layout::ARR_3 => impl_decode!(3 cursor values),
layout::ARR_4 => impl_decode!(4 cursor values),
layout::ARR_5 => impl_decode!(5 cursor values),
layout::ARR_6 => impl_decode!(6 cursor values),
layout::ARR_7 => impl_decode!(7 cursor values),
layout::ARR_8 => impl_decode!(8 cursor values),
layout::ARR_9 => impl_decode!(9 cursor values),
layout::ARR_10 => impl_decode!(10 cursor values),
let len = match len {
layout::ARR_0 => 0,
layout::ARR_1 => 1,
layout::ARR_2 => 2,
layout::ARR_3 => 3,
layout::ARR_4 => 4,
layout::ARR_5 => 5,
layout::ARR_6 => 6,
layout::ARR_7 => 7,
layout::ARR_8 => 8,
layout::ARR_9 => 9,
layout::ARR_10 => 10,
_ => svm_sdk_std::panic(),
};
seq_macro::seq!(n in 0..11 {
if len > n {
let value = safe_try!(self.decode_primitive(cursor));
values.push(value);
}
});

let values: Value = values.into();

Expand All @@ -350,180 +305,18 @@ impl Decoder {
fn read_num(&self, cursor: &mut Cursor, nbytes: usize) -> Result<u64, DecodeError> {
debug_assert!(nbytes > 0 && nbytes <= 8);

macro_rules! from_be_bytes_1 {
($ptr:expr) => {{
let mut n: u64 = 0;
let ptr = $ptr as *const u8;

let d0 = unsafe { *ptr.offset(0) };
n = d0 as u64;

n
}};
}

macro_rules! from_be_bytes_2 {
($ptr:expr) => {{
let mut n: u64 = 0;
let ptr = $ptr as *const u8;

let d0 = unsafe { *ptr.offset(0) };
let d1 = unsafe { *ptr.offset(1) };

n = (n << 8) + d0 as u64;
n = (n << 8) + d1 as u64;

n
}};
}

macro_rules! from_be_bytes_3 {
($ptr:expr) => {{
let mut n: u64 = 0;
let ptr = $ptr as *const u8;

let d0 = unsafe { *ptr.offset(0) };
let d1 = unsafe { *ptr.offset(1) };
let d2 = unsafe { *ptr.offset(2) };

n = (n << 8) + d0 as u64;
n = (n << 8) + d1 as u64;
n = (n << 8) + d2 as u64;

n
}};
}

macro_rules! from_be_bytes_4 {
($ptr:expr) => {{
let mut n: u64 = 0;
let ptr = $ptr as *const u8;

let d0 = unsafe { *ptr.offset(0) };
let d1 = unsafe { *ptr.offset(1) };
let d2 = unsafe { *ptr.offset(2) };
let d3 = unsafe { *ptr.offset(3) };

n = (n << 8) + d0 as u64;
n = (n << 8) + d1 as u64;
n = (n << 8) + d2 as u64;
n = (n << 8) + d3 as u64;

n
}};
}

macro_rules! from_be_bytes_5 {
($ptr:expr) => {{
let mut n: u64 = 0;
let ptr = $ptr as *const u8;

let d0 = unsafe { *ptr.offset(0) };
let d1 = unsafe { *ptr.offset(1) };
let d2 = unsafe { *ptr.offset(2) };
let d3 = unsafe { *ptr.offset(3) };
let d4 = unsafe { *ptr.offset(4) };

n = (n << 8) + d0 as u64;
n = (n << 8) + d1 as u64;
n = (n << 8) + d2 as u64;
n = (n << 8) + d3 as u64;
n = (n << 8) + d4 as u64;

n
}};
}

macro_rules! from_be_bytes_6 {
($ptr:expr) => {{
let mut n: u64 = 0;
let ptr = $ptr as *const u8;

let d0 = unsafe { *ptr.offset(0) };
let d1 = unsafe { *ptr.offset(1) };
let d2 = unsafe { *ptr.offset(2) };
let d3 = unsafe { *ptr.offset(3) };
let d4 = unsafe { *ptr.offset(4) };
let d5 = unsafe { *ptr.offset(5) };

n = (n << 8) + d0 as u64;
n = (n << 8) + d1 as u64;
n = (n << 8) + d2 as u64;
n = (n << 8) + d3 as u64;
n = (n << 8) + d4 as u64;
n = (n << 8) + d5 as u64;

n
}};
}

macro_rules! from_be_bytes_7 {
($ptr:expr) => {{
let mut n: u64 = 0;
let ptr = $ptr as *const u8;

let d0 = unsafe { *ptr.offset(0) };
let d1 = unsafe { *ptr.offset(1) };
let d2 = unsafe { *ptr.offset(2) };
let d3 = unsafe { *ptr.offset(3) };
let d4 = unsafe { *ptr.offset(4) };
let d5 = unsafe { *ptr.offset(5) };
let d6 = unsafe { *ptr.offset(6) };

n = (n << 8) + d0 as u64;
n = (n << 8) + d1 as u64;
n = (n << 8) + d2 as u64;
n = (n << 8) + d3 as u64;
n = (n << 8) + d4 as u64;
n = (n << 8) + d5 as u64;
n = (n << 8) + d6 as u64;

n
}};
}

macro_rules! from_be_bytes_8 {
($ptr:expr) => {{
let mut n: u64 = 0;
let ptr = $ptr as *const u8;

let d0 = unsafe { *ptr.offset(0) };
let d1 = unsafe { *ptr.offset(1) };
let d2 = unsafe { *ptr.offset(2) };
let d3 = unsafe { *ptr.offset(3) };
let d4 = unsafe { *ptr.offset(4) };
let d5 = unsafe { *ptr.offset(5) };
let d6 = unsafe { *ptr.offset(6) };
let d7 = unsafe { *ptr.offset(7) };

n = (n << 8) + d0 as u64;
n = (n << 8) + d1 as u64;
n = (n << 8) + d2 as u64;
n = (n << 8) + d3 as u64;
n = (n << 8) + d4 as u64;
n = (n << 8) + d5 as u64;
n = (n << 8) + d6 as u64;
n = (n << 8) + d7 as u64;

n
}};
}

let ptr = safe_try!(self.read_bytes(cursor, nbytes));

let num = match nbytes {
1 => from_be_bytes_1!(ptr),
2 => from_be_bytes_2!(ptr),
3 => from_be_bytes_3!(ptr),
4 => from_be_bytes_4!(ptr),
5 => from_be_bytes_5!(ptr),
6 => from_be_bytes_6!(ptr),
7 => from_be_bytes_7!(ptr),
8 => from_be_bytes_8!(ptr),
_ => svm_sdk_std::panic(),
let slice = unsafe {
core::slice::from_raw_parts(safe_try!(self.read_bytes(cursor, nbytes)), nbytes)
};
let mut data = [0u8; 8];

Result::Ok(num)
seq_macro::seq!(i in 0..8 {
if nbytes > i {
data[7 - i] = slice[nbytes - i - 1];
}
});

Result::Ok(u64::from_be_bytes(data))
}

#[inline]
Expand Down
18 changes: 7 additions & 11 deletions crates/abi/encoder/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,13 @@ description = "Spacemesh Virtual Machine"
publish = false

[dependencies]
svm-abi-layout = { path = "./../layout" }
svm-sdk-types = { path = "../../sdk/types", default-features = false }
svm-sdk-std = { path = "../../sdk/std", default-features = false }
num-traits = { version="0.2.14", default-features=false }
seq-macro = "0.2.2"
svm-abi-layout = { path="./../layout" }
svm-sdk-types = { path="../../sdk/types", default-features=false }
svm-sdk-std = { path="../../sdk/std", default-features=false }

[features]
default = []
static-alloc = [
"svm-sdk-types/static-alloc",
"svm-sdk-std/static-alloc"
]
dynamic-alloc = [
"svm-sdk-types/dynamic-alloc",
"svm-sdk-std/dynamic-alloc"
]
static-alloc = ["svm-sdk-types/static-alloc", "svm-sdk-std/static-alloc"]
dynamic-alloc = ["svm-sdk-types/dynamic-alloc", "svm-sdk-std/dynamic-alloc"]
1 change: 1 addition & 0 deletions crates/abi/encoder/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
//! This crate is responsible of encoding SVM types (its actual type and their values to be precise),
//! according to a simple ABI format.

#![no_std]
#![allow(missing_docs)]
#![allow(unused)]
#![allow(dead_code)]
Expand Down
Loading