Skip to content

Commit

Permalink
Merge pull request #2 from clabby/cl/make-clippy-happy
Browse files Browse the repository at this point in the history
♻️ Fix clippy errors
  • Loading branch information
Philogy authored Oct 23, 2023
2 parents bf1cced + 86fb2c9 commit 5bd998f
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 47 deletions.
23 changes: 11 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,8 @@ use hex_literal::hex as hx;
use Asm::*;

fn main() {
let mut runtime_marks = MarkTracker::new();

let empty_revert = runtime_marks.next();
let mut runtime_marks = MarkTracker::default();
let empty_revert = runtime_marks.next_mark();

let mut runtime = vec![
// Load x, y
Expand Down Expand Up @@ -65,9 +64,9 @@ fn main() {

let runtime_bytecode = assemble_full(&mut runtime, true).unwrap();

let mut deploy_marks = MarkTracker::new();
let runtime_start = deploy_marks.next();
let runtime_end = deploy_marks.next();
let mut deploy_marks = MarkTracker::default();
let runtime_start = deploy_marks.next_mark();
let runtime_end = deploy_marks.next_mark();

let mut deploy = vec![
// Constructor
Expand Down Expand Up @@ -163,10 +162,10 @@ worrying about duplicates:
use evm_glue::utils::MarkTracker;
use evm_glue::assembly::Asm::*;

let mut mt = MarkTracker::new();
let mut mt = MarkTracker::default();

let label1 = mt.next(); // 0
let empty_revert = mt.next(); // 1
let label1 = mt.next_mark(); // 0
let empty_revert = mt.next_mark(); // 1

let asm = vec![
Mark(label1),
Expand Down Expand Up @@ -200,9 +199,9 @@ These also have helpers:
```rust
use evm_glue::{assembly::Asm, utils::MarkTracker};

let mut deploy_marks = MarkTracker::new();
let runtime_start = deploy_marks.next();
let runtime_end = deploy_marks.next();
let mut deploy_marks = MarkTracker::default();
let runtime_start = deploy_marks.next_mark();
let runtime_end = deploy_marks.next_mark();
let asm = vec![
Asm::delta_ref(runtime_start, runtime_end), // Pushed delta reference
// ...,
Expand Down
44 changes: 21 additions & 23 deletions src/assembler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,25 +21,25 @@ impl MarkMap {
}
}

fn get_maybe(&self, idx: usize) -> &Option<usize> {
fn get(&self, idx: usize) -> Option<usize> {
match self.0.get(idx) {
Some(v) => v,
None => &None,
Some(v) => *v,
None => None,
}
}

fn get(&self, idx: usize) -> usize {
self.get_maybe(idx)
.clone()
.expect("Contained invalid mark reference")
fn get_unchecked(&self, idx: usize) -> usize {
self.get(idx).expect("Contained invalid mark reference")
}
}

impl MarkMap {
fn lookup_value(&self, ref_type: &RefType) -> usize {
match ref_type {
RefType::Direct(mid) => self.get(*mid),
RefType::Delta(start_mid, end_mid) => self.get(*end_mid) - self.get(*start_mid),
RefType::Direct(mid) => self.get_unchecked(*mid),
RefType::Delta(start_mid, end_mid) => {
self.get_unchecked(*end_mid) - self.get_unchecked(*start_mid)
}
}
}
}
Expand All @@ -54,11 +54,10 @@ pub enum AssembleError {

fn get_and_validate_marks(
mmap: &mut MarkMap,
asm: &Vec<Asm>,
asm: &[Asm],
start_offset: usize,
) -> Result<usize, AssembleError> {
asm.iter().fold(Ok(start_offset), |maybe_offset, block| {
let offset = maybe_offset?;
asm.iter().try_fold(start_offset, |offset, block| {
if let Asm::Mark(mid) = block {
if !mmap.set(*mid, offset) {
return Err(AssembleError::DuplicateMark(*mid));
Expand Down Expand Up @@ -90,7 +89,7 @@ where
}
}
},
Asm::PaddedBlock { blocks, .. } => validate_refs(&blocks, validate_mid)?,
Asm::PaddedBlock { blocks, .. } => validate_refs(blocks, validate_mid)?,
_ => {}
}
}
Expand All @@ -104,15 +103,14 @@ pub fn validate_asm(asm: &Vec<Asm>) -> AssembleResult<()> {
get_and_validate_marks(&mut mmap, asm, 0)?;

validate_refs(asm, &|mid: usize| {
mmap.get_maybe(mid)
mmap.get(mid)
.ok_or(AssembleError::InvalidMarkReference(mid))
})
}

/// Assumes that the size for all refs in `asm` has been set.
fn validate_padding(asm: &Vec<Asm>) -> AssembleResult<usize> {
asm.iter().fold(Ok(0), |maybe_offset, block| {
let offset = maybe_offset?;
fn validate_padding(asm: &[Asm]) -> AssembleResult<usize> {
asm.iter().try_fold(0, |offset, block| {
if let Asm::PaddedBlock { size, blocks, .. } = block {
let full_size = validate_padding(blocks)?;
if full_size > *size {
Expand Down Expand Up @@ -147,7 +145,7 @@ fn set_minimum_ref_size(asm: &mut Vec<Asm>) {

/// Expects `Asm` to have been validated with `validate_asm` and that the sizes for all refs have
/// been set.
fn build_mark_map(mmap: &mut MarkMap, asm: &Vec<Asm>, start_offset: usize) -> usize {
fn build_mark_map(mmap: &mut MarkMap, asm: &[Asm], start_offset: usize) -> usize {
asm.iter().fold(start_offset, |offset, block| {
if let Asm::Mark(mid) = block {
mmap.set(*mid, offset);
Expand Down Expand Up @@ -217,14 +215,14 @@ fn min_ref_size(offset: usize) -> usize {
ref_size
}

fn minimize_ref_sizes(asm: &mut Vec<Asm>) -> (MarkMap, usize) {
fn minimize_ref_sizes(asm: &mut [Asm]) -> (MarkMap, usize) {
let mut mmap = MarkMap::new();
let mut total_size: usize = 0;

let mut remaining_changes = true;
while remaining_changes {
remaining_changes = false;
total_size = build_mark_map(&mut mmap, &asm, 0);
total_size = build_mark_map(&mut mmap, asm, 0);
for_each_mref_mut(asm, &mut |mref| {
let required_size = min_ref_size(mmap.lookup_value(&mref.ref_type));
match mref.size {
Expand All @@ -241,20 +239,20 @@ fn minimize_ref_sizes(asm: &mut Vec<Asm>) -> (MarkMap, usize) {
}

pub fn assemble_full(asm: &mut Vec<Asm>, minimize_refs: bool) -> AssembleResult<Vec<u8>> {
validate_asm(&asm)?;
validate_asm(asm)?;

let (mmap, total_size) = if minimize_refs {
minimize_ref_sizes(asm)
} else {
set_minimum_ref_size(asm);

let mut mmap = MarkMap::new();
let total_size = build_mark_map(&mut mmap, &asm, 0);
let total_size = build_mark_map(&mut mmap, asm, 0);

(mmap, total_size)
};

validate_padding(&asm)?;
validate_padding(asm)?;

let mut bytecode = Vec::with_capacity(total_size);

Expand Down
15 changes: 8 additions & 7 deletions src/assembly.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,9 +87,9 @@ impl fmt::Display for Asm {

use Asm::*;

pub fn for_each_mref_mut<F>(asm: &mut Vec<Asm>, f: &mut F)
pub fn for_each_mref_mut<F>(asm: &mut [Asm], f: &mut F)
where
F: FnMut(&mut MarkRef) -> (),
F: FnMut(&mut MarkRef),
{
asm.iter_mut().for_each(|block| match block {
Ref(mref) => f(mref),
Expand All @@ -98,11 +98,12 @@ where
})
}

pub fn for_each_mref<F>(asm: &Vec<Asm>, f: &mut F)
pub fn for_each_mref<A, F>(asm: A, f: &mut F)
where
F: FnMut(&MarkRef) -> (),
A: AsRef<[Asm]>,
F: FnMut(&MarkRef),
{
asm.iter().for_each(|block| match block {
asm.as_ref().iter().for_each(|block| match block {
Ref(mref) => f(mref),
PaddedBlock { blocks, .. } => for_each_mref(blocks, f),
_ => {}
Expand Down Expand Up @@ -233,8 +234,8 @@ macro_rules! evm_asm {
/// use evm_glue::{assembly::{*, Asm::*}, opcodes::{*, Opcode::*}, utils::*, evm_asm, evm_asm_vec};
/// use hex_literal::hex;
///
/// let mut runtime_marks = MarkTracker::new();
/// let empty_revert = runtime_marks.next();
/// let mut runtime_marks = MarkTracker::default();
/// let empty_revert = runtime_marks.next_mark();
///
/// let push0_var = Asm::Op(PUSH0);
/// let runtime = vec![
Expand Down
4 changes: 4 additions & 0 deletions src/opcodes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,10 @@ impl Opcode {
}
}

pub fn is_empty(&self) -> bool {
false
}

pub fn append_to(&self, stream: &mut Vec<u8>) {
stream.push(self.byte());

Expand Down
7 changes: 2 additions & 5 deletions src/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,11 @@ macro_rules! debug_as_display {
};
}

#[derive(Default)]
pub struct MarkTracker(usize);

impl MarkTracker {
pub fn new() -> Self {
MarkTracker(0)
}

pub fn next(&mut self) -> usize {
pub fn next_mark(&mut self) -> usize {
let new_mid = self.0;
self.0 = new_mid + 1;
new_mid
Expand Down

0 comments on commit 5bd998f

Please sign in to comment.