Use new gasEstimate in jsonCompiler

This commit is contained in:
Alex Beregszaszi 2017-04-10 14:52:05 +01:00
parent e6221108b6
commit d90fd439e2

View File

@ -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)