| 4733 | } |
| 4734 | |
| 4735 | std::string YulUtilFunctions::extractReturndataFunction() |
| 4736 | { |
| 4737 | std::string const functionName = "extract_returndata"; |
| 4738 | |
| 4739 | return m_functionCollector.createFunction(functionName, [&]() { |
| 4740 | return util::Whiskers(R"( |
| 4741 | function <functionName>() -> data { |
| 4742 | <?supportsReturndata> |
| 4743 | switch returndatasize() |
| 4744 | case 0 { |
| 4745 | data := <emptyArray>() |
| 4746 | } |
| 4747 | default { |
| 4748 | data := <allocateArray>(returndatasize()) |
| 4749 | returndatacopy(add(data, 0x20), 0, returndatasize()) |
| 4750 | } |
| 4751 | <!supportsReturndata> |
| 4752 | data := <emptyArray>() |
| 4753 | </supportsReturndata> |
| 4754 | } |
| 4755 | )") |
| 4756 | ("functionName", functionName) |
| 4757 | ("supportsReturndata", m_evmVersion.supportsReturndata()) |
| 4758 | ("allocateArray", allocateMemoryArrayFunction(*TypeProvider::bytesMemory())) |
| 4759 | ("emptyArray", zeroValueFunction(*TypeProvider::bytesMemory())) |
| 4760 | .render(); |
| 4761 | }); |
| 4762 | } |
| 4763 | |
| 4764 | std::string YulUtilFunctions::copyConstructorArgumentsToMemoryFunction( |
| 4765 | ContractDefinition const& _contract, |
no test coverage detected