From e0ff70778a3de88e25cc4c4f879799d6b73a4a61 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Thu, 16 Mar 2017 23:59:36 +0000 Subject: Rename ErrorMesage to ErrorMessage --- libsolidity/interface/CompilerStack.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'libsolidity/interface/CompilerStack.cpp') diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index 6b0024ad..effc8309 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -527,13 +527,13 @@ StringMap CompilerStack::loadMissingSources(SourceUnit const& _ast, std::string result = m_readFile(importPath); if (result.success) - newSources[importPath] = result.contentsOrErrorMesage; + newSources[importPath] = result.contentsOrErrorMessage; else { auto err = make_shared(Error::Type::ParserError); *err << errinfo_sourceLocation(import->location()) << - errinfo_comment("Source \"" + importPath + "\" not found: " + result.contentsOrErrorMesage); + errinfo_comment("Source \"" + importPath + "\" not found: " + result.contentsOrErrorMessage); m_errors.push_back(std::move(err)); continue; } -- cgit v1.2.3 From 623b8eb107a97861e3e7e0c13acee39c8d5f4075 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Mon, 10 Apr 2017 12:48:41 +0100 Subject: Pull out ReadFile from CompilerStack --- libsolidity/interface/CompilerStack.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'libsolidity/interface/CompilerStack.cpp') diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index effc8309..9ad28573 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -55,7 +55,7 @@ using namespace std; using namespace dev; using namespace dev::solidity; -CompilerStack::CompilerStack(ReadFileCallback const& _readFile): +CompilerStack::CompilerStack(ReadFile::Callback const& _readFile): m_readFile(_readFile), m_parseSuccessful(false) {} void CompilerStack::setRemappings(vector const& _remappings) @@ -522,7 +522,7 @@ StringMap CompilerStack::loadMissingSources(SourceUnit const& _ast, std::string if (m_sources.count(importPath) || newSources.count(importPath)) continue; - ReadFileResult result{false, string("File not supplied initially.")}; + ReadFile::Result result{false, string("File not supplied initially.")}; if (m_readFile) result = m_readFile(importPath); -- cgit v1.2.3 From e6221108b601938d6165cc1a0583d70c30e6e364 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Mon, 10 Apr 2017 14:00:24 +0100 Subject: Move gasEstimate into CompilerStack --- libsolidity/interface/CompilerStack.cpp | 85 +++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) (limited to 'libsolidity/interface/CompilerStack.cpp') diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index 9ad28573..0fddd505 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #include @@ -841,3 +842,87 @@ string CompilerStack::computeSourceMapping(eth::AssemblyItems const& _items) con } return ret; } + +namespace +{ + +Json::Value gasToJson(GasEstimator::GasConsumption const& _gas) +{ + if (_gas.isInfinite || _gas.value > std::numeric_limits::max()) + return Json::Value(Json::nullValue); + else + return Json::Value(Json::LargestUInt(_gas.value)); +} + +} + +Json::Value CompilerStack::gasEstimates(string const& _contractName) const +{ + if (!assemblyItems(_contractName) && !runtimeAssemblyItems(_contractName)) + return Json::Value(); + + using Gas = GasEstimator::GasConsumption; + Json::Value output(Json::objectValue); + + if (eth::AssemblyItems const* items = assemblyItems(_contractName)) + { + Gas executionGas = GasEstimator::functionalEstimation(*items); + u256 bytecodeSize(runtimeObject(_contractName).bytecode.size()); + Gas codeDepositGas = bytecodeSize * eth::GasCosts::createDataGas; + + Json::Value creation(Json::objectValue); + creation["codeDepositCost"] = gasToJson(codeDepositGas); + creation["executionCost"] = gasToJson(executionGas); + /// TODO: implement + overload to avoid the need of += + executionGas += codeDepositGas; + creation["totalCost"] = gasToJson(executionGas); + output["creation"] = creation; + } + + if (eth::AssemblyItems const* items = runtimeAssemblyItems(_contractName)) + { + /// External functions + ContractDefinition const& contract = contractDefinition(_contractName); + 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()) + /// This needs to be set to an invalid signature in order to trigger the fallback, + /// without the shortcut (of CALLDATSIZE == 0), and therefore to receive the upper bound. + /// An empty string ("") would work to trigger the shortcut only. + externalFunctions[""] = gasToJson(GasEstimator::functionalEstimation(*items, "INVALID")); + + if (!externalFunctions.empty()) + output["external"] = externalFunctions; + + /// Internal functions + Json::Value internalFunctions(Json::objectValue); + for (auto const& it: contract.definedFunctions()) + { + if (it->isPartOfExternalInterface() || it->isConstructor()) + continue; + + size_t entry = functionEntryPoint(_contractName, *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); + } + + if (!internalFunctions.empty()) + output["internal"] = internalFunctions; + } + + return output; +} -- cgit v1.2.3 From 3fbb48bd46b613f83c6918e3b43068c72a214965 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Mon, 10 Apr 2017 14:59:30 +0100 Subject: Exclude fallback function from the internal functions in estimateGas --- libsolidity/interface/CompilerStack.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'libsolidity/interface/CompilerStack.cpp') diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index 0fddd505..ea648709 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -903,7 +903,8 @@ Json::Value CompilerStack::gasEstimates(string const& _contractName) const Json::Value internalFunctions(Json::objectValue); for (auto const& it: contract.definedFunctions()) { - if (it->isPartOfExternalInterface() || it->isConstructor()) + /// Exclude externally visible functions, constructor and the fallback function + if (it->isPartOfExternalInterface() || it->isConstructor() || it->name().empty()) continue; size_t entry = functionEntryPoint(_contractName, *it); -- cgit v1.2.3 From 54dcb0e11be09caf35e02792d47695685ba1f4cb Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Wed, 12 Apr 2017 12:06:01 +0100 Subject: Keep gas values as a string in CompilerStack::gasEstimate --- libsolidity/interface/CompilerStack.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'libsolidity/interface/CompilerStack.cpp') 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::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)); } } -- cgit v1.2.3 From bf074f3f4174f31524d25da816cb4121a21da20c Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Thu, 20 Apr 2017 18:44:07 +0100 Subject: Fix source index allocation in CompilerStack. Depending on compiler(optimisations) this could be off-by-one. --- libsolidity/interface/CompilerStack.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'libsolidity/interface/CompilerStack.cpp') diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index 92b49cda..6ea9ea78 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -406,8 +406,9 @@ vector CompilerStack::sourceNames() const map CompilerStack::sourceIndices() const { map indices; + unsigned index = 0; for (auto const& s: m_sources) - indices[s.first] = indices.size(); + indices[s.first] = index++; return indices; } -- cgit v1.2.3 From 99a7aefb752f6b97475fb48da9c1c01d87af3056 Mon Sep 17 00:00:00 2001 From: djuju Date: Wed, 26 Apr 2017 17:03:36 +0200 Subject: refactoring parse() into two separate functions --- libsolidity/interface/CompilerStack.cpp | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) (limited to 'libsolidity/interface/CompilerStack.cpp') diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index 6ea9ea78..6276c3c4 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -128,14 +128,12 @@ bool CompilerStack::parse() vector sourcesToParse; for (auto const& s: m_sources) sourcesToParse.push_back(s.first); - map sourceUnitsByName; for (size_t i = 0; i < sourcesToParse.size(); ++i) { string const& path = sourcesToParse[i]; Source& source = m_sources[path]; source.scanner->reset(); source.ast = Parser(m_errors).parse(source.scanner); - sourceUnitsByName[path] = source.ast.get(); if (!source.ast) solAssert(!Error::containsOnlyWarnings(m_errors), "Parser returned null but did not report error."); else @@ -150,9 +148,14 @@ bool CompilerStack::parse() } } } - if (!Error::containsOnlyWarnings(m_errors)) - // errors while parsing. should stop before type checking - return false; + m_parseSuccessful = Error::containsOnlyWarnings(m_errors); + return m_parseSuccessful; +} + +bool CompilerStack::analyze() +{ + if (m_sources.empty()) + BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("There are no sources to be analyzed.")); resolveImports(); @@ -173,6 +176,9 @@ bool CompilerStack::parse() if (!resolver.registerDeclarations(*source->ast)) return false; + map sourceUnitsByName; + for (auto& source : m_sources) + sourceUnitsByName[source.first] = source.second.ast.get(); for (Source const* source: m_sourceOrder) if (!resolver.performImports(*source->ast, sourceUnitsByName)) return false; @@ -245,6 +251,17 @@ bool CompilerStack::parse(string const& _sourceCode) return parse(); } +bool CompilerStack::parseAndAnalyze() +{ + return parse() && analyze(); +} + +bool CompilerStack::parseAndAnalyze(std::string const& _sourceCode) +{ + setSource(_sourceCode); + return parseAndAnalyze(); +} + vector CompilerStack::contractNames() const { if (!m_parseSuccessful) @@ -259,7 +276,7 @@ vector CompilerStack::contractNames() const bool CompilerStack::compile(bool _optimize, unsigned _runs, map const& _libraries) { if (!m_parseSuccessful) - if (!parse()) + if (!parseAndAnalyze()) return false; m_optimize = _optimize; @@ -277,7 +294,7 @@ bool CompilerStack::compile(bool _optimize, unsigned _runs, map co bool CompilerStack::compile(string const& _sourceCode, bool _optimize, unsigned _runs) { - return parse(_sourceCode) && compile(_optimize, _runs); + return parseAndAnalyze(_sourceCode) && compile(_optimize, _runs); } void CompilerStack::link() -- cgit v1.2.3 From 5fd7942173a71f1cf7ca1cae0dcde1905482f004 Mon Sep 17 00:00:00 2001 From: djuju Date: Thu, 27 Apr 2017 12:56:56 +0200 Subject: documentation, checks and renaming --- libsolidity/interface/CompilerStack.cpp | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) (limited to 'libsolidity/interface/CompilerStack.cpp') diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index 6276c3c4..56f7b064 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -57,7 +57,7 @@ using namespace dev; using namespace dev::solidity; CompilerStack::CompilerStack(ReadFile::Callback const& _readFile): - m_readFile(_readFile), m_parseSuccessful(false) {} + m_readFile(_readFile), m_success(false) {} void CompilerStack::setRemappings(vector const& _remappings) { @@ -79,7 +79,7 @@ void CompilerStack::setRemappings(vector const& _remappings) void CompilerStack::reset(bool _keepSources) { - m_parseSuccessful = false; + m_success = false; if (_keepSources) for (auto sourcePair: m_sources) sourcePair.second.reset(); @@ -116,7 +116,7 @@ bool CompilerStack::parse() //reset m_errors.clear(); ASTNode::resetID(); - m_parseSuccessful = false; + m_success = false; if (SemVerVersion{string(VersionString)}.isPrerelease()) { @@ -148,8 +148,7 @@ bool CompilerStack::parse() } } } - m_parseSuccessful = Error::containsOnlyWarnings(m_errors); - return m_parseSuccessful; + return Error::containsOnlyWarnings(m_errors); } bool CompilerStack::analyze() @@ -241,8 +240,8 @@ bool CompilerStack::analyze() noErrors = false; } - m_parseSuccessful = noErrors; - return m_parseSuccessful; + m_success = noErrors; + return m_success; } bool CompilerStack::parse(string const& _sourceCode) @@ -264,7 +263,7 @@ bool CompilerStack::parseAndAnalyze(std::string const& _sourceCode) vector CompilerStack::contractNames() const { - if (!m_parseSuccessful) + if (!m_success) BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("Parsing was not successful.")); vector contractNames; for (auto const& contract: m_contracts) @@ -275,7 +274,7 @@ vector CompilerStack::contractNames() const bool CompilerStack::compile(bool _optimize, unsigned _runs, map const& _libraries) { - if (!m_parseSuccessful) + if (!m_success) if (!parseAndAnalyze()) return false; @@ -436,7 +435,7 @@ Json::Value const& CompilerStack::interface(string const& _contractName) const Json::Value const& CompilerStack::metadata(string const& _contractName, DocumentationType _type) const { - if (!m_parseSuccessful) + if (!m_success) BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("Parsing was not successful.")); return metadata(contract(_contractName), _type); @@ -444,7 +443,7 @@ Json::Value const& CompilerStack::metadata(string const& _contractName, Document Json::Value const& CompilerStack::metadata(Contract const& _contract, DocumentationType _type) const { - if (!m_parseSuccessful) + if (!m_success) BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("Parsing was not successful.")); solAssert(_contract.contract, ""); @@ -475,7 +474,7 @@ Json::Value const& CompilerStack::metadata(Contract const& _contract, Documentat string const& CompilerStack::onChainMetadata(string const& _contractName) const { - if (!m_parseSuccessful) + if (!m_success) BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("Parsing was not successful.")); return contract(_contractName).onChainMetadata; -- cgit v1.2.3 From 16276ab10b8f673fe9e4fe2a8e17bc752680ac8a Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Thu, 27 Apr 2017 14:36:38 +0100 Subject: Catch assembler exceptions and throw readable Solidity exceptions --- libsolidity/interface/CompilerStack.cpp | 37 +++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) (limited to 'libsolidity/interface/CompilerStack.cpp') diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index 6ea9ea78..05ac483d 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -657,8 +657,41 @@ void CompilerStack::compileContract( cborEncodedMetadata += toCompactBigEndian(cborEncodedMetadata.size(), 2); compiler->compileContract(_contract, _compiledContracts, cborEncodedMetadata); compiledContract.compiler = compiler; - compiledContract.object = compiler->assembledObject(); - compiledContract.runtimeObject = compiler->runtimeObject(); + + try + { + compiledContract.object = compiler->assembledObject(); + } + catch(eth::OptimizerException const&) + { + auto err = make_shared(Error::Type::InternalCompilerError); + *err << errinfo_comment("Assembly optimizer exception for bytecode"); + m_errors.push_back(std::move(err); + } + catch(eth::AssemblyException const&) + { + auto err = make_shared(Error::Type::InternalCompilerError); + *err << errinfo_comment("Assembly exception for bytecode"); + m_errors.push_back(std::move(err); + } + + try + { + compiledContract.runtimeObject = compiler->runtimeObject(); + } + catch(eth::OptimizerException const&) + { + auto err = make_shared(Error::Type::InternalCompilerError); + *err << errinfo_comment("Assembly optimizer exception for deployed bytecode"); + m_errors.push_back(std::move(err); + } + catch(eth::AssemblyException const&) + { + auto err = make_shared(Error::Type::InternalCompilerError); + *err << errinfo_comment("Assembly exception for deployed bytecode"); + m_errors.push_back(std::move(err); + } + compiledContract.onChainMetadata = onChainMetadata; _compiledContracts[compiledContract.contract] = &compiler->assembly(); -- cgit v1.2.3 From b0485e327bfe229b4193c59ea490c7fac0dae7aa Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Thu, 27 Apr 2017 16:34:57 +0100 Subject: Make assembler errors fatal --- libsolidity/interface/CompilerStack.cpp | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) (limited to 'libsolidity/interface/CompilerStack.cpp') diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index 05ac483d..b09435a8 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -664,15 +664,11 @@ void CompilerStack::compileContract( } catch(eth::OptimizerException const&) { - auto err = make_shared(Error::Type::InternalCompilerError); - *err << errinfo_comment("Assembly optimizer exception for bytecode"); - m_errors.push_back(std::move(err); + BOOST_THROW_EXCEPTION(InternalCompilerError() << errinfo_comment("Assembly optimizer exception for bytecode")); } catch(eth::AssemblyException const&) { - auto err = make_shared(Error::Type::InternalCompilerError); - *err << errinfo_comment("Assembly exception for bytecode"); - m_errors.push_back(std::move(err); + BOOST_THROW_EXCEPTION(InternalCompilerError() << errinfo_comment("Assembly exception for bytecode")); } try @@ -681,15 +677,11 @@ void CompilerStack::compileContract( } catch(eth::OptimizerException const&) { - auto err = make_shared(Error::Type::InternalCompilerError); - *err << errinfo_comment("Assembly optimizer exception for deployed bytecode"); - m_errors.push_back(std::move(err); + BOOST_THROW_EXCEPTION(InternalCompilerError() << errinfo_comment("Assembly optimizer exception for deployed bytecode")); } catch(eth::AssemblyException const&) { - auto err = make_shared(Error::Type::InternalCompilerError); - *err << errinfo_comment("Assembly exception for deployed bytecode"); - m_errors.push_back(std::move(err); + BOOST_THROW_EXCEPTION(InternalCompilerError() << errinfo_comment("Assembly exception for deployed bytecode")); } compiledContract.onChainMetadata = onChainMetadata; -- cgit v1.2.3 From 45f8c5aa882ecc18f073984cd4d34a6c8be7e5e0 Mon Sep 17 00:00:00 2001 From: djuju Date: Fri, 28 Apr 2017 15:24:59 +0200 Subject: enumchecks not working --- libsolidity/interface/CompilerStack.cpp | 42 ++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 14 deletions(-) (limited to 'libsolidity/interface/CompilerStack.cpp') diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index 56f7b064..303784ca 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -57,7 +57,7 @@ using namespace dev; using namespace dev::solidity; CompilerStack::CompilerStack(ReadFile::Callback const& _readFile): - m_readFile(_readFile), m_success(false) {} + m_readFile(_readFile), m_stackState(Empty) {} void CompilerStack::setRemappings(vector const& _remappings) { @@ -79,7 +79,6 @@ void CompilerStack::setRemappings(vector const& _remappings) void CompilerStack::reset(bool _keepSources) { - m_success = false; if (_keepSources) for (auto sourcePair: m_sources) sourcePair.second.reset(); @@ -94,6 +93,7 @@ void CompilerStack::reset(bool _keepSources) m_sourceOrder.clear(); m_contracts.clear(); m_errors.clear(); + m_stackState = Empty; } bool CompilerStack::addSource(string const& _name, string const& _content, bool _isLibrary) @@ -102,6 +102,7 @@ bool CompilerStack::addSource(string const& _name, string const& _content, bool reset(true); m_sources[_name].scanner = make_shared(CharStream(_content), _name); m_sources[_name].isLibrary = _isLibrary; + m_stackState = SourcesSet; return existed; } @@ -114,9 +115,10 @@ void CompilerStack::setSource(string const& _sourceCode) bool CompilerStack::parse() { //reset + if(m_stackState < SourcesSet) + return false; m_errors.clear(); ASTNode::resetID(); - m_success = false; if (SemVerVersion{string(VersionString)}.isPrerelease()) { @@ -148,14 +150,20 @@ bool CompilerStack::parse() } } } - return Error::containsOnlyWarnings(m_errors); + if (Error::containsOnlyWarnings(m_errors)) + { + m_stackState = ParsingSuccessful; + return true; + } + else + return false; } bool CompilerStack::analyze() { - if (m_sources.empty()) - BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("There are no sources to be analyzed.")); - + if (m_stackState < SourcesSet) + return false; + //BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("No Sources Set to be analyzed.")); resolveImports(); bool noErrors = true; @@ -240,8 +248,13 @@ bool CompilerStack::analyze() noErrors = false; } - m_success = noErrors; - return m_success; + if (noErrors) + { + m_stackState = AnalysisSuccessful; + return true; + } + else + return false; } bool CompilerStack::parse(string const& _sourceCode) @@ -263,7 +276,7 @@ bool CompilerStack::parseAndAnalyze(std::string const& _sourceCode) vector CompilerStack::contractNames() const { - if (!m_success) + if (m_stackState != AnalysisSuccessful) BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("Parsing was not successful.")); vector contractNames; for (auto const& contract: m_contracts) @@ -274,7 +287,7 @@ vector CompilerStack::contractNames() const bool CompilerStack::compile(bool _optimize, unsigned _runs, map const& _libraries) { - if (!m_success) + if (m_stackState < AnalysisSuccessful) if (!parseAndAnalyze()) return false; @@ -288,6 +301,7 @@ bool CompilerStack::compile(bool _optimize, unsigned _runs, map co if (auto contract = dynamic_cast(node.get())) compileContract(*contract, compiledContracts); this->link(); + m_stackState = CompilationSuccessful; return true; } @@ -435,7 +449,7 @@ Json::Value const& CompilerStack::interface(string const& _contractName) const Json::Value const& CompilerStack::metadata(string const& _contractName, DocumentationType _type) const { - if (!m_success) + if (m_stackState == CompilationSuccessful) BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("Parsing was not successful.")); return metadata(contract(_contractName), _type); @@ -443,7 +457,7 @@ Json::Value const& CompilerStack::metadata(string const& _contractName, Document Json::Value const& CompilerStack::metadata(Contract const& _contract, DocumentationType _type) const { - if (!m_success) + if (m_stackState != CompilationSuccessful) BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("Parsing was not successful.")); solAssert(_contract.contract, ""); @@ -474,7 +488,7 @@ Json::Value const& CompilerStack::metadata(Contract const& _contract, Documentat string const& CompilerStack::onChainMetadata(string const& _contractName) const { - if (!m_success) + if (m_stackState != CompilationSuccessful) BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("Parsing was not successful.")); return contract(_contractName).onChainMetadata; -- cgit v1.2.3 From a6306a1d445e887d1542ab1e767c2322f994b47c Mon Sep 17 00:00:00 2001 From: djuju Date: Fri, 28 Apr 2017 15:47:30 +0200 Subject: error fixed --- libsolidity/interface/CompilerStack.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) (limited to 'libsolidity/interface/CompilerStack.cpp') diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index 303784ca..bda7a882 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -57,7 +57,7 @@ using namespace dev; using namespace dev::solidity; CompilerStack::CompilerStack(ReadFile::Callback const& _readFile): - m_readFile(_readFile), m_stackState(Empty) {} + m_readFile(_readFile) {} void CompilerStack::setRemappings(vector const& _remappings) { @@ -115,7 +115,7 @@ void CompilerStack::setSource(string const& _sourceCode) bool CompilerStack::parse() { //reset - if(m_stackState < SourcesSet) + if(m_stackState != SourcesSet) return false; m_errors.clear(); ASTNode::resetID(); @@ -161,9 +161,8 @@ bool CompilerStack::parse() bool CompilerStack::analyze() { - if (m_stackState < SourcesSet) + if (m_stackState < ParsingSuccessful) return false; - //BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("No Sources Set to be analyzed.")); resolveImports(); bool noErrors = true; @@ -184,7 +183,7 @@ bool CompilerStack::analyze() return false; map sourceUnitsByName; - for (auto& source : m_sources) + for (auto& source: m_sources) sourceUnitsByName[source.first] = source.second.ast.get(); for (Source const* source: m_sourceOrder) if (!resolver.performImports(*source->ast, sourceUnitsByName)) @@ -276,7 +275,7 @@ bool CompilerStack::parseAndAnalyze(std::string const& _sourceCode) vector CompilerStack::contractNames() const { - if (m_stackState != AnalysisSuccessful) + if (m_stackState < AnalysisSuccessful) BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("Parsing was not successful.")); vector contractNames; for (auto const& contract: m_contracts) @@ -449,7 +448,7 @@ Json::Value const& CompilerStack::interface(string const& _contractName) const Json::Value const& CompilerStack::metadata(string const& _contractName, DocumentationType _type) const { - if (m_stackState == CompilationSuccessful) + if (m_stackState < AnalysisSuccessful) BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("Parsing was not successful.")); return metadata(contract(_contractName), _type); @@ -457,7 +456,7 @@ Json::Value const& CompilerStack::metadata(string const& _contractName, Document Json::Value const& CompilerStack::metadata(Contract const& _contract, DocumentationType _type) const { - if (m_stackState != CompilationSuccessful) + if (m_stackState < AnalysisSuccessful) BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("Parsing was not successful.")); solAssert(_contract.contract, ""); -- cgit v1.2.3 From e9954eb325a6e7f50327448918043e6ef74941cb Mon Sep 17 00:00:00 2001 From: djuju Date: Fri, 28 Apr 2017 18:46:27 +0200 Subject: conditional reset of compilerState-Enum --- libsolidity/interface/CompilerStack.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'libsolidity/interface/CompilerStack.cpp') diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index 79855060..9c9c9614 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -80,8 +80,11 @@ void CompilerStack::setRemappings(vector const& _remappings) void CompilerStack::reset(bool _keepSources) { if (_keepSources) + { + m_stackState = SourcesSet; for (auto sourcePair: m_sources) sourcePair.second.reset(); + } else { m_sources.clear(); @@ -161,7 +164,7 @@ bool CompilerStack::parse() bool CompilerStack::analyze() { - if (m_stackState < ParsingSuccessful) + if (m_stackState != ParsingSuccessful) return false; resolveImports(); -- cgit v1.2.3