mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #3863 from ethereum/fixGasEstimation
Correctly ignore costs of fallback for other functions.
This commit is contained in:
commit
ae3fca6db2
@ -29,6 +29,7 @@ Bugfixes:
|
||||
* Commandline interface: Fix error messages for imported files that do not exist.
|
||||
* Commandline interface: Support ``--evm-version constantinople`` properly.
|
||||
* DocString Parser: Fix error message for empty descriptions.
|
||||
* Gas Estimator: Correctly ignore costs of fallback function for other functions.
|
||||
* Standard JSON: Support ``constantinople`` as ``evmVersion`` properly.
|
||||
* Type Checker: Fix detection of recursive structs.
|
||||
* Type Checker: Fix asymmetry bug when comparing with literal numbers.
|
||||
|
@ -136,12 +136,19 @@ GasEstimator::GasConsumption GasEstimator::functionalEstimation(
|
||||
ExpressionClasses& classes = state->expressionClasses();
|
||||
using Id = ExpressionClasses::Id;
|
||||
using Ids = vector<Id>;
|
||||
// div(calldataload(0), 1 << 224) equals to hashValue
|
||||
Id hashValue = classes.find(u256(FixedHash<4>::Arith(FixedHash<4>(dev::keccak256(_signature)))));
|
||||
Id calldata = classes.find(Instruction::CALLDATALOAD, Ids{classes.find(u256(0))});
|
||||
classes.forceEqual(hashValue, Instruction::DIV, Ids{
|
||||
calldata,
|
||||
classes.find(u256(1) << (8 * 28))
|
||||
classes.find(u256(1) << 224)
|
||||
});
|
||||
// lt(calldatasize(), 4) equals to 0 (ignore the shortcut for fallback functions)
|
||||
classes.forceEqual(
|
||||
classes.find(u256(0)),
|
||||
Instruction::LT,
|
||||
Ids{classes.find(Instruction::CALLDATASIZE), classes.find(u256(4))}
|
||||
);
|
||||
}
|
||||
|
||||
PathGasMeter meter(_items, m_evmVersion);
|
||||
|
@ -294,6 +294,19 @@ BOOST_AUTO_TEST_CASE(extcodesize_gas)
|
||||
testRunTimeGas("f()", vector<bytes>{encodeArgs()});
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(regular_functions_exclude_fallback)
|
||||
{
|
||||
// A bug in the estimator caused the costs for a specific function
|
||||
// to always include the costs for the fallback.
|
||||
char const* sourceCode = R"(
|
||||
contract A {
|
||||
uint public x;
|
||||
function() { x = 2; }
|
||||
}
|
||||
)";
|
||||
testCreationTimeGas(sourceCode);
|
||||
testRunTimeGas("x()", vector<bytes>{encodeArgs()});
|
||||
}
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user