mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Improved gas computation for CALLCODE.
This commit is contained in:
parent
f2f1e03007
commit
ac1a11634e
@ -1072,6 +1072,7 @@ void ExpressionCompiler::appendExternalFunctionCall(
|
|||||||
using FunctionKind = FunctionType::Location;
|
using FunctionKind = FunctionType::Location;
|
||||||
FunctionKind funKind = _functionType.getLocation();
|
FunctionKind funKind = _functionType.getLocation();
|
||||||
bool returnSuccessCondition = funKind == FunctionKind::Bare || funKind == FunctionKind::BareCallCode;
|
bool returnSuccessCondition = funKind == FunctionKind::Bare || funKind == FunctionKind::BareCallCode;
|
||||||
|
bool isCallCode = funKind == FunctionKind::BareCallCode || funKind == FunctionKind::CallCode;
|
||||||
|
|
||||||
//@todo only return the first return value for now
|
//@todo only return the first return value for now
|
||||||
Type const* firstReturnType =
|
Type const* firstReturnType =
|
||||||
@ -1158,13 +1159,20 @@ void ExpressionCompiler::appendExternalFunctionCall(
|
|||||||
if (_functionType.gasSet())
|
if (_functionType.gasSet())
|
||||||
m_context << eth::dupInstruction(m_context.baseToCurrentStackOffset(gasStackPos));
|
m_context << eth::dupInstruction(m_context.baseToCurrentStackOffset(gasStackPos));
|
||||||
else
|
else
|
||||||
|
{
|
||||||
// send all gas except the amount needed to execute "SUB" and "CALL"
|
// send all gas except the amount needed to execute "SUB" and "CALL"
|
||||||
// @todo this retains too much gas for now, needs to be fine-tuned.
|
// @todo this retains too much gas for now, needs to be fine-tuned.
|
||||||
|
u256 gasNeededByCaller = eth::c_callGas + 10;
|
||||||
|
if (_functionType.valueSet())
|
||||||
|
gasNeededByCaller += eth::c_callValueTransferGas;
|
||||||
|
if (!isCallCode)
|
||||||
|
gasNeededByCaller += eth::c_callNewAccountGas; // we never know
|
||||||
m_context <<
|
m_context <<
|
||||||
u256(eth::c_callGas + 10 + (_functionType.valueSet() ? eth::c_callValueTransferGas : 0) + eth::c_callNewAccountGas) <<
|
gasNeededByCaller <<
|
||||||
eth::Instruction::GAS <<
|
eth::Instruction::GAS <<
|
||||||
eth::Instruction::SUB;
|
eth::Instruction::SUB;
|
||||||
if (funKind == FunctionKind::CallCode || funKind == FunctionKind::BareCallCode)
|
}
|
||||||
|
if (isCallCode)
|
||||||
m_context << eth::Instruction::CALLCODE;
|
m_context << eth::Instruction::CALLCODE;
|
||||||
else
|
else
|
||||||
m_context << eth::Instruction::CALL;
|
m_context << eth::Instruction::CALL;
|
||||||
|
Loading…
Reference in New Issue
Block a user