From 01e87cfc0834a3e133f0cd3084ac76f5b2728773 Mon Sep 17 00:00:00 2001 From: chriseth Date: Tue, 22 Jan 2019 13:46:33 +0100 Subject: [PATCH] Refactor struct encoder. --- libsolidity/codegen/ABIFunctions.cpp | 50 +++++++++++++--------------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/libsolidity/codegen/ABIFunctions.cpp b/libsolidity/codegen/ABIFunctions.cpp index c0fa81ce1..9f4e0679d 100644 --- a/libsolidity/codegen/ABIFunctions.cpp +++ b/libsolidity/codegen/ABIFunctions.cpp @@ -904,6 +904,8 @@ string ABIFunctions::abiEncodingFunctionStruct( <#members> { // + + let memberValue := } @@ -932,20 +934,10 @@ string ABIFunctions::abiEncodingFunctionStruct( bool dynamicMember = memberTypeTo->isDynamicallyEncoded(); if (dynamicMember) solAssert(dynamic, ""); - Whiskers memberTempl(R"( - - let memberValue := - )" + ( - dynamicMember ? - string(R"( - mstore(add(pos, ), sub(tail, pos)) - tail := (memberValue, tail) - )") : - string(R"( - (memberValue, add(pos, )) - )") - ) - ); + + members.push_back({}); + members.back()["preprocess"] = ""; + if (fromStorage) { solAssert(memberTypeFrom->isValueType() == memberTypeTo->isValueType(), ""); @@ -956,36 +948,42 @@ string ABIFunctions::abiEncodingFunctionStruct( { if (storageSlotOffset != previousSlotOffset) { - memberTempl("preprocess", "slotValue := sload(add(value, " + toCompactHexWithPrefix(storageSlotOffset) + "))"); + members.back()["preprocess"] = "slotValue := sload(add(value, " + toCompactHexWithPrefix(storageSlotOffset) + "))"; previousSlotOffset = storageSlotOffset; } - else - memberTempl("preprocess", ""); - memberTempl("retrieveValue", shiftRightFunction(intraSlotOffset * 8) + "(slotValue)"); + members.back()["retrieveValue"] = shiftRightFunction(intraSlotOffset * 8) + "(slotValue)"; } else { solAssert(memberTypeFrom->dataStoredIn(DataLocation::Storage), ""); solAssert(intraSlotOffset == 0, ""); - memberTempl("preprocess", ""); - memberTempl("retrieveValue", "add(value, " + toCompactHexWithPrefix(storageSlotOffset) + ")"); + members.back()["retrieveValue"] = "add(value, " + toCompactHexWithPrefix(storageSlotOffset) + ")"; } } else { - memberTempl("preprocess", ""); string sourceOffset = toCompactHexWithPrefix(_from.memoryOffsetOfMember(member.name)); - memberTempl("retrieveValue", "mload(add(value, " + sourceOffset + "))"); + members.back()["retrieveValue"] = "mload(add(value, " + sourceOffset + "))"; } - memberTempl("encodingOffset", toCompactHexWithPrefix(encodingOffset)); + + Whiskers encodeTempl( + dynamicMember ? + string(R"( + mstore(add(pos, ), sub(tail, pos)) + tail := (memberValue, tail) + )") : + string(R"( + (memberValue, add(pos, )) + )") + ); + encodeTempl("encodingOffset", toCompactHexWithPrefix(encodingOffset)); encodingOffset += dynamicMember ? 0x20 : memberTypeTo->calldataEncodedSize(); EncodingOptions subOptions(_options); subOptions.encodeFunctionFromStack = false; - memberTempl("abiEncode", abiEncodingFunction(*memberTypeFrom, *memberTypeTo, subOptions)); + encodeTempl("abiEncode", abiEncodingFunction(*memberTypeFrom, *memberTypeTo, subOptions)); - members.push_back({}); - members.back()["encode"] = memberTempl.render(); + members.back()["encode"] = encodeTempl.render(); members.back()["memberName"] = member.name; } templ("members", members);