Browse Source

Merge pull request #1685 from chriseth/sol_fix_ripemd_alignment

Fixed byte alignment for return type of ripemd160 built-in contract.
cl-refactor
Gav Wood 10 years ago
parent
commit
85c52a20e2
  1. 8
      libsolidity/ExpressionCompiler.cpp
  2. 4
      test/libsolidity/SolidityEndToEndTest.cpp

8
libsolidity/ExpressionCompiler.cpp

@ -1075,7 +1075,13 @@ void ExpressionCompiler::appendExternalFunctionCall(FunctionType const& _functio
m_context << eth::Instruction::POP;
m_context << eth::Instruction::POP; // pop contract address
if (firstType)
if (_functionType.getLocation() == FunctionType::Location::RIPEMD160)
{
// fix: built-in contract returns right-aligned data
CompilerUtils(m_context).loadFromMemory(0, IntegerType(160), false, true);
appendTypeConversion(IntegerType(160), FixedBytesType(20));
}
else if (firstType)
CompilerUtils(m_context).loadFromMemory(0, *firstType, false, true);
}

4
test/libsolidity/SolidityEndToEndTest.cpp

@ -1476,7 +1476,7 @@ BOOST_AUTO_TEST_CASE(ripemd)
{
h256 ret;
dev::ripemd160(dev::ref(toBigEndian(_input)), bytesRef(&ret[0], 32));
return u256(ret) >> (256 - 160);
return u256(ret);
};
testSolidityAgainstCpp("a(bytes32)", f, u256(4));
testSolidityAgainstCpp("a(bytes32)", f, u256(5));
@ -1791,7 +1791,7 @@ BOOST_AUTO_TEST_CASE(gas_for_builtin)
)";
compileAndRun(sourceCode);
BOOST_CHECK(callContractFunction("test(uint256)", 500) == bytes());
BOOST_CHECK(callContractFunction("test(uint256)", 800) == encodeArgs(u256("0x8eb208f7e05d987a9b044a8e98c6b087f15a0bfc"), true));
BOOST_CHECK(callContractFunction("test(uint256)", 800) == encodeArgs(u256("0x8eb208f7e05d987a9b044a8e98c6b087f15a0bfc000000000000000000000000"), true));
}
BOOST_AUTO_TEST_CASE(value_complex)

Loading…
Cancel
Save