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: Fix error messages for imported files that do not exist.
|
||||||
* Commandline interface: Support ``--evm-version constantinople`` properly.
|
* Commandline interface: Support ``--evm-version constantinople`` properly.
|
||||||
* DocString Parser: Fix error message for empty descriptions.
|
* 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.
|
* Standard JSON: Support ``constantinople`` as ``evmVersion`` properly.
|
||||||
* Type Checker: Fix detection of recursive structs.
|
* Type Checker: Fix detection of recursive structs.
|
||||||
* Type Checker: Fix asymmetry bug when comparing with literal numbers.
|
* Type Checker: Fix asymmetry bug when comparing with literal numbers.
|
||||||
|
@ -136,12 +136,19 @@ GasEstimator::GasConsumption GasEstimator::functionalEstimation(
|
|||||||
ExpressionClasses& classes = state->expressionClasses();
|
ExpressionClasses& classes = state->expressionClasses();
|
||||||
using Id = ExpressionClasses::Id;
|
using Id = ExpressionClasses::Id;
|
||||||
using Ids = vector<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 hashValue = classes.find(u256(FixedHash<4>::Arith(FixedHash<4>(dev::keccak256(_signature)))));
|
||||||
Id calldata = classes.find(Instruction::CALLDATALOAD, Ids{classes.find(u256(0))});
|
Id calldata = classes.find(Instruction::CALLDATALOAD, Ids{classes.find(u256(0))});
|
||||||
classes.forceEqual(hashValue, Instruction::DIV, Ids{
|
classes.forceEqual(hashValue, Instruction::DIV, Ids{
|
||||||
calldata,
|
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);
|
PathGasMeter meter(_items, m_evmVersion);
|
||||||
|
@ -294,6 +294,19 @@ BOOST_AUTO_TEST_CASE(extcodesize_gas)
|
|||||||
testRunTimeGas("f()", vector<bytes>{encodeArgs()});
|
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()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user