diff options
author | chriseth <c@ethdev.com> | 2016-03-03 23:56:22 +0800 |
---|---|---|
committer | chriseth <c@ethdev.com> | 2016-03-03 23:57:23 +0800 |
commit | 05d30fc7cf58ef57238295559aac709338e3c4ea (patch) | |
tree | bae666e3d399f3fe60e6524846807e1c52eb73cb | |
parent | 96ea3c63f3edc6058d74cfa77828e900c9e9cb6d (diff) | |
download | dexon-solidity-05d30fc7cf58ef57238295559aac709338e3c4ea.tar.gz dexon-solidity-05d30fc7cf58ef57238295559aac709338e3c4ea.tar.zst dexon-solidity-05d30fc7cf58ef57238295559aac709338e3c4ea.zip |
Add delegatecall to the optimizer.
-rw-r--r-- | GasMeter.cpp | 12 | ||||
-rw-r--r-- | SemanticInformation.cpp | 3 |
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; |