aboutsummaryrefslogtreecommitdiffstats
path: root/libevmasm/GasMeter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libevmasm/GasMeter.cpp')
-rw-r--r--libevmasm/GasMeter.cpp48
1 files changed, 28 insertions, 20 deletions
diff --git a/libevmasm/GasMeter.cpp b/libevmasm/GasMeter.cpp
index 51dc34f4..da8b41e3 100644
--- a/libevmasm/GasMeter.cpp
+++ b/libevmasm/GasMeter.cpp
@@ -39,7 +39,7 @@ GasMeter::GasConsumption& GasMeter::GasConsumption::operator+=(GasConsumption co
return *this;
}
-GasMeter::GasConsumption GasMeter::estimateMax(AssemblyItem const& _item)
+GasMeter::GasConsumption GasMeter::estimateMax(AssemblyItem const& _item, bool _includeExternalCosts)
{
GasConsumption gas;
switch (_item.type())
@@ -128,28 +128,36 @@ GasMeter::GasConsumption GasMeter::estimateMax(AssemblyItem const& _item)
case Instruction::CALLCODE:
case Instruction::DELEGATECALL:
{
-// We assume that we do not know the target contract and thus, the consumption is infinite.
- gas = GasConsumption::infinite();
-// gas = GasCosts::callGas;
-// if (u256 const* value = classes.knownConstant(m_state->relativeStackElement(0)))
-// gas += (*value);
-// else
-// gas = GasConsumption::infinite();
-// if (_item.instruction() == Instruction::CALL)
-// gas += GasCosts::callNewAccountGas; // We very rarely know whether the address exists.
-// int valueSize = _item.instruction() == Instruction::DELEGATECALL ? 0 : 1;
-// if (!classes.knownZero(m_state->relativeStackElement(-1 - valueSize)))
-// gas += GasCosts::callValueTransferGas;
-// gas += memoryGas(-2 - valueSize, -3 - valueSize);
-// gas += memoryGas(-4 - valueSize, -5 - valueSize);
+ if (_includeExternalCosts)
+ // We assume that we do not know the target contract and thus, the consumption is infinite.
+ gas = GasConsumption::infinite();
+ else
+ {
+ gas = GasCosts::callGas;
+ if (u256 const* value = classes.knownConstant(m_state->relativeStackElement(0)))
+ gas += (*value);
+ else
+ gas = GasConsumption::infinite();
+ if (_item.instruction() == Instruction::CALL)
+ gas += GasCosts::callNewAccountGas; // We very rarely know whether the address exists.
+ int valueSize = _item.instruction() == Instruction::DELEGATECALL ? 0 : 1;
+ if (!classes.knownZero(m_state->relativeStackElement(-1 - valueSize)))
+ gas += GasCosts::callValueTransferGas;
+ gas += memoryGas(-2 - valueSize, -3 - valueSize);
+ gas += memoryGas(-4 - valueSize, -5 - valueSize);
+ }
break;
}
case Instruction::CREATE:
-// We assume that we do not know the target contract and thus, the consumption is infinite.
-// gas = GasConsumption::infinite();
-// gas = GasCosts::createGas;
-// gas += memoryGas(-1, -2);
-// break;
+ if (_includeExternalCosts)
+ // We assume that we do not know the target contract and thus, the consumption is infinite.
+ gas = GasConsumption::infinite();
+ else
+ {
+ gas = GasCosts::createGas;
+ gas += memoryGas(-1, -2);
+ }
+ break;
case Instruction::EXP:
gas = GasCosts::expGas;
if (u256 const* value = classes.knownConstant(m_state->relativeStackElement(-1)))