Use LazyInit for cached contract compilations

This commit is contained in:
Jason Cobb 2020-05-12 10:04:13 -04:00
parent cffd1eaff1
commit 24dfa89ee7
No known key found for this signature in database
GPG Key ID: 2A3F6A6DCA1E8DED
3 changed files with 24 additions and 12 deletions

View File

@ -24,9 +24,12 @@
#include <test/contracts/ContractInterface.h> #include <test/contracts/ContractInterface.h>
#include <test/EVMHost.h> #include <test/EVMHost.h>
#include <libsolutil/LazyInit.h>
#include <boost/test/unit_test.hpp> #include <boost/test/unit_test.hpp>
#include <string> #include <string>
#include <optional>
using namespace std; using namespace std;
using namespace solidity; using namespace solidity;
@ -212,17 +215,18 @@ contract GlobalRegistrar is Registrar, AuctionSystem {
} }
)DELIMITER"; )DELIMITER";
static unique_ptr<bytes> s_compiledRegistrar; static LazyInit<bytes> s_compiledRegistrar;
class AuctionRegistrarTestFramework: public SolidityExecutionFramework class AuctionRegistrarTestFramework: public SolidityExecutionFramework
{ {
protected: protected:
void deployRegistrar() void deployRegistrar()
{ {
if (!s_compiledRegistrar) bytes const& compiled = s_compiledRegistrar.init([&]{
s_compiledRegistrar = make_unique<bytes>(compileContract(registrarCode, "GlobalRegistrar")); return compileContract(registrarCode, "GlobalRegistrar");
});
sendMessage(*s_compiledRegistrar, true); sendMessage(compiled, true);
BOOST_REQUIRE(m_transactionSuccessful); BOOST_REQUIRE(m_transactionSuccessful);
BOOST_REQUIRE(!m_output.empty()); BOOST_REQUIRE(!m_output.empty());
} }

View File

@ -20,8 +20,11 @@
* Tests for a fixed fee registrar contract. * Tests for a fixed fee registrar contract.
*/ */
#include <libsolutil/LazyInit.h>
#include <string> #include <string>
#include <tuple> #include <tuple>
#include <optional>
#if defined(_MSC_VER) #if defined(_MSC_VER)
#pragma warning(push) #pragma warning(push)
@ -122,17 +125,18 @@ contract FixedFeeRegistrar is Registrar {
} }
)DELIMITER"; )DELIMITER";
static unique_ptr<bytes> s_compiledRegistrar; static LazyInit<bytes> s_compiledRegistrar;
class RegistrarTestFramework: public SolidityExecutionFramework class RegistrarTestFramework: public SolidityExecutionFramework
{ {
protected: protected:
void deployRegistrar() void deployRegistrar()
{ {
if (!s_compiledRegistrar) bytes const& compiled = s_compiledRegistrar.init([&]{
s_compiledRegistrar = make_unique<bytes>(compileContract(registrarCode, "FixedFeeRegistrar")); return compileContract(registrarCode, "FixedFeeRegistrar");
});
sendMessage(*s_compiledRegistrar, true); sendMessage(compiled, true);
BOOST_REQUIRE(m_transactionSuccessful); BOOST_REQUIRE(m_transactionSuccessful);
BOOST_REQUIRE(!m_output.empty()); BOOST_REQUIRE(!m_output.empty());
} }

View File

@ -20,8 +20,11 @@
* Tests for a (comparatively) complex multisig wallet contract. * Tests for a (comparatively) complex multisig wallet contract.
*/ */
#include <libsolutil/LazyInit.h>
#include <string> #include <string>
#include <tuple> #include <tuple>
#include <optional>
#if defined(_MSC_VER) #if defined(_MSC_VER)
#pragma warning(push) #pragma warning(push)
@ -435,7 +438,7 @@ contract Wallet is multisig, multiowned, daylimit {
} }
)DELIMITER"; )DELIMITER";
static unique_ptr<bytes> s_compiledWallet; static LazyInit<bytes> s_compiledWallet;
class WalletTestFramework: public SolidityExecutionFramework class WalletTestFramework: public SolidityExecutionFramework
{ {
@ -447,11 +450,12 @@ protected:
u256 _dailyLimit = 0 u256 _dailyLimit = 0
) )
{ {
if (!s_compiledWallet) bytes const& compiled = s_compiledWallet.init([&]{
s_compiledWallet = make_unique<bytes>(compileContract(walletCode, "Wallet")); return compileContract(walletCode, "Wallet");
});
bytes args = encodeArgs(u256(0x60), _required, _dailyLimit, u256(_owners.size()), _owners); bytes args = encodeArgs(u256(0x60), _required, _dailyLimit, u256(_owners.size()), _owners);
sendMessage(*s_compiledWallet + args, true, _value); sendMessage(compiled + args, true, _value);
BOOST_REQUIRE(m_transactionSuccessful); BOOST_REQUIRE(m_transactionSuccessful);
BOOST_REQUIRE(!m_output.empty()); BOOST_REQUIRE(!m_output.empty());
} }