diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index da561050b..76450cf60 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -733,11 +733,7 @@ Json::Value const& CompilerStack::contractABI(Contract const& _contract) const solAssert(_contract.contract, ""); - // caches the result - if (!_contract.abi) - _contract.abi = make_unique(ABI::generate(*_contract.contract)); - - return *_contract.abi; + return _contract.abi.init([&]{ return ABI::generate(*_contract.contract); }); } Json::Value const& CompilerStack::storageLayout(string const& _contractName) const @@ -755,11 +751,7 @@ Json::Value const& CompilerStack::storageLayout(Contract const& _contract) const solAssert(_contract.contract, ""); - // caches the result - if (!_contract.storageLayout) - _contract.storageLayout = make_unique(StorageLayout().generate(*_contract.contract)); - - return *_contract.storageLayout; + return _contract.storageLayout.init([&]{ return StorageLayout().generate(*_contract.contract); }); } Json::Value const& CompilerStack::natspecUser(string const& _contractName) const @@ -777,11 +769,7 @@ Json::Value const& CompilerStack::natspecUser(Contract const& _contract) const solAssert(_contract.contract, ""); - // caches the result - if (!_contract.userDocumentation) - _contract.userDocumentation = make_unique(Natspec::userDocumentation(*_contract.contract)); - - return *_contract.userDocumentation; + return _contract.userDocumentation.init([&]{ return Natspec::userDocumentation(*_contract.contract); }); } Json::Value const& CompilerStack::natspecDev(string const& _contractName) const @@ -799,11 +787,7 @@ Json::Value const& CompilerStack::natspecDev(Contract const& _contract) const solAssert(_contract.contract, ""); - // caches the result - if (!_contract.devDocumentation) - _contract.devDocumentation = make_unique(Natspec::devDocumentation(*_contract.contract)); - - return *_contract.devDocumentation; + return _contract.devDocumentation.init([&]{ return Natspec::devDocumentation(*_contract.contract); }); } Json::Value CompilerStack::methodIdentifiers(string const& _contractName) const @@ -832,11 +816,7 @@ string const& CompilerStack::metadata(Contract const& _contract) const solAssert(_contract.contract, ""); - // cache the result - if (!_contract.metadata) - _contract.metadata = make_unique(createMetadata(_contract)); - - return *_contract.metadata; + return _contract.metadata.init([&]{ return createMetadata(_contract); }); } Scanner const& CompilerStack::scanner(string const& _sourceName) const diff --git a/libsolidity/interface/CompilerStack.h b/libsolidity/interface/CompilerStack.h index 8bc8828c6..e699101af 100644 --- a/libsolidity/interface/CompilerStack.h +++ b/libsolidity/interface/CompilerStack.h @@ -37,6 +37,7 @@ #include #include +#include #include #include @@ -342,11 +343,11 @@ private: std::string yulIROptimized; ///< Optimized experimental Yul IR code. std::string ewasm; ///< Experimental Ewasm text representation evmasm::LinkerObject ewasmObject; ///< Experimental Ewasm code - mutable std::unique_ptr metadata; ///< The metadata json that will be hashed into the chain. - mutable std::unique_ptr abi; - mutable std::unique_ptr storageLayout; - mutable std::unique_ptr userDocumentation; - mutable std::unique_ptr devDocumentation; + util::LazyInit metadata; ///< The metadata json that will be hashed into the chain. + util::LazyInit abi; + util::LazyInit storageLayout; + util::LazyInit userDocumentation; + util::LazyInit devDocumentation; mutable std::unique_ptr sourceMapping; mutable std::unique_ptr runtimeSourceMapping; };