mirror of
https://github.com/fluencelabs/wasm-utils
synced 2025-03-16 03:20:50 +00:00
rust-runner experimental
This commit is contained in:
parent
9fba4561e5
commit
db28fe95b6
2
rust-runner/.gitignore
vendored
Normal file
2
rust-runner/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
target
|
||||
Cargo.lock
|
8
rust-runner/Cargo.toml
Normal file
8
rust-runner/Cargo.toml
Normal file
@ -0,0 +1,8 @@
|
||||
[package]
|
||||
name = "rust-runner"
|
||||
version = "0.1.0"
|
||||
authors = ["NikVolf <nikvolf@gmail.com>"]
|
||||
|
||||
[dependencies]
|
||||
parity-wasm = { git="https://github.com/nikvolf/parity-wasm" }
|
||||
wasm-utils = { path = "../" }
|
22
rust-runner/src/alloc.rs
Normal file
22
rust-runner/src/alloc.rs
Normal file
@ -0,0 +1,22 @@
|
||||
use parity_wasm::interpreter::ModuleInstanceInterface;
|
||||
|
||||
pub struct Arena {
|
||||
dynamic_top: u32,
|
||||
}
|
||||
|
||||
pub struct Error;
|
||||
|
||||
impl Arena {
|
||||
pub fn new(stack_top: u32) -> Self {
|
||||
MemoryArenaAllocator {
|
||||
module: module,
|
||||
dynamic_top: stack_top,
|
||||
}
|
||||
}
|
||||
|
||||
fn alloc(&mut self, size: u32) -> Result<u32, Error> {
|
||||
let previous_top = self.dynamic_top;
|
||||
self.dynamic_top += size;
|
||||
Ok(previous_top)
|
||||
}
|
||||
}
|
41
rust-runner/src/main.rs
Normal file
41
rust-runner/src/main.rs
Normal file
@ -0,0 +1,41 @@
|
||||
/*
|
||||
|
||||
Rust contract demo runner
|
||||
|
||||
*/
|
||||
|
||||
extern crate parity_wasm;
|
||||
extern crate wasm_utils;
|
||||
|
||||
mod alloc;
|
||||
mod storage;
|
||||
|
||||
use std::env;
|
||||
|
||||
fn main() {
|
||||
/// First, load wasm contract as a module
|
||||
|
||||
wasm_utils::init_log();
|
||||
|
||||
let args = env::args().collect::<Vec<_>>();
|
||||
if args.len() != 2 {
|
||||
println!("Usage: {} contract.wasm", args[0]);
|
||||
return;
|
||||
}
|
||||
|
||||
let module = parity_wasm::deserialize_file(&args[1]).expect("Module deserialization to succeed");
|
||||
|
||||
/// Second, create program instance
|
||||
let program = parity_wasm::interpreter::ProgramInstance::new().expect("Program instance to be created");
|
||||
|
||||
/// Add module to the programm
|
||||
program.add_module("contract", module);
|
||||
|
||||
/// Create allocator
|
||||
let mut allocator = alloc::Arena::new(5*1024*1024);
|
||||
|
||||
|
||||
/// Invoke _call method of the module
|
||||
|
||||
/// ???
|
||||
}
|
49
rust-runner/src/storage.rs
Normal file
49
rust-runner/src/storage.rs
Normal file
@ -0,0 +1,49 @@
|
||||
use parity_wasm::interpreter::ModuleInstanceInterface;
|
||||
use parity_wasm::interpreter::ItemIndex;
|
||||
use std::sync::Arc;
|
||||
|
||||
const DEFAULT_MEMORY_INDEX: ItemIndex = ItemIndex(0);
|
||||
|
||||
pub struct Storage {
|
||||
data: Vec<u8>,
|
||||
module: Arc<ModuleInstanceInterface>,
|
||||
}
|
||||
|
||||
pub struct Error;
|
||||
|
||||
impl Storage {
|
||||
|
||||
pub fn read(&self, offset: u32, len: u32, dst: u32) -> i32 {
|
||||
let memory = match self.module.memory(DEFAULT_MEMORY_INDEX) {
|
||||
Err(_) => { return -1; },
|
||||
Ok(memory) => memory,
|
||||
};
|
||||
|
||||
match memory.set(dst, &self.data[offset as usize..offset as usize + len as usize]) {
|
||||
Err(_) => { return -1; }
|
||||
Ok(_) => return len;
|
||||
}
|
||||
}
|
||||
|
||||
pub fn write(&mut self, offset: u32, len: u32, src: u32) -> i32 {
|
||||
let memory = match self.module.memory(DEFAULT_MEMORY_INDEX) {
|
||||
Err(_) => { return -1; },
|
||||
Ok(memory) => memory,
|
||||
};
|
||||
|
||||
let slice = match memory.get(src, len as usize) {
|
||||
Err(_) => { return -1; }
|
||||
Ok(slice) => return slice;
|
||||
};
|
||||
|
||||
if self.data.len() < offset as usize + slice.len {
|
||||
self.data.reserve(offset as usize + slice.len);
|
||||
unsafe {
|
||||
self.data.set_len(offset as usize + slice.len);
|
||||
}
|
||||
}
|
||||
self.data[offset as usize..offset as usize + slice.len].copy_from_slice(&slice[..]);
|
||||
}
|
||||
|
||||
pub fn size(&self) -> u32 { self.data.len() as u32 }
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user