Cache metadata and allow after analysis in CompilerStack

This commit is contained in:
Alex Beregszaszi
2019-03-04 16:19:54 +01:00
committed by chriseth
parent 5a47f3e005
commit 26ca144647
2 changed files with 23 additions and 8 deletions
+18 -7
View File
@@ -631,10 +631,24 @@ Json::Value CompilerStack::methodIdentifiers(string const& _contractName) const
string const& CompilerStack::metadata(string const& _contractName) const
{
if (m_stackState != CompilationSuccessful)
BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("Compilation was not successful."));
if (m_stackState < AnalysisSuccessful)
BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("Analysis was not successful."));
return contract(_contractName).metadata;
return metadata(contract(_contractName));
}
string const& CompilerStack::metadata(Contract const& _contract) const
{
if (m_stackState < AnalysisSuccessful)
BOOST_THROW_EXCEPTION(CompilerError() << errinfo_comment("Analysis was not successful."));
solAssert(_contract.contract, "");
// cache the result
if (!_contract.metadata)
_contract.metadata.reset(new string(createMetadata(_contract)));
return *_contract.metadata;
}
Scanner const& CompilerStack::scanner(string const& _sourceName) const
@@ -848,11 +862,8 @@ void CompilerStack::compileContract(
shared_ptr<Compiler> compiler = make_shared<Compiler>(m_evmVersion, m_optimiserSettings);
compiledContract.compiler = compiler;
string metadata = createMetadata(compiledContract);
compiledContract.metadata = metadata;
bytes cborEncodedMetadata = createCBORMetadata(
metadata,
metadata(compiledContract),
!onlySafeExperimentalFeaturesActivated(_contract.sourceUnit().annotation().experimentalFeatures)
);