From 1c673d1b4ea2579ed622353546b85c9ee1046a7a Mon Sep 17 00:00:00 2001 From: ioedeveloper Date: Thu, 8 Oct 2020 15:02:29 +0100 Subject: [PATCH] Set skip and limit for decode for memory internal --- .../src/solidity-decoder/types/ArrayType.js | 22 ++++++++++++++++--- .../decoder/contracts/structArrayLocal.js | 4 ++++ .../test/decoder/localsTests/structArray.js | 4 +++- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/libs/remix-debug/src/solidity-decoder/types/ArrayType.js b/libs/remix-debug/src/solidity-decoder/types/ArrayType.js index e508032b7c..215200469a 100644 --- a/libs/remix-debug/src/solidity-decoder/types/ArrayType.js +++ b/libs/remix-debug/src/solidity-decoder/types/ArrayType.js @@ -72,7 +72,7 @@ class ArrayType extends RefType { return {value: ret, length: '0x' + size.toString(16), type: this.typeName} } - decodeFromMemoryInternal (offset, memory) { + decodeFromMemoryInternal (offset, memory, skip) { const ret = [] let length = this.arraySize if (this.arraySize === 'dynamic') { @@ -80,12 +80,28 @@ class ArrayType extends RefType { length = parseInt(length, 16) offset = offset + 32 } - for (var k = 0; k < length; k++) { + if (isNaN(length)) { + return { + value: '', + type: this.typeName + } + } + let limit = length + if (!skip) skip = 0 + if (skip) offset = offset + (32 * skip) + if ((length - skip) > 500) limit = 500 + for (var k = 0; k < limit; k++) { var contentOffset = offset ret.push(this.underlyingType.decodeFromMemory(contentOffset, memory)) offset += 32 } - return {value: ret, length: '0x' + length.toString(16), type: this.typeName} + return { + value: ret, + length: '0x' + length.toString(16), + type: this.typeName, + cursor: skip + limit, + hasNext: length > (skip + limit) + } } } diff --git a/libs/remix-debug/test/decoder/contracts/structArrayLocal.js b/libs/remix-debug/test/decoder/contracts/structArrayLocal.js index c8391005d8..48e695a5f5 100644 --- a/libs/remix-debug/test/decoder/contracts/structArrayLocal.js +++ b/libs/remix-debug/test/decoder/contracts/structArrayLocal.js @@ -79,6 +79,10 @@ contract structArrayLocal { arrayStruct.b[1] = -23; arrayStruct.b[2] = -3; arrayStruct.c = enumdef.three; + bytes32[] memory dynamic = new bytes32[](2); + + dynamic[0] = 0x7465737400000000000000000000000000000000000000000000000000000000; + dynamic[1] = 0x7465737400000000000000000000000000000000000000000000000000000000; } } `} diff --git a/libs/remix-debug/test/decoder/localsTests/structArray.js b/libs/remix-debug/test/decoder/localsTests/structArray.js index 35a0f4cf50..8b5b5d99bf 100644 --- a/libs/remix-debug/test/decoder/localsTests/structArray.js +++ b/libs/remix-debug/test/decoder/localsTests/structArray.js @@ -30,7 +30,7 @@ module.exports = function (st, vm, privateKey, contractBytecode, compilationResu st.fail(error) }) callTree.event.register('callTreeReady', (scopes, scopeStarts) => { - helper.decodeLocals(st, 1622, traceManager, callTree, function (locals) { + helper.decodeLocals(st, 1719, traceManager, callTree, function (locals) { try { st.equals(locals['bytesSimple'].length, '0x14') st.equals(locals['bytesSimple'].value, '0x746573745f7375706572') @@ -91,6 +91,8 @@ module.exports = function (st, vm, privateKey, contractBytecode, compilationResu st.equals(locals['arrayStruct'].value.b.value[1].value, '-23') st.equals(locals['arrayStruct'].value.b.value[2].value, '-3') st.equals(locals['arrayStruct'].value.c.value, 'three') + st.equals(locals['dynamic'].value[0], '0x74657374') + st.equals(locals['dynamic'].value[1], '0x74657374') st.equals(Object.keys(locals).length, 8) } catch (e) {