mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Use new gasEstimate in jsonCompiler
This commit is contained in:
parent
e6221108b6
commit
d90fd439e2
@ -58,61 +58,22 @@ Json::Value functionHashes(ContractDefinition const& _contract)
|
|||||||
return functionHashes;
|
return functionHashes;
|
||||||
}
|
}
|
||||||
|
|
||||||
Json::Value gasToJson(GasEstimator::GasConsumption const& _gas)
|
|
||||||
{
|
|
||||||
if (_gas.isInfinite || _gas.value > std::numeric_limits<Json::LargestUInt>::max())
|
|
||||||
return Json::Value(Json::nullValue);
|
|
||||||
else
|
|
||||||
return Json::Value(Json::LargestUInt(_gas.value));
|
|
||||||
}
|
|
||||||
|
|
||||||
Json::Value estimateGas(CompilerStack const& _compiler, string const& _contract)
|
Json::Value estimateGas(CompilerStack const& _compiler, string const& _contract)
|
||||||
{
|
{
|
||||||
Json::Value gasEstimates(Json::objectValue);
|
Json::Value estimates = _compiler.gasEstimates(_contract);
|
||||||
using Gas = GasEstimator::GasConsumption;
|
Json::Value output(Json::objectValue);
|
||||||
if (!_compiler.assemblyItems(_contract) && !_compiler.runtimeAssemblyItems(_contract))
|
|
||||||
return gasEstimates;
|
if (estimates["creation"].isObject())
|
||||||
if (eth::AssemblyItems const* items = _compiler.assemblyItems(_contract))
|
|
||||||
{
|
{
|
||||||
Gas gas = GasEstimator::functionalEstimation(*items);
|
Json::Value creation(Json::arrayValue);
|
||||||
u256 bytecodeSize(_compiler.runtimeObject(_contract).bytecode.size());
|
creation[0] = estimates["creation"]["executionCost"];
|
||||||
Json::Value creationGas(Json::arrayValue);
|
creation[1] = estimates["creation"]["codeDepositCost"];
|
||||||
creationGas[0] = gasToJson(gas);
|
output["creation"] = creation;
|
||||||
creationGas[1] = gasToJson(bytecodeSize * eth::GasCosts::createDataGas);
|
|
||||||
gasEstimates["creation"] = creationGas;
|
|
||||||
}
|
}
|
||||||
if (eth::AssemblyItems const* items = _compiler.runtimeAssemblyItems(_contract))
|
output["external"] = estimates["external"];
|
||||||
{
|
output["internal"] = estimates["internal"];
|
||||||
ContractDefinition const& contract = _compiler.contractDefinition(_contract);
|
|
||||||
Json::Value externalFunctions(Json::objectValue);
|
return output;
|
||||||
for (auto it: contract.interfaceFunctions())
|
|
||||||
{
|
|
||||||
string sig = it.second->externalSignature();
|
|
||||||
externalFunctions[sig] = gasToJson(GasEstimator::functionalEstimation(*items, sig));
|
|
||||||
}
|
|
||||||
if (contract.fallbackFunction())
|
|
||||||
externalFunctions[""] = gasToJson(GasEstimator::functionalEstimation(*items, "INVALID"));
|
|
||||||
gasEstimates["external"] = externalFunctions;
|
|
||||||
Json::Value internalFunctions(Json::objectValue);
|
|
||||||
for (auto const& it: contract.definedFunctions())
|
|
||||||
{
|
|
||||||
if (it->isPartOfExternalInterface() || it->isConstructor())
|
|
||||||
continue;
|
|
||||||
size_t entry = _compiler.functionEntryPoint(_contract, *it);
|
|
||||||
GasEstimator::GasConsumption gas = GasEstimator::GasConsumption::infinite();
|
|
||||||
if (entry > 0)
|
|
||||||
gas = GasEstimator::functionalEstimation(*items, entry, *it);
|
|
||||||
FunctionType type(*it);
|
|
||||||
string sig = it->name() + "(";
|
|
||||||
auto paramTypes = type.parameterTypes();
|
|
||||||
for (auto it = paramTypes.begin(); it != paramTypes.end(); ++it)
|
|
||||||
sig += (*it)->toString() + (it + 1 == paramTypes.end() ? "" : ",");
|
|
||||||
sig += ")";
|
|
||||||
internalFunctions[sig] = gasToJson(gas);
|
|
||||||
}
|
|
||||||
gasEstimates["internal"] = internalFunctions;
|
|
||||||
}
|
|
||||||
return gasEstimates;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
string compile(StringMap const& _sources, bool _optimize, CStyleReadFileCallback _readCallback)
|
string compile(StringMap const& _sources, bool _optimize, CStyleReadFileCallback _readCallback)
|
||||||
|
Loading…
Reference in New Issue
Block a user