diff options
author | Alex Beregszaszi <alex@rtfs.hu> | 2018-11-15 05:14:55 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-15 05:14:55 +0800 |
commit | 92ebf6606764748229acf07e83dbe3824bde540e (patch) | |
tree | bcf6fb14845fe9ec20a5eccc5a29177896d54219 /libsolidity/codegen/CompilerUtils.cpp | |
parent | f8b36fdf66d0eb83070189f07eb47f3ed21a099e (diff) | |
parent | 727e3f24bc57b9470b7972fe882d60117625afe5 (diff) | |
download | dexon-solidity-92ebf6606764748229acf07e83dbe3824bde540e.tar dexon-solidity-92ebf6606764748229acf07e83dbe3824bde540e.tar.gz dexon-solidity-92ebf6606764748229acf07e83dbe3824bde540e.tar.bz2 dexon-solidity-92ebf6606764748229acf07e83dbe3824bde540e.tar.lz dexon-solidity-92ebf6606764748229acf07e83dbe3824bde540e.tar.xz dexon-solidity-92ebf6606764748229acf07e83dbe3824bde540e.tar.zst dexon-solidity-92ebf6606764748229acf07e83dbe3824bde540e.zip |
Merge pull request #5368 from ethereum/noCleanupUnsigned
[Codegen] Do not perform cleanup on unsigned integers when loading from calldata.
Diffstat (limited to 'libsolidity/codegen/CompilerUtils.cpp')
-rw-r--r-- | libsolidity/codegen/CompilerUtils.cpp | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/libsolidity/codegen/CompilerUtils.cpp b/libsolidity/codegen/CompilerUtils.cpp index 90eb74fe..a0d11017 100644 --- a/libsolidity/codegen/CompilerUtils.cpp +++ b/libsolidity/codegen/CompilerUtils.cpp @@ -1236,6 +1236,7 @@ unsigned CompilerUtils::loadFromMemoryHelper(Type const& _type, bool _fromCallda } solAssert(numBytes <= 32, "Static memory load of more than 32 bytes requested."); m_context << (_fromCalldata ? Instruction::CALLDATALOAD : Instruction::MLOAD); + bool cleanupNeeded = true; if (isExternalFunctionType) splitExternalFunctionType(true); else if (numBytes != 32) @@ -1245,10 +1246,16 @@ unsigned CompilerUtils::loadFromMemoryHelper(Type const& _type, bool _fromCallda int shiftFactor = (32 - numBytes) * 8; rightShiftNumberOnStack(shiftFactor); if (leftAligned) + { leftShiftNumberOnStack(shiftFactor); + cleanupNeeded = false; + } + else if (IntegerType const* intType = dynamic_cast<IntegerType const*>(&_type)) + if (!intType->isSigned()) + cleanupNeeded = false; } if (_fromCalldata) - convertType(_type, _type, true, false, true); + convertType(_type, _type, cleanupNeeded, false, true); return numBytes; } |