Skip to content

Commit

Permalink
Use new gasEstimate in jsonCompiler
Browse files Browse the repository at this point in the history
  • Loading branch information
axic committed Apr 13, 2017
1 parent e622110 commit d90fd43
Showing 1 changed file with 12 additions and 51 deletions.
63 changes: 12 additions & 51 deletions solc/jsonCompiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,61 +58,22 @@ Json::Value functionHashes(ContractDefinition const& _contract)
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 gasEstimates(Json::objectValue);
using Gas = GasEstimator::GasConsumption;
if (!_compiler.assemblyItems(_contract) && !_compiler.runtimeAssemblyItems(_contract))
return gasEstimates;
if (eth::AssemblyItems const* items = _compiler.assemblyItems(_contract))
{
Gas gas = GasEstimator::functionalEstimation(*items);
u256 bytecodeSize(_compiler.runtimeObject(_contract).bytecode.size());
Json::Value creationGas(Json::arrayValue);
creationGas[0] = gasToJson(gas);
creationGas[1] = gasToJson(bytecodeSize * eth::GasCosts::createDataGas);
gasEstimates["creation"] = creationGas;
}
if (eth::AssemblyItems const* items = _compiler.runtimeAssemblyItems(_contract))
Json::Value estimates = _compiler.gasEstimates(_contract);
Json::Value output(Json::objectValue);

if (estimates["creation"].isObject())
{
ContractDefinition const& contract = _compiler.contractDefinition(_contract);
Json::Value externalFunctions(Json::objectValue);
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;
Json::Value creation(Json::arrayValue);
creation[0] = estimates["creation"]["executionCost"];
creation[1] = estimates["creation"]["codeDepositCost"];
output["creation"] = creation;
}
return gasEstimates;
output["external"] = estimates["external"];
output["internal"] = estimates["internal"];

return output;
}

string compile(StringMap const& _sources, bool _optimize, CStyleReadFileCallback _readCallback)
Expand Down

0 comments on commit d90fd43

Please sign in to comment.