mirror of
https://github.com/pezkuwichain/wasm-instrument.git
synced 2026-06-12 07:41:04 +00:00
fully working
This commit is contained in:
+62
-27
@@ -67,12 +67,13 @@
|
||||
self.total = 0;
|
||||
|
||||
self.write = function(offset, len, ptr) {
|
||||
console.log("storage_write: " + JSON.stringify(arguments));
|
||||
var oldSize = false;
|
||||
while (offset + len > self.size) {
|
||||
oldSize || (oldSize = self.size);
|
||||
self.size = self.size * 2;
|
||||
}
|
||||
if (oldSize != self.size) {
|
||||
if (oldSize) {
|
||||
self.buffer = ArrayBuffer.transfer(self.buffer, self.size);
|
||||
}
|
||||
|
||||
@@ -80,10 +81,10 @@
|
||||
self.total = offset + len;
|
||||
}
|
||||
|
||||
let memView = new Int8Array(self.memory);
|
||||
let storageView = new Int8Array(self.buffer);
|
||||
let memView = new DataView(self.memory);
|
||||
let storageView = new DataView(self.buffer);
|
||||
for (i = 0; i < len; i++) {
|
||||
storageView[offset+i] = memView[ptr+i];
|
||||
storageView.setInt8(offset+i, memView.getInt8(ptr+i));
|
||||
}
|
||||
return len;
|
||||
}
|
||||
@@ -93,11 +94,11 @@
|
||||
return -1;
|
||||
}
|
||||
|
||||
let memView = new Int8Array(self.memory);
|
||||
let storageView = new Int8Array(self.buffer);
|
||||
let memView = new DataView(self.memory);
|
||||
let storageView = new DataView(self.buffer);
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
memView[ptr+i] = storageView[offset+i];
|
||||
for (var i = 0; i < len; i++) {
|
||||
memView.setInt8(ptr+i, storageView.getInt8(offset+i));
|
||||
}
|
||||
return len;
|
||||
}
|
||||
@@ -105,18 +106,29 @@
|
||||
self.size = function() {
|
||||
return self.total;
|
||||
}
|
||||
|
||||
self.toArr = function() {
|
||||
let result = [];
|
||||
let dataView = new DataView(self.buffer);
|
||||
for (var i = 0; i < self.total; i++) {
|
||||
result.push(dataView.getInt8(i));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
function set_ptr(view, offset, val) {
|
||||
view[offset] = val & 0x000000ff;
|
||||
view[offset+1] = (val & 0x0000ff00) >> 8;
|
||||
view[offset+2] = (val & 0x00ff0000) >> 16;
|
||||
view[offset+3] = (val & 0xff000000) >> 24;
|
||||
}
|
||||
// function set_ptr(view, offset, val) {
|
||||
// console.log("set_ptr: " + JSON.stringify(arguments));
|
||||
|
||||
function get_ptr(view, offset) {
|
||||
return view[offset] + (view[offset] << 8) + (view[offset] << 16) + (view[offset] << 24);
|
||||
}
|
||||
// view[offset] = val & 0x000000ff;
|
||||
// view[offset+1] = (val & 0x0000ff00) >> 8;
|
||||
// view[offset+2] = (val & 0x00ff0000) >> 16;
|
||||
// view[offset+3] = (val & 0xff000000) >> 24;
|
||||
// }
|
||||
|
||||
// function get_ptr(view, offset) {
|
||||
// return view[offset] + (view[offset] << 8) + (view[offset] << 16) + (view[offset] << 24);
|
||||
// }
|
||||
|
||||
function Runtime() {
|
||||
var self = this;
|
||||
@@ -129,29 +141,36 @@
|
||||
}
|
||||
|
||||
self.call = function(instance, args) {
|
||||
console.log("call: " + JSON.stringify(args));
|
||||
|
||||
let alloc = self.resolveAlloc(instance);
|
||||
// call descriptor size
|
||||
let ptr = alloc(16);
|
||||
let arg_ptr = alloc(args.length);
|
||||
let memView = new Int8Array(self.memory);
|
||||
set_ptr(memView, 0, args.length);
|
||||
set_ptr(memView, 4, arg_ptr);
|
||||
set_ptr(memView, 8, 0);
|
||||
set_ptr(memView, 12, 0);
|
||||
|
||||
console.log("call allocs: " + JSON.stringify([ptr, arg_ptr]));
|
||||
|
||||
let dataView = new DataView(self.memory.buffer);
|
||||
dataView.setInt32(ptr, arg_ptr, true);
|
||||
dataView.setInt32(ptr+4, args.length, true);
|
||||
|
||||
for (var i = 0; i < args.length; i++) {
|
||||
memView[arg_ptr+i] = args[i];
|
||||
dataView.setInt8(arg_ptr+i, args[i], false);
|
||||
}
|
||||
|
||||
debugger;
|
||||
|
||||
instance.exports._call(ptr);
|
||||
|
||||
let result_length = get_ptr(memView, 8);
|
||||
let result_ptr = get_ptr(memView, 12);
|
||||
let result_ptr = dataView.getInt32(ptr+8, true);
|
||||
let result_length = dataView.getInt32(ptr+12, true);
|
||||
|
||||
console.log("result: " + JSON.stringify([result_ptr, result_length]));
|
||||
|
||||
let result = [];
|
||||
if (result_ptr != 0) {
|
||||
for (var i = 0; i < result_length; i++) {
|
||||
result.push(memVew[result_ptr + i]);
|
||||
result.push(dataView.getInt8(result_ptr + i));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
@@ -222,12 +241,28 @@
|
||||
});
|
||||
}
|
||||
|
||||
function strToArray(str) {
|
||||
var src = str.trim().substr(1, str.length-2);
|
||||
if (src.length == 0) {
|
||||
return [];
|
||||
} else {
|
||||
return src.split(",").map(p => Number(p.trim()));
|
||||
}
|
||||
}
|
||||
|
||||
function arrayToStr(arr) {
|
||||
return "[" + arr.join(", ") + "]";
|
||||
}
|
||||
|
||||
loadWebAssembly('out/contract.wasm')
|
||||
.then(instance => {
|
||||
var button = document.getElementById('do-call');
|
||||
button.value = 'Execute call';
|
||||
button.addEventListener('click', function() {
|
||||
runtime.call(instance, []);
|
||||
let args = strToArray(document.getElementById("context").value);
|
||||
let result = runtime.call(instance, args);
|
||||
document.getElementById("result").value = arrayToStr(result);
|
||||
document.getElementById("storage").value = arrayToStr(runtime.storage.toArr());
|
||||
console.log("Call succeded");
|
||||
}, false);
|
||||
}
|
||||
|
||||
+10
-8
@@ -70,9 +70,9 @@ fn read_u32(slc: &[u8]) -> u32 {
|
||||
|
||||
fn write_u32(dst: &mut [u8], val: u32) {
|
||||
dst[0] = (val & 0x000000ff) as u8;
|
||||
dst[1] = (val & 0x0000ff00 >> 8) as u8;
|
||||
dst[2] = (val & 0x00ff0000 >> 16) as u8;
|
||||
dst[3] = (val & 0xff000000 >> 24) as u8;
|
||||
dst[1] = ((val & 0x0000ff00) >> 8) as u8;
|
||||
dst[2] = ((val & 0x00ff0000) >> 16) as u8;
|
||||
dst[3] = ((val & 0xff000000) >> 24) as u8;
|
||||
}
|
||||
|
||||
fn write_ptr(dst: &mut [u8], ptr: *mut u8) {
|
||||
@@ -105,7 +105,7 @@ impl CallArgs {
|
||||
}
|
||||
|
||||
pub fn save(self, ptr: *mut u8) {
|
||||
let dst = unsafe { slice::from_raw_parts_mut(ptr, 6 * 4) };
|
||||
let dst = unsafe { slice::from_raw_parts_mut(ptr.offset(8), 2 * 4) };
|
||||
let context = self.context;
|
||||
let mut result = self.result;
|
||||
|
||||
@@ -114,8 +114,8 @@ impl CallArgs {
|
||||
|
||||
if result.len() > 0 {
|
||||
// result
|
||||
write_ptr(dst, result.as_mut_ptr());
|
||||
write_u32(dst, result.len() as u32);
|
||||
write_ptr(&mut dst[0..4], result.as_mut_ptr());
|
||||
write_u32(&mut dst[4..8], result.len() as u32);
|
||||
// managed in calling code
|
||||
std::mem::forget(result);
|
||||
}
|
||||
@@ -125,6 +125,8 @@ impl CallArgs {
|
||||
#[no_mangle]
|
||||
pub fn call(descriptor: *mut u8) {
|
||||
let mut ctx = CallArgs::from_raw(descriptor);
|
||||
let _ = storage::append(ctx.context());
|
||||
*ctx.result_mut() = ctx.context().to_vec();
|
||||
let data = ctx.context().to_vec();
|
||||
let _ = storage::append(&data);
|
||||
*ctx.result_mut() = data;
|
||||
ctx.save(descriptor);
|
||||
}
|
||||
Reference in New Issue
Block a user