Implement address(...).code in the IR

This commit is contained in:
chriseth
2020-12-11 03:00:30 +00:00
committed by Alex Beregszaszi
parent 7b347b9ec2
commit baaf7c0db8
5 changed files with 30 additions and 3 deletions
+18
View File
@@ -4055,3 +4055,21 @@ string YulUtilFunctions::copyConstructorArgumentsToMemoryFunction(
.render();
});
}
string YulUtilFunctions::externalCodeFunction()
{
string functionName = "external_code_at";
return m_functionCollector.createFunction(functionName, [&]() {
return util::Whiskers(R"(
function <functionName>(addr) -> mpos {
let length := extcodesize(addr)
mpos := <allocateArray>(length)
extcodecopy(addr, add(mpos, 0x20), 0, length)
}
)")
("functionName", functionName)
("allocateArray", allocateMemoryArrayFunction(*TypeProvider::bytesMemory()))
.render();
});
}
+5
View File
@@ -460,6 +460,11 @@ public:
std::string const& _creationObjectName
);
/// @returns the name of a function that copies code from a given address to a newly
/// allocated byte array in memory.
/// Signature: (address) -> mpos
std::string externalCodeFunction();
private:
/// Special case of conversion functions - handles all array conversions.
std::string arrayConversionFunction(ArrayType const& _from, ArrayType const& _to);
@@ -1622,6 +1622,12 @@ void IRGeneratorForStatements::endVisit(MemberAccess const& _memberAccess)
"balance(" <<
expressionAsType(_memberAccess.expression(), *TypeProvider::address()) <<
")\n";
else if (member == "code")
define(_memberAccess) <<
m_utils.externalCodeFunction() <<
"(" <<
expressionAsType(_memberAccess.expression(), *TypeProvider::address()) <<
")\n";
else if (member == "codehash")
define(_memberAccess) <<
"extcodehash(" <<