mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
@@ -233,7 +233,7 @@ protected:
|
||||
m_compiler.reset(false, m_addStandardSources);
|
||||
m_compiler.addSource("", registrarCode);
|
||||
ETH_TEST_REQUIRE_NO_THROW(m_compiler.compile(m_optimize, m_optimizeRuns), "Compiling contract failed");
|
||||
s_compiledRegistrar.reset(new bytes(m_compiler.bytecode("GlobalRegistrar")));
|
||||
s_compiledRegistrar.reset(new bytes(m_compiler.object("GlobalRegistrar").bytecode));
|
||||
}
|
||||
sendMessage(*s_compiledRegistrar, true);
|
||||
BOOST_REQUIRE(!m_output.empty());
|
||||
|
||||
@@ -125,7 +125,7 @@ protected:
|
||||
m_compiler.reset(false, m_addStandardSources);
|
||||
m_compiler.addSource("", registrarCode);
|
||||
ETH_TEST_REQUIRE_NO_THROW(m_compiler.compile(m_optimize, m_optimizeRuns), "Compiling contract failed");
|
||||
s_compiledRegistrar.reset(new bytes(m_compiler.bytecode("FixedFeeRegistrar")));
|
||||
s_compiledRegistrar.reset(new bytes(m_compiler.object("FixedFeeRegistrar").bytecode));
|
||||
}
|
||||
sendMessage(*s_compiledRegistrar, true);
|
||||
BOOST_REQUIRE(!m_output.empty());
|
||||
|
||||
@@ -440,7 +440,7 @@ protected:
|
||||
m_compiler.reset(false, m_addStandardSources);
|
||||
m_compiler.addSource("", walletCode);
|
||||
ETH_TEST_REQUIRE_NO_THROW(m_compiler.compile(m_optimize, m_optimizeRuns), "Compiling contract failed");
|
||||
s_compiledWallet.reset(new bytes(m_compiler.bytecode("Wallet")));
|
||||
s_compiledWallet.reset(new bytes(m_compiler.object("Wallet").bytecode));
|
||||
}
|
||||
bytes args = encodeArgs(u256(0x60), _required, _dailyLimit, u256(_owners.size()), _owners);
|
||||
sendMessage(*s_compiledWallet + args, true, _value);
|
||||
|
||||
@@ -66,7 +66,7 @@ eth::AssemblyItems compileContract(const string& _sourceCode)
|
||||
if (ContractDefinition* contract = dynamic_cast<ContractDefinition*>(node.get()))
|
||||
{
|
||||
Compiler compiler;
|
||||
compiler.compileContract(*contract, map<ContractDefinition const*, bytes const*>{});
|
||||
compiler.compileContract(*contract, map<ContractDefinition const*, Assembly const*>{});
|
||||
|
||||
return compiler.runtimeAssemblyItems();
|
||||
}
|
||||
|
||||
@@ -63,7 +63,7 @@ public:
|
||||
auto state = make_shared<KnownState>();
|
||||
PathGasMeter meter(*m_compiler.assemblyItems());
|
||||
GasMeter::GasConsumption gas = meter.estimateMax(0, state);
|
||||
u256 bytecodeSize(m_compiler.runtimeBytecode().size());
|
||||
u256 bytecodeSize(m_compiler.runtimeObject().bytecode.size());
|
||||
gas += bytecodeSize * c_createDataGas;
|
||||
BOOST_REQUIRE(!gas.isInfinite);
|
||||
BOOST_CHECK(gas.value == m_gasUsed);
|
||||
|
||||
@@ -5230,6 +5230,38 @@ BOOST_AUTO_TEST_CASE(storage_string_as_mapping_key_without_variable)
|
||||
BOOST_CHECK(callContractFunction("f()") == encodeArgs(u256(2)));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(library_call)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
library Lib { function m(uint x, uint y) returns (uint) { return x * y; } }
|
||||
contract Test {
|
||||
function f(uint x) returns (uint) {
|
||||
return Lib.m(x, 9);
|
||||
}
|
||||
}
|
||||
)";
|
||||
compileAndRun(sourceCode, 0, "Lib");
|
||||
compileAndRun(sourceCode, 0, "Test", bytes(), map<string, Address>{{"Lib", m_contractAddress}});
|
||||
BOOST_CHECK(callContractFunction("f(uint256)", u256(33)) == encodeArgs(u256(33) * 9));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(library_stray_values)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
library Lib { function m(uint x, uint y) returns (uint) { return x * y; } }
|
||||
contract Test {
|
||||
function f(uint x) returns (uint) {
|
||||
Lib;
|
||||
Lib.m;
|
||||
return x + 9;
|
||||
}
|
||||
}
|
||||
)";
|
||||
compileAndRun(sourceCode, 0, "Lib");
|
||||
compileAndRun(sourceCode, 0, "Test", bytes(), map<string, Address>{{"Lib", m_contractAddress}});
|
||||
BOOST_CHECK(callContractFunction("f(uint256)", u256(33)) == encodeArgs(u256(42)));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
}
|
||||
|
||||
@@ -138,7 +138,7 @@ bytes compileFirstExpression(const string& _sourceCode, vector<vector<string>> _
|
||||
|
||||
for (vector<string> const& function: _functions)
|
||||
context << context.functionEntryLabel(dynamic_cast<FunctionDefinition const&>(resolveDeclaration(function, resolver)));
|
||||
bytes instructions = context.assembledBytecode();
|
||||
bytes instructions = context.assembledObject().bytecode;
|
||||
// debug
|
||||
// cout << eth::disassemble(instructions) << endl;
|
||||
return instructions;
|
||||
|
||||
@@ -2193,6 +2193,55 @@ BOOST_AUTO_TEST_CASE(string_bytes_conversion)
|
||||
BOOST_CHECK_NO_THROW(parseTextAndResolveNames(text));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(inheriting_from_library)
|
||||
{
|
||||
char const* text = R"(
|
||||
library Lib {}
|
||||
contract Test is Lib {}
|
||||
)";
|
||||
BOOST_CHECK_THROW(parseTextAndResolveNames(text), TypeError);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(inheriting_library)
|
||||
{
|
||||
char const* text = R"(
|
||||
contract Test {}
|
||||
library Lib is Test {}
|
||||
)";
|
||||
BOOST_CHECK_THROW(parseTextAndResolveNames(text), TypeError);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(library_having_variables)
|
||||
{
|
||||
char const* text = R"(
|
||||
library Lib { uint x; }
|
||||
)";
|
||||
BOOST_CHECK_THROW(parseTextAndResolveNames(text), TypeError);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(valid_library)
|
||||
{
|
||||
char const* text = R"(
|
||||
library Lib { uint constant x = 9; }
|
||||
)";
|
||||
BOOST_CHECK_NO_THROW(parseTextAndResolveNames(text));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(call_to_library_function)
|
||||
{
|
||||
char const* text = R"(
|
||||
library Lib {
|
||||
uint constant public pimil = 3141592;
|
||||
function min(uint x, uint y) returns (uint);
|
||||
}
|
||||
contract Test {
|
||||
function f() {
|
||||
uint t = Lib.min(Lib.pimil(), 7);
|
||||
}
|
||||
}
|
||||
)";
|
||||
BOOST_CHECK_NO_THROW(parseTextAndResolveNames(text));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(creating_contract_within_the_contract)
|
||||
{
|
||||
|
||||
@@ -924,6 +924,16 @@ BOOST_AUTO_TEST_CASE(empty_comment)
|
||||
BOOST_CHECK_NO_THROW(parseText(text));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(library_simple)
|
||||
{
|
||||
char const* text = R"(
|
||||
library Lib {
|
||||
function f() { }
|
||||
}
|
||||
)";
|
||||
BOOST_CHECK_NO_THROW(parseText(text));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
}
|
||||
|
||||
@@ -53,14 +53,17 @@ public:
|
||||
std::string const& _sourceCode,
|
||||
u256 const& _value = 0,
|
||||
std::string const& _contractName = "",
|
||||
bytes const& _arguments = bytes()
|
||||
bytes const& _arguments = bytes(),
|
||||
std::map<std::string, Address> const& _libraryAddresses = std::map<std::string, Address>()
|
||||
)
|
||||
{
|
||||
m_compiler.reset(false, m_addStandardSources);
|
||||
m_compiler.addSource("", _sourceCode);
|
||||
ETH_TEST_REQUIRE_NO_THROW(m_compiler.compile(m_optimize, m_optimizeRuns), "Compiling contract failed");
|
||||
bytes code = m_compiler.bytecode(_contractName);
|
||||
sendMessage(code + _arguments, true, _value);
|
||||
eth::LinkerObject obj = m_compiler.object(_contractName);
|
||||
obj.link(_libraryAddresses);
|
||||
BOOST_REQUIRE(obj.linkReferences.empty());
|
||||
sendMessage(obj.bytecode + _arguments, true, _value);
|
||||
return m_output;
|
||||
}
|
||||
|
||||
@@ -76,10 +79,11 @@ public:
|
||||
std::string const& _sourceCode,
|
||||
u256 const& _value = 0,
|
||||
std::string const& _contractName = "",
|
||||
bytes const& _arguments = bytes()
|
||||
bytes const& _arguments = bytes(),
|
||||
std::map<std::string, Address> const& _libraryAddresses = std::map<std::string, Address>()
|
||||
)
|
||||
{
|
||||
compileAndRunWithoutCheck(_sourceCode, _value, _contractName, _arguments);
|
||||
compileAndRunWithoutCheck(_sourceCode, _value, _contractName, _arguments, _libraryAddresses);
|
||||
BOOST_REQUIRE(!m_output.empty());
|
||||
return m_output;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user