mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
[Sol - Yul] Add support for built-in logN().
This commit is contained in:
parent
ed6c6b3170
commit
66edaf43f4
@ -818,6 +818,33 @@ void IRGeneratorForStatements::endVisit(FunctionCall const& _functionCall)
|
|||||||
define(_functionCall) << "selfdestruct(" << expressionAsType(*arguments.front(), *parameterTypes.front()) << ")\n";
|
define(_functionCall) << "selfdestruct(" << expressionAsType(*arguments.front(), *parameterTypes.front()) << ")\n";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case FunctionType::Kind::Log0:
|
||||||
|
case FunctionType::Kind::Log1:
|
||||||
|
case FunctionType::Kind::Log2:
|
||||||
|
case FunctionType::Kind::Log3:
|
||||||
|
case FunctionType::Kind::Log4:
|
||||||
|
{
|
||||||
|
unsigned logNumber = int(functionType->kind()) - int(FunctionType::Kind::Log0);
|
||||||
|
solAssert(arguments.size() == logNumber + 1, "");
|
||||||
|
ABIFunctions abi(m_context.evmVersion(), m_context.revertStrings(), m_context.functionCollector());
|
||||||
|
string indexedArgs;
|
||||||
|
for (unsigned arg = 0; arg < logNumber; ++arg)
|
||||||
|
indexedArgs += ", " + expressionAsType(*arguments[arg + 1], *(parameterTypes[arg + 1]));
|
||||||
|
Whiskers templ(R"({
|
||||||
|
let <pos> := <freeMemory>
|
||||||
|
let <end> := <encode>(<pos>, <nonIndexedArgs>)
|
||||||
|
<log>(<pos>, sub(<end>, <pos>) <indexedArgs>)
|
||||||
|
})");
|
||||||
|
templ("pos", m_context.newYulVariable());
|
||||||
|
templ("end", m_context.newYulVariable());
|
||||||
|
templ("freeMemory", freeMemory());
|
||||||
|
templ("encode", abi.tupleEncoder({arguments.front()->annotation().type},{parameterTypes.front()}));
|
||||||
|
templ("nonIndexedArgs", IRVariable(*arguments.front()).commaSeparatedList());
|
||||||
|
templ("log", "log" + to_string(logNumber));
|
||||||
|
templ("indexedArgs", indexedArgs);
|
||||||
|
m_code << templ.render();
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
solUnimplemented("FunctionKind " + toString(static_cast<int>(functionType->kind())) + " not yet implemented");
|
solUnimplemented("FunctionKind " + toString(static_cast<int>(functionType->kind())) + " not yet implemented");
|
||||||
}
|
}
|
||||||
|
@ -1126,12 +1126,14 @@ BOOST_AUTO_TEST_CASE(log0)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
ALSO_VIA_YUL(
|
||||||
compileAndRun(sourceCode);
|
compileAndRun(sourceCode);
|
||||||
callContractFunction("a()");
|
callContractFunction("a()");
|
||||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||||
BOOST_CHECK_EQUAL(h256(logData(0)), h256(u256(1)));
|
BOOST_CHECK_EQUAL(h256(logData(0)), h256(u256(1)));
|
||||||
BOOST_CHECK_EQUAL(numLogTopics(0), 0);
|
BOOST_CHECK_EQUAL(numLogTopics(0), 0);
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(log1)
|
BOOST_AUTO_TEST_CASE(log1)
|
||||||
@ -1143,6 +1145,7 @@ BOOST_AUTO_TEST_CASE(log1)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
ALSO_VIA_YUL(
|
||||||
compileAndRun(sourceCode);
|
compileAndRun(sourceCode);
|
||||||
callContractFunction("a()");
|
callContractFunction("a()");
|
||||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||||
@ -1150,6 +1153,7 @@ BOOST_AUTO_TEST_CASE(log1)
|
|||||||
BOOST_CHECK_EQUAL(h256(logData(0)), h256(u256(1)));
|
BOOST_CHECK_EQUAL(h256(logData(0)), h256(u256(1)));
|
||||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
||||||
BOOST_CHECK_EQUAL(logTopic(0, 0), h256(u256(2)));
|
BOOST_CHECK_EQUAL(logTopic(0, 0), h256(u256(2)));
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(log2)
|
BOOST_AUTO_TEST_CASE(log2)
|
||||||
@ -1161,6 +1165,7 @@ BOOST_AUTO_TEST_CASE(log2)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
ALSO_VIA_YUL(
|
||||||
compileAndRun(sourceCode);
|
compileAndRun(sourceCode);
|
||||||
callContractFunction("a()");
|
callContractFunction("a()");
|
||||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||||
@ -1169,6 +1174,7 @@ BOOST_AUTO_TEST_CASE(log2)
|
|||||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 2);
|
BOOST_REQUIRE_EQUAL(numLogTopics(0), 2);
|
||||||
for (unsigned i = 0; i < 2; ++i)
|
for (unsigned i = 0; i < 2; ++i)
|
||||||
BOOST_CHECK_EQUAL(logTopic(0, i), h256(u256(i + 2)));
|
BOOST_CHECK_EQUAL(logTopic(0, i), h256(u256(i + 2)));
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(log3)
|
BOOST_AUTO_TEST_CASE(log3)
|
||||||
@ -1180,6 +1186,7 @@ BOOST_AUTO_TEST_CASE(log3)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
ALSO_VIA_YUL(
|
||||||
compileAndRun(sourceCode);
|
compileAndRun(sourceCode);
|
||||||
callContractFunction("a()");
|
callContractFunction("a()");
|
||||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||||
@ -1188,6 +1195,7 @@ BOOST_AUTO_TEST_CASE(log3)
|
|||||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 3);
|
BOOST_REQUIRE_EQUAL(numLogTopics(0), 3);
|
||||||
for (unsigned i = 0; i < 3; ++i)
|
for (unsigned i = 0; i < 3; ++i)
|
||||||
BOOST_CHECK_EQUAL(logTopic(0, i), h256(u256(i + 2)));
|
BOOST_CHECK_EQUAL(logTopic(0, i), h256(u256(i + 2)));
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(log4)
|
BOOST_AUTO_TEST_CASE(log4)
|
||||||
@ -1199,6 +1207,7 @@ BOOST_AUTO_TEST_CASE(log4)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
ALSO_VIA_YUL(
|
||||||
compileAndRun(sourceCode);
|
compileAndRun(sourceCode);
|
||||||
callContractFunction("a()");
|
callContractFunction("a()");
|
||||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||||
@ -1207,6 +1216,7 @@ BOOST_AUTO_TEST_CASE(log4)
|
|||||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 4);
|
BOOST_REQUIRE_EQUAL(numLogTopics(0), 4);
|
||||||
for (unsigned i = 0; i < 4; ++i)
|
for (unsigned i = 0; i < 4; ++i)
|
||||||
BOOST_CHECK_EQUAL(logTopic(0, i), h256(u256(i + 2)));
|
BOOST_CHECK_EQUAL(logTopic(0, i), h256(u256(i + 2)));
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(log_in_constructor)
|
BOOST_AUTO_TEST_CASE(log_in_constructor)
|
||||||
@ -1218,12 +1228,14 @@ BOOST_AUTO_TEST_CASE(log_in_constructor)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
ALSO_VIA_YUL(
|
||||||
compileAndRun(sourceCode);
|
compileAndRun(sourceCode);
|
||||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||||
BOOST_CHECK_EQUAL(h256(logData(0)), h256(u256(1)));
|
BOOST_CHECK_EQUAL(h256(logData(0)), h256(u256(1)));
|
||||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
||||||
BOOST_CHECK_EQUAL(logTopic(0, 0), h256(u256(2)));
|
BOOST_CHECK_EQUAL(logTopic(0, 0), h256(u256(2)));
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(selfdestruct)
|
BOOST_AUTO_TEST_CASE(selfdestruct)
|
||||||
@ -1776,6 +1788,7 @@ BOOST_AUTO_TEST_CASE(event)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
ALSO_VIA_YUL(
|
||||||
compileAndRun(sourceCode);
|
compileAndRun(sourceCode);
|
||||||
u256 value(18);
|
u256 value(18);
|
||||||
u256 id(0x1234);
|
u256 id(0x1234);
|
||||||
@ -1790,6 +1803,7 @@ BOOST_AUTO_TEST_CASE(event)
|
|||||||
BOOST_CHECK_EQUAL(logTopic(0, 1), h256(m_sender, h256::AlignRight));
|
BOOST_CHECK_EQUAL(logTopic(0, 1), h256(m_sender, h256::AlignRight));
|
||||||
BOOST_CHECK_EQUAL(logTopic(0, 2), h256(id));
|
BOOST_CHECK_EQUAL(logTopic(0, 2), h256(id));
|
||||||
}
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(event_emit)
|
BOOST_AUTO_TEST_CASE(event_emit)
|
||||||
@ -1852,6 +1866,7 @@ BOOST_AUTO_TEST_CASE(event_access_through_base_name_emit)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
ALSO_VIA_YUL(
|
||||||
compileAndRun(sourceCode);
|
compileAndRun(sourceCode);
|
||||||
callContractFunction("f()");
|
callContractFunction("f()");
|
||||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||||
@ -1859,6 +1874,7 @@ BOOST_AUTO_TEST_CASE(event_access_through_base_name_emit)
|
|||||||
BOOST_CHECK(logData(0).empty());
|
BOOST_CHECK(logData(0).empty());
|
||||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
||||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("x()")));
|
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("x()")));
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(events_with_same_name)
|
BOOST_AUTO_TEST_CASE(events_with_same_name)
|
||||||
|
Loading…
Reference in New Issue
Block a user