From 52ef07695ab665f22a6ae1a85d88197a35bcf086 Mon Sep 17 00:00:00 2001 From: chriseth Date: Thu, 15 Oct 2015 17:12:22 +0200 Subject: [PATCH 1/2] Multiple sources for json compiler. --- solc/jsonCompiler.cpp | 54 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/solc/jsonCompiler.cpp b/solc/jsonCompiler.cpp index 0746fc887..b117325da 100644 --- a/solc/jsonCompiler.cpp +++ b/solc/jsonCompiler.cpp @@ -114,18 +114,16 @@ Json::Value estimateGas(CompilerStack const& _compiler, string const& _contract) return gasEstimates; } -string compile(string _input, bool _optimize) +string compile(StringMap const& _sources, bool _optimize) { - StringMap sources; - sources[""] = _input; - Json::Value output(Json::objectValue); Json::Value errors(Json::arrayValue); CompilerStack compiler; bool success = false; try { - bool succ = compiler.compile(_input, _optimize); + compiler.addSources(_sources); + bool succ = compiler.compile(_optimize); for (auto const& error: compiler.errors()) { auto err = dynamic_pointer_cast(error); @@ -175,18 +173,51 @@ string compile(string _input, bool _optimize) contractData["functionHashes"] = functionHashes(compiler.contractDefinition(contractName)); contractData["gasEstimates"] = estimateGas(compiler, contractName); ostringstream unused; - contractData["assembly"] = compiler.streamAssembly(unused, contractName, sources, true); + contractData["assembly"] = compiler.streamAssembly(unused, contractName, _sources, true); output["contracts"][contractName] = contractData; } output["sources"] = Json::Value(Json::objectValue); - output["sources"][""] = Json::Value(Json::objectValue); - output["sources"][""]["AST"] = ASTJsonConverter(compiler.ast("")).json(); + for (auto const& source: _sources) + { + output["sources"][source.first] = Json::Value(Json::objectValue); + output["sources"][source.first]["AST"] = ASTJsonConverter(compiler.ast(source.first)).json(); + } } return Json::FastWriter().write(output); } +string compileMulti(string const& _input, bool _optimize) +{ + Json::Reader reader; + Json::Value input; + if (!reader.parse(_input, input, false)) + { + Json::Value errors(Json::arrayValue); + errors.append("Error parsing input JSON: " + reader.getFormattedErrorMessages()); + Json::Value output(Json::objectValue); + output["errors"] = errors; + return Json::FastWriter().write(output); + } + else + { + StringMap sources; + Json::Value jsonSources = input["sources"]; + if (jsonSources.isObject()) + for (auto const& sourceName: jsonSources.getMemberNames()) + sources[sourceName] = jsonSources[sourceName].asString(); + return compile(sources, _optimize); + } +} + +string compileSingle(string const& _input, bool _optimize) +{ + StringMap sources; + sources[""] = _input; + return compile(sources, _optimize); +} + static string outputBuffer; extern "C" @@ -197,7 +228,12 @@ extern char const* version() } extern char const* compileJSON(char const* _input, bool _optimize) { - outputBuffer = compile(_input, _optimize); + outputBuffer = compileSingle(_input, _optimize); + return outputBuffer.c_str(); +} +extern char const* compileJSONMulti(char const* _input, bool _optimize) +{ + outputBuffer = compileMulti(_input, _optimize); return outputBuffer.c_str(); } } From cb869fd5a447fc70b8c43f14f234316b0898485c Mon Sep 17 00:00:00 2001 From: chriseth Date: Thu, 15 Oct 2015 18:29:47 +0200 Subject: [PATCH 2/2] Style. --- solc/jsonCompiler.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/solc/jsonCompiler.cpp b/solc/jsonCompiler.cpp index b117325da..1690fadb8 100644 --- a/solc/jsonCompiler.cpp +++ b/solc/jsonCompiler.cpp @@ -218,7 +218,7 @@ string compileSingle(string const& _input, bool _optimize) return compile(sources, _optimize); } -static string outputBuffer; +static string s_outputBuffer; extern "C" { @@ -228,12 +228,12 @@ extern char const* version() } extern char const* compileJSON(char const* _input, bool _optimize) { - outputBuffer = compileSingle(_input, _optimize); - return outputBuffer.c_str(); + s_outputBuffer = compileSingle(_input, _optimize); + return s_outputBuffer.c_str(); } extern char const* compileJSONMulti(char const* _input, bool _optimize) { - outputBuffer = compileMulti(_input, _optimize); - return outputBuffer.c_str(); + s_outputBuffer = compileMulti(_input, _optimize); + return s_outputBuffer.c_str(); } }