aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchriseth <c@ethdev.com>2016-03-03 23:56:22 +0800
committerchriseth <c@ethdev.com>2016-03-03 23:57:23 +0800
commit05d30fc7cf58ef57238295559aac709338e3c4ea (patch)
treebae666e3d399f3fe60e6524846807e1c52eb73cb
parent96ea3c63f3edc6058d74cfa77828e900c9e9cb6d (diff)
downloaddexon-solidity-05d30fc7cf58ef57238295559aac709338e3c4ea.tar.gz
dexon-solidity-05d30fc7cf58ef57238295559aac709338e3c4ea.tar.zst
dexon-solidity-05d30fc7cf58ef57238295559aac709338e3c4ea.zip
Add delegatecall to the optimizer.
-rw-r--r--GasMeter.cpp12
-rw-r--r--SemanticInformation.cpp3
2 files changed, 11 insertions, 4 deletions
diff --git a/GasMeter.cpp b/GasMeter.cpp
index b792f04d..93583169 100644
--- a/GasMeter.cpp
+++ b/GasMeter.cpp
@@ -126,18 +126,22 @@ GasMeter::GasConsumption GasMeter::estimateMax(AssemblyItem const& _item)
}
case Instruction::CALL:
case Instruction::CALLCODE:
+ case Instruction::DELEGATECALL:
+ {
gas = m_schedule.callGas;
if (u256 const* value = classes.knownConstant(m_state->relativeStackElement(0)))
gas += (*value);
else
gas = GasConsumption::infinite();
- if (_item.instruction() != Instruction::CALLCODE)
+ if (_item.instruction() == Instruction::CALL)
gas += m_schedule.callNewAccountGas; // We very rarely know whether the address exists.
- if (!classes.knownZero(m_state->relativeStackElement(-2)))
+ int valueSize = _item.instruction() == Instruction::DELEGATECALL ? 0 : 1;
+ if (!classes.knownZero(m_state->relativeStackElement(-1 - valueSize)))
gas += m_schedule.callValueTransferGas;
- gas += memoryGas(-3, -4);
- gas += memoryGas(-5, -6);
+ gas += memoryGas(-2 - valueSize, -3 - valueSize);
+ gas += memoryGas(-4 - valueSize, -5 - valueSize);
break;
+ }
case Instruction::CREATE:
gas = m_schedule.createGas;
gas += memoryGas(-1, -2);
diff --git a/SemanticInformation.cpp b/SemanticInformation.cpp
index 309bbe2b..ea579b83 100644
--- a/SemanticInformation.cpp
+++ b/SemanticInformation.cpp
@@ -134,6 +134,7 @@ bool SemanticInformation::isDeterministic(AssemblyItem const& _item)
{
case Instruction::CALL:
case Instruction::CALLCODE:
+ case Instruction::DELEGATECALL:
case Instruction::CREATE:
case Instruction::GAS:
case Instruction::PC:
@@ -157,6 +158,7 @@ bool SemanticInformation::invalidatesMemory(Instruction _instruction)
case Instruction::MSTORE8:
case Instruction::CALL:
case Instruction::CALLCODE:
+ case Instruction::DELEGATECALL:
return true;
default:
return false;
@@ -169,6 +171,7 @@ bool SemanticInformation::invalidatesStorage(Instruction _instruction)
{
case Instruction::CALL:
case Instruction::CALLCODE:
+ case Instruction::DELEGATECALL:
case Instruction::CREATE:
case Instruction::SSTORE:
return true;