diff options
author | Alex Beregszaszi <alex@rtfs.hu> | 2017-11-30 04:02:32 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-30 04:02:32 +0800 |
commit | 07591478dd78dee56c5b83a62a314e984c3a83a6 (patch) | |
tree | 0cfaaea815595dac131aebc27e616e8f786b0da5 /libsolidity/codegen/CompilerUtils.cpp | |
parent | aebf72c2c5315674af18e6016b6c85ce0e63fb31 (diff) | |
parent | 9d8e3ff395006c0c6285f70c13bd470e9374bda3 (diff) | |
download | dexon-solidity-07591478dd78dee56c5b83a62a314e984c3a83a6.tar dexon-solidity-07591478dd78dee56c5b83a62a314e984c3a83a6.tar.gz dexon-solidity-07591478dd78dee56c5b83a62a314e984c3a83a6.tar.bz2 dexon-solidity-07591478dd78dee56c5b83a62a314e984c3a83a6.tar.lz dexon-solidity-07591478dd78dee56c5b83a62a314e984c3a83a6.tar.xz dexon-solidity-07591478dd78dee56c5b83a62a314e984c3a83a6.tar.zst dexon-solidity-07591478dd78dee56c5b83a62a314e984c3a83a6.zip |
Merge pull request #2863 from ethereum/structDecoder
ABI decoder
Diffstat (limited to 'libsolidity/codegen/CompilerUtils.cpp')
-rw-r--r-- | libsolidity/codegen/CompilerUtils.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/libsolidity/codegen/CompilerUtils.cpp b/libsolidity/codegen/CompilerUtils.cpp index 053bed6a..533aca5c 100644 --- a/libsolidity/codegen/CompilerUtils.cpp +++ b/libsolidity/codegen/CompilerUtils.cpp @@ -319,6 +319,23 @@ void CompilerUtils::abiEncodeV2( m_context << ret.tag(); } +void CompilerUtils::abiDecodeV2(TypePointers const& _parameterTypes, bool _fromMemory) +{ + // stack: <source_offset> + auto ret = m_context.pushNewTag(); + m_context << Instruction::SWAP1; + if (_fromMemory) + // TODO pass correct size for the memory case + m_context << (u256(1) << 63); + else + m_context << Instruction::CALLDATASIZE; + m_context << Instruction::SWAP1; + string decoderName = m_context.abiFunctions().tupleDecoder(_parameterTypes, _fromMemory); + m_context.appendJumpTo(m_context.namedTag(decoderName)); + m_context.adjustStackOffset(int(sizeOnStack(_parameterTypes)) - 3); + m_context << ret.tag(); +} + void CompilerUtils::zeroInitialiseMemoryArray(ArrayType const& _type) { auto repeat = m_context.newTag(); |