23
23
24
24
#include < test/libsolidity/SolidityExecutionFramework.h>
25
25
#include < test/libsolidity/util/Common.h>
26
+ #include < test/libsolidity/util/SoltestErrors.h>
26
27
27
28
#include < liblangutil/DebugInfoSelection.h>
28
29
#include < libyul/Exceptions.h>
@@ -42,49 +43,62 @@ using namespace solidity::test;
42
43
43
44
bytes SolidityExecutionFramework::multiSourceCompileContract (
44
45
std::map<std::string, std::string> const & _sourceCode,
45
- std::optional<std::string> const & _mainSourceName,
46
46
std::string const & _contractName,
47
- std::map<std::string, Address> const & _libraryAddresses
47
+ std::map<std::string, Address> const & _libraryAddresses,
48
+ std::optional<std::string> const & _mainSourceName
48
49
)
49
50
{
50
51
if (_mainSourceName.has_value ())
51
52
solAssert (_sourceCode.find (_mainSourceName.value ()) != _sourceCode.end (), " " );
52
53
53
- m_compiler. reset () ;
54
- m_compiler. setSources ( withPreamble (
54
+ m_compilerInput = CompilerInput{} ;
55
+ m_compilerInput. sourceCode = withPreamble (
55
56
_sourceCode,
56
57
solidity::test::CommonOptions::get ().useABIEncoderV1 // _addAbicoderV1Pragma
57
- )) ;
58
- m_compiler. setLibraries ( _libraryAddresses) ;
59
- m_compiler. setRevertStringBehaviour (m_revertStrings );
60
- m_compiler. setEVMVersion (m_evmVersion) ;
61
- m_compiler. setEOFVersion (m_eofVersion );
62
- m_compiler. setOptimiserSettings (m_optimiserSettings );
63
- m_compiler. setViaIR (m_compileViaYul );
64
- m_compiler. setRevertStringBehaviour (m_revertStrings );
58
+ );
59
+ m_compilerInput. libraryAddresses = _libraryAddresses;
60
+ m_compilerInput. evmVersion = std::make_optional (m_evmVersion );
61
+ m_compilerInput. eofVersion = m_eofVersion ;
62
+ m_compilerInput. optimiserSettings = std::make_optional (m_optimiserSettings );
63
+ m_compilerInput. revertStrings = std::make_optional (m_revertStrings );
64
+ m_compilerInput. metadataHash = std::make_optional (m_metadataHash );
65
+ m_compilerInput. viaIR = std::make_optional (m_compileViaYul );
65
66
if (!m_appendCBORMetadata) {
66
- m_compiler. setMetadataFormat (CompilerStack:: MetadataFormat::NoMetadata);
67
+ m_compilerInput. metadataFormat = std::make_optional ( MetadataFormat::NoMetadata);
67
68
}
68
- m_compiler.setMetadataHash (m_metadataHash);
69
69
70
- if (!m_compiler.compile ())
70
+ auto output = m_compiler.compile (m_compilerInput);
71
+ if (!output.success ())
71
72
{
72
73
// The testing framework expects an exception for
73
74
// "unimplemented" yul IR generation.
74
75
if (m_compileViaYul)
75
- for (auto const & error: m_compiler.errors ())
76
- if (error->type () == langutil::Error::Type::CodeGenerationError)
77
- BOOST_THROW_EXCEPTION (*error);
78
- langutil::SourceReferenceFormatter{std::cerr, m_compiler, true , false }
79
- .printErrorInformation (m_compiler.errors ());
76
+ {
77
+ auto type = langutil::Error::Type::CodeGenerationError;
78
+ auto error = output.findError (type);
79
+ if (error.has_value ())
80
+ BOOST_THROW_EXCEPTION (error.value ());
81
+ }
82
+ std::cout << output.errorInformation () << std::endl;
80
83
BOOST_ERROR (" Compiling contract failed" );
81
84
}
82
- std::string contractName (_contractName.empty () ? m_compiler.lastContractName (_mainSourceName) : _contractName);
83
- evmasm::LinkerObject obj = m_compiler.object (contractName);
84
- BOOST_REQUIRE (obj.linkReferences .empty ());
85
+
86
+ // Construct `ContractName` with the contract name given, and use `_mainSourceName`
87
+ // if the contract's name source prefix is empty.
88
+ ContractName contractName{_contractName};
89
+ auto lookupName = contractName.source ().empty () ?
90
+ ContractName{_mainSourceName.value_or (" " ), contractName.contract ()} :
91
+ contractName;
92
+
93
+ auto contract = output.contract (lookupName);
94
+
95
+ soltestAssert (contract.has_value ());
96
+ soltestAssert (!contract.value ().hasUnlinkedReferences );
97
+
85
98
if (m_showMetadata)
86
- std::cout << " metadata: " << m_compiler.metadata (contractName) << std::endl;
87
- return obj.bytecode ;
99
+ std::cout << " metadata: " << contract.value ().metadata << std::endl;
100
+
101
+ return contract.value ().object ;
88
102
}
89
103
90
104
bytes SolidityExecutionFramework::compileContract (
@@ -95,8 +109,8 @@ bytes SolidityExecutionFramework::compileContract(
95
109
{
96
110
return multiSourceCompileContract (
97
111
{{" " , _sourceCode}},
98
- std::nullopt,
99
112
_contractName,
100
- _libraryAddresses
113
+ _libraryAddresses,
114
+ std::nullopt
101
115
);
102
116
}
0 commit comments