aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libsolidity/interface/CompilerStack.cpp6
-rw-r--r--solc/CommandLineInterface.cpp25
-rw-r--r--solc/jsonCompiler.cpp29
3 files changed, 33 insertions, 27 deletions
diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp
index ea648709..92b49cda 100644
--- a/libsolidity/interface/CompilerStack.cpp
+++ b/libsolidity/interface/CompilerStack.cpp
@@ -848,10 +848,10 @@ namespace
Json::Value gasToJson(GasEstimator::GasConsumption const& _gas)
{
- if (_gas.isInfinite || _gas.value > std::numeric_limits<Json::LargestUInt>::max())
- return Json::Value(Json::nullValue);
+ if (_gas.isInfinite)
+ return Json::Value("infinite");
else
- return Json::Value(Json::LargestUInt(_gas.value));
+ return Json::Value(toString(_gas.value));
}
}
diff --git a/solc/CommandLineInterface.cpp b/solc/CommandLineInterface.cpp
index 90cc4769..947a2004 100644
--- a/solc/CommandLineInterface.cpp
+++ b/solc/CommandLineInterface.cpp
@@ -322,18 +322,9 @@ void CommandLineInterface::handleGasEstimation(string const& _contract)
{
Json::Value creation = estimates["creation"];
cout << "construction:" << endl;
- if (creation["executionCost"].isNull())
- cout << " infinite";
- else
- cout << " " << creation["executionCost"];
- if (creation["codeDepositCost"].isNull())
- cout << " + infinite";
- else
- cout << " + " << creation["codeDepositCost"];
- if (creation["totalCost"].isNull())
- cout << " = infinite";
- else
- cout << " = " << creation["totalCost"] << endl;
+ cout << " " << creation["executionCost"].asString();
+ cout << " + " << creation["codeDepositCost"].asString();
+ cout << " = " << creation["totalCost"].asString() << endl;
}
if (estimates["external"].isObject())
@@ -346,10 +337,7 @@ void CommandLineInterface::handleGasEstimation(string const& _contract)
cout << " fallback:\t";
else
cout << " " << name << ":\t";
- if (externalFunctions[name].isNull())
- cout << "infinite" << endl;
- else
- cout << externalFunctions[name] << endl;
+ cout << externalFunctions[name].asString() << endl;
}
}
@@ -360,10 +348,7 @@ void CommandLineInterface::handleGasEstimation(string const& _contract)
for (auto const& name: internalFunctions.getMemberNames())
{
cout << " " << name << ":\t";
- if (internalFunctions[name].isNull())
- cout << "infinite" << endl;
- else
- cout << internalFunctions[name] << endl;
+ cout << internalFunctions[name].asString() << endl;
}
}
}
diff --git a/solc/jsonCompiler.cpp b/solc/jsonCompiler.cpp
index accbc13c..fd375ce3 100644
--- a/solc/jsonCompiler.cpp
+++ b/solc/jsonCompiler.cpp
@@ -58,6 +58,27 @@ Json::Value functionHashes(ContractDefinition const& _contract)
return functionHashes;
}
+/// Translates a gas value as a string to a JSON number or null
+Json::Value gasToJson(Json::Value const& _value)
+{
+ if (_value.isObject())
+ {
+ Json::Value ret = Json::objectValue;
+ for (auto const& sig: _value.getMemberNames())
+ ret[sig] = gasToJson(_value[sig]);
+ return ret;
+ }
+
+ if (_value == "infinite")
+ return Json::Value(Json::nullValue);
+
+ u256 value(_value.asString());
+ if (value > std::numeric_limits<Json::LargestUInt>::max())
+ return Json::Value(Json::nullValue);
+ else
+ return Json::Value(Json::LargestUInt(value));
+}
+
Json::Value estimateGas(CompilerStack const& _compiler, string const& _contract)
{
Json::Value estimates = _compiler.gasEstimates(_contract);
@@ -66,14 +87,14 @@ Json::Value estimateGas(CompilerStack const& _compiler, string const& _contract)
if (estimates["creation"].isObject())
{
Json::Value creation(Json::arrayValue);
- creation[0] = estimates["creation"]["executionCost"];
- creation[1] = estimates["creation"]["codeDepositCost"];
+ creation[0] = gasToJson(estimates["creation"]["executionCost"]);
+ creation[1] = gasToJson(estimates["creation"]["codeDepositCost"]);
output["creation"] = creation;
}
else
output["creation"] = Json::objectValue;
- output["external"] = estimates.get("external", Json::objectValue);
- output["internal"] = estimates.get("internal", Json::objectValue);
+ output["external"] = gasToJson(estimates.get("external", Json::objectValue));
+ output["internal"] = gasToJson(estimates.get("internal", Json::objectValue));
return output;
}