diff --git a/runner/index.html b/runner/index.html index 0988de9..d628542 100644 --- a/runner/index.html +++ b/runner/index.html @@ -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); } diff --git a/samples/contract3.rs b/samples/contract3.rs index c409e0d..4e86538 100644 --- a/samples/contract3.rs +++ b/samples/contract3.rs @@ -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); } \ No newline at end of file