mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Use multiprecision::msb() in GasMeter and remove FixedHash dependency
This commit is contained in:
parent
3a17ca6331
commit
00f3c42d17
@ -19,8 +19,6 @@
|
||||
|
||||
#include <libevmasm/KnownState.h>
|
||||
|
||||
#include <libsolutil/FixedHash.h>
|
||||
|
||||
using namespace std;
|
||||
using namespace solidity;
|
||||
using namespace solidity::util;
|
||||
@ -182,7 +180,14 @@ GasMeter::GasConsumption GasMeter::estimateMax(AssemblyItem const& _item, bool _
|
||||
case Instruction::EXP:
|
||||
gas = GasCosts::expGas;
|
||||
if (u256 const* value = classes.knownConstant(m_state->relativeStackElement(-1)))
|
||||
gas += GasCosts::expByteGas(m_evmVersion) * (32 - (h256(*value).firstBitSet() / 8));
|
||||
{
|
||||
if (*value)
|
||||
{
|
||||
// Note: msb() counts from 0 and throws on 0 as input.
|
||||
unsigned const significantByteCount = (boost::multiprecision::msb(*value) + 1 + 7) / 8;
|
||||
gas += GasCosts::expByteGas(m_evmVersion) * significantByteCount;
|
||||
}
|
||||
}
|
||||
else
|
||||
gas += GasCosts::expByteGas(m_evmVersion) * 32;
|
||||
break;
|
||||
|
@ -104,22 +104,6 @@ public:
|
||||
/// @returns a copy of the object's data as a byte vector.
|
||||
bytes asBytes() const { return bytes(data(), data() + N); }
|
||||
|
||||
/// Returns the index of the first bit set to one, or size() * 8 if no bits are set.
|
||||
inline unsigned firstBitSet() const
|
||||
{
|
||||
unsigned ret = 0;
|
||||
for (auto d: m_data)
|
||||
if (d)
|
||||
{
|
||||
for (;; ++ret, d <<= 1)
|
||||
if (d & 0x80)
|
||||
return ret;
|
||||
}
|
||||
else
|
||||
ret += 8;
|
||||
return ret;
|
||||
}
|
||||
|
||||
private:
|
||||
std::array<uint8_t, N> m_data; ///< The binary data.
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user