aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity
diff options
context:
space:
mode:
Diffstat (limited to 'libsolidity')
-rw-r--r--libsolidity/codegen/CompilerUtils.cpp32
-rw-r--r--libsolidity/codegen/CompilerUtils.h8
2 files changed, 40 insertions, 0 deletions
diff --git a/libsolidity/codegen/CompilerUtils.cpp b/libsolidity/codegen/CompilerUtils.cpp
index 782aad9d..d2dab7d7 100644
--- a/libsolidity/codegen/CompilerUtils.cpp
+++ b/libsolidity/codegen/CompilerUtils.cpp
@@ -25,6 +25,7 @@
#include <libevmasm/Instruction.h>
#include <libsolidity/codegen/ArrayUtils.h>
#include <libsolidity/codegen/LValue.h>
+#include <libsolidity/codegen/ABIFunctions.h>
using namespace std;
@@ -180,8 +181,17 @@ void CompilerUtils::encodeToMemory(
t = t->mobileType()->interfaceType(_encodeAsLibraryTypes)->encodingType();
}
+ bool activateNewEncoder = false;
if (_givenTypes.empty())
return;
+ else if (activateNewEncoder && _padToWordBoundaries && !_copyDynamicDataInPlace)
+ {
+ // Use the new JULIA-based encoding function
+ auto stackHeightBefore = m_context.stackHeight();
+ abiEncode(_givenTypes, targetTypes, _encodeAsLibraryTypes);
+ solAssert(stackHeightBefore - m_context.stackHeight() == sizeOnStack(_givenTypes), "");
+ return;
+ }
// Stack during operation:
// <v1> <v2> ... <vn> <mem_start> <dyn_head_1> ... <dyn_head_r> <end_of_mem>
@@ -289,6 +299,28 @@ void CompilerUtils::encodeToMemory(
popStackSlots(argSize + dynPointers + 1);
}
+void CompilerUtils::abiEncode(
+ TypePointers const& _givenTypes,
+ TypePointers const& _targetTypes,
+ bool _encodeAsLibraryTypes
+)
+{
+ // stack: <$value0> <$value1> ... <$value(n-1)> <$headStart>
+
+ vector<string> variables;
+ size_t numValues = sizeOnStack(_givenTypes);
+ for (size_t i = 0; i < numValues; ++i)
+ variables.push_back("$value" + to_string(i));
+ variables.push_back("$headStart");
+
+ ABIFunctions funs;
+ string routine = funs.tupleEncoder(_givenTypes, _targetTypes, _encodeAsLibraryTypes);
+ routine += funs.requestedFunctions();
+ m_context.appendInlineAssembly("{" + routine + "}", variables);
+ // Remove everyhing except for "value0" / the final memory pointer.
+ popStackSlots(numValues);
+}
+
void CompilerUtils::zeroInitialiseMemoryArray(ArrayType const& _type)
{
auto repeat = m_context.newTag();
diff --git a/libsolidity/codegen/CompilerUtils.h b/libsolidity/codegen/CompilerUtils.h
index fb169463..09427788 100644
--- a/libsolidity/codegen/CompilerUtils.h
+++ b/libsolidity/codegen/CompilerUtils.h
@@ -103,6 +103,14 @@ public:
bool _encodeAsLibraryTypes = false
);
+ /// Special case of @a encodeToMemory which assumes that everything is padded to words
+ /// and dynamic data is not copied in place (i.e. a proper ABI encoding).
+ void abiEncode(
+ TypePointers const& _givenTypes,
+ TypePointers const& _targetTypes,
+ bool _encodeAsLibraryTypes = false
+ );
+
/// Zero-initialises (the data part of) an already allocated memory array.
/// Length has to be nonzero!
/// Stack pre: <length> <memptr>