From c8a30f9138c3637ef43578255856c3dbf1d1deae Mon Sep 17 00:00:00 2001 From: NikVolf Date: Tue, 25 Apr 2017 14:35:49 +0300 Subject: [PATCH] fixes with memory, also free --- runner/index.html | 64 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 56 insertions(+), 8 deletions(-) diff --git a/runner/index.html b/runner/index.html index 6206eea..8764c03 100644 --- a/runner/index.html +++ b/runner/index.html @@ -129,6 +129,10 @@ return instance.exports._malloc; } + self.resolveFree = function(instance) { + return instance.exports._free; + } + self.gas = function(val) { self.gasCounter += val; } @@ -138,28 +142,47 @@ // call descriptor size let ptr = alloc(16); - let arg_ptr = alloc(args.length); - 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++) { - dataView.setInt8(arg_ptr+i, args[i], false); + var arg_ptr = false; + if (args.length > 0) { + arg_ptr = alloc(args.length); + dataView.setInt32(ptr, arg_ptr, true); + dataView.setInt32(ptr+4, args.length, true); + + for (var i = 0; i < args.length; i++) { + dataView.setInt8(arg_ptr+i, args[i], false); + } + + } else { + dataView.setInt32(ptr, 0, true); + dataView.setInt32(ptr+4, 0, true); } + // zero result + dataView.setInt32(ptr+8, 0, true); + dataView.setInt32(ptr+12, 0, true); + + self.gasCounter = 0; instance.exports._call(ptr); let result_ptr = dataView.getInt32(ptr+8, true); let result_length = dataView.getInt32(ptr+12, true); + let free = self.resolveFree(instance); + let result = []; if (result_ptr != 0) { for (var i = 0; i < result_length; i++) { result.push(dataView.getInt8(result_ptr + i)); } } + + arg_ptr && (free(arg_ptr)); + result_ptr && (free(result_ptr)); + free(ptr); + return result; } @@ -243,11 +266,13 @@ var button = document.getElementById('do-call'); button.value = 'Execute call'; button.addEventListener('click', function() { + button.setAttribute("disabled", "1"); 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()); document.getElementById("gas").innerHTML = "Gas used: " + runtime.gasCounter + ""; + button.removeAttribute("disabled"); }, false); } ); @@ -255,9 +280,31 @@ +
+ + Full source with preamble +
+
- +
@@ -276,7 +323,8 @@
- + Gas cost: 0 + \ No newline at end of file