Skip to content

Commit

Permalink
refactor: use macro to read/write memory
Browse files Browse the repository at this point in the history
  • Loading branch information
skanehira committed Nov 22, 2023
1 parent 0a5a415 commit 40a4867
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 47 deletions.
26 changes: 26 additions & 0 deletions src/wasi/macros.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#[macro_export]
macro_rules! memory_load {
($memory: ident, $addr: expr, $align: expr, $offset: expr) => {{
$memory.load(
$addr,
&MemoryArg {
align: $align,
offset: $offset as u32,
},
)?
}};
}

#[macro_export]
macro_rules! memory_write {
($memory: ident, $addr: expr, $align: expr, $offset: expr, $size: expr) => {{
$memory.write(
$addr,
&MemoryArg {
align: $align,
offset: $offset as u32,
},
$size as i32,
)?;
}};
}
1 change: 1 addition & 0 deletions src/wasi/mod.rs
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
mod macros;
pub mod wasi_snapshot_preview1;
pub use wasi_snapshot_preview1::*;
57 changes: 10 additions & 47 deletions src/wasi/wasi_snapshot_preview1/preview1.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
use super::file::{File, FileTable};
use crate::{binary::instruction::MemoryArg, module::ExternalFuncInst, Importer, Store, Value};
use crate::{
binary::instruction::MemoryArg, memory_load, memory_write, module::ExternalFuncInst, Importer,
Store, Value,
};
use anyhow::{Context as _, Result};
use std::{
cell::RefCell,
Expand Down Expand Up @@ -56,14 +59,7 @@ impl WasiSnapshotPreview1 {

let env = std::env::vars();
for (key, val) in env {
memory.write(
0,
&MemoryArg {
align: 4,
offset: offset as u32,
},
buf_offset as i32,
)?;
memory_write!(memory, 0, 4, offset, buf_offset);
offset += 4;

let data = format!("{}={}\0", key, val);
Expand Down Expand Up @@ -92,29 +88,15 @@ impl WasiSnapshotPreview1 {
let env = std::env::vars();

let (size, _) = env.size_hint();
memory.write(
0,
&MemoryArg {
align: 4,
offset: offset as u32,
},
size as i32,
)?;
memory_write!(memory, 0, 4, offset, size);

let size = env.fold(0, |acc, (key, val)| {
let data = format!("{}={}\0", key, val);
let data = data.as_bytes();
acc + data.len()
});

memory.write(
0,
&MemoryArg {
align: 4,
offset: buf_offset as u32,
},
size as i32,
)?;
memory_write!(memory, 0, 4, buf_offset, size);

Ok(Some(0.into()))
}
Expand All @@ -140,22 +122,10 @@ impl WasiSnapshotPreview1 {
let mut written = 0;

for _ in 0..iovs_len {
let offset: i32 = memory.load(
0,
&MemoryArg {
align: 4,
offset: iovs as u32,
},
)?;
let offset: i32 = memory_load!(memory, 0, 4, iovs);
iovs += 4;

let len: i32 = memory.load(
0,
&MemoryArg {
align: 4,
offset: iovs as u32,
},
)?;
let len: i32 = memory_load!(memory, 0, 4, iovs);
iovs += 4;

let offset = offset as usize;
Expand All @@ -165,14 +135,7 @@ impl WasiSnapshotPreview1 {
written += file.lock().expect("cannot get file lock").write(buf)?;
}

memory.write(
0,
&MemoryArg {
align: 4,
offset: rp as u32,
},
written as i32,
)?;
memory_write!(memory, 0, 4, rp, written);

Ok(Some(0.into()))
}
Expand Down

0 comments on commit 40a4867

Please sign in to comment.