mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #6645 from ethereum/add-blockchain-ops
Support generation of calldata, code, extcode and returndata opcodes
This commit is contained in:
commit
2538bf897d
@ -307,6 +307,15 @@ void ProtoConverter::visit(UnaryOp const& _x)
|
|||||||
case UnaryOp::ISZERO:
|
case UnaryOp::ISZERO:
|
||||||
m_output << "iszero";
|
m_output << "iszero";
|
||||||
break;
|
break;
|
||||||
|
case UnaryOp::CALLDATALOAD:
|
||||||
|
m_output << "calldataload";
|
||||||
|
break;
|
||||||
|
case UnaryOp::EXTCODESIZE:
|
||||||
|
m_output << "extcodesize";
|
||||||
|
break;
|
||||||
|
case UnaryOp::EXTCODEHASH:
|
||||||
|
m_output << "extcodehash";
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
m_output << "(";
|
m_output << "(";
|
||||||
visit(_x.operand());
|
visit(_x.operand());
|
||||||
@ -346,9 +355,55 @@ void ProtoConverter::visit(NullaryOp const& _x)
|
|||||||
case NullaryOp::GAS:
|
case NullaryOp::GAS:
|
||||||
m_output << "gas()";
|
m_output << "gas()";
|
||||||
break;
|
break;
|
||||||
|
case NullaryOp::CALLDATASIZE:
|
||||||
|
m_output << "calldatasize()";
|
||||||
|
break;
|
||||||
|
case NullaryOp::CODESIZE:
|
||||||
|
m_output << "codesize()";
|
||||||
|
break;
|
||||||
|
case NullaryOp::RETURNDATASIZE:
|
||||||
|
m_output << "returndatasize()";
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ProtoConverter::visit(CopyFunc const& _x)
|
||||||
|
{
|
||||||
|
switch (_x.ct())
|
||||||
|
{
|
||||||
|
case CopyFunc::CALLDATA:
|
||||||
|
m_output << "calldatacopy";
|
||||||
|
break;
|
||||||
|
case CopyFunc::CODE:
|
||||||
|
m_output << "codecopy";
|
||||||
|
break;
|
||||||
|
case CopyFunc::RETURNDATA:
|
||||||
|
m_output << "returndatacopy";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
m_output << "(";
|
||||||
|
visit(_x.target());
|
||||||
|
m_output << ", ";
|
||||||
|
visit(_x.source());
|
||||||
|
m_output << ", ";
|
||||||
|
visit(_x.size());
|
||||||
|
m_output << ")\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProtoConverter::visit(ExtCodeCopy const& _x)
|
||||||
|
{
|
||||||
|
m_output << "extcodecopy";
|
||||||
|
m_output << "(";
|
||||||
|
visit(_x.addr());
|
||||||
|
m_output << ", ";
|
||||||
|
visit(_x.target());
|
||||||
|
m_output << ", ";
|
||||||
|
visit(_x.source());
|
||||||
|
m_output << ", ";
|
||||||
|
visit(_x.size());
|
||||||
|
m_output << ")\n";
|
||||||
|
}
|
||||||
|
|
||||||
void ProtoConverter::visit(LogFunc const& _x)
|
void ProtoConverter::visit(LogFunc const& _x)
|
||||||
{
|
{
|
||||||
switch (_x.num_topics())
|
switch (_x.num_topics())
|
||||||
@ -535,6 +590,12 @@ void ProtoConverter::visit(Statement const& _x)
|
|||||||
case Statement::kLogFunc:
|
case Statement::kLogFunc:
|
||||||
visit(_x.log_func());
|
visit(_x.log_func());
|
||||||
break;
|
break;
|
||||||
|
case Statement::kCopyFunc:
|
||||||
|
visit(_x.copy_func());
|
||||||
|
break;
|
||||||
|
case Statement::kExtcodeCopy:
|
||||||
|
visit(_x.extcode_copy());
|
||||||
|
break;
|
||||||
case Statement::STMT_ONEOF_NOT_SET:
|
case Statement::STMT_ONEOF_NOT_SET:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -69,6 +69,8 @@ private:
|
|||||||
void visit(TernaryOp const&);
|
void visit(TernaryOp const&);
|
||||||
void visit(NullaryOp const&);
|
void visit(NullaryOp const&);
|
||||||
void visit(LogFunc const&);
|
void visit(LogFunc const&);
|
||||||
|
void visit(CopyFunc const&);
|
||||||
|
void visit(ExtCodeCopy const&);
|
||||||
template <class T>
|
template <class T>
|
||||||
void visit(google::protobuf::RepeatedPtrField<T> const& _repeated_field);
|
void visit(google::protobuf::RepeatedPtrField<T> const& _repeated_field);
|
||||||
|
|
||||||
|
@ -106,6 +106,9 @@ message UnaryOp {
|
|||||||
MLOAD = 1;
|
MLOAD = 1;
|
||||||
SLOAD = 2;
|
SLOAD = 2;
|
||||||
ISZERO = 3;
|
ISZERO = 3;
|
||||||
|
CALLDATALOAD = 4;
|
||||||
|
EXTCODESIZE = 5;
|
||||||
|
EXTCODEHASH = 6;
|
||||||
}
|
}
|
||||||
required UOp op = 1;
|
required UOp op = 1;
|
||||||
required Expression operand = 2;
|
required Expression operand = 2;
|
||||||
@ -122,11 +125,33 @@ message TernaryOp {
|
|||||||
required Expression arg3 = 4;
|
required Expression arg3 = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message CopyFunc {
|
||||||
|
enum CopyType {
|
||||||
|
CALLDATA = 0;
|
||||||
|
CODE = 1;
|
||||||
|
RETURNDATA = 2;
|
||||||
|
}
|
||||||
|
required CopyType ct = 1;
|
||||||
|
required Expression target = 2;
|
||||||
|
required Expression source = 3;
|
||||||
|
required Expression size = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ExtCodeCopy {
|
||||||
|
required Expression addr = 1;
|
||||||
|
required Expression target = 2;
|
||||||
|
required Expression source = 3;
|
||||||
|
required Expression size = 4;
|
||||||
|
}
|
||||||
|
|
||||||
message NullaryOp {
|
message NullaryOp {
|
||||||
enum NOp {
|
enum NOp {
|
||||||
PC = 1;
|
PC = 1;
|
||||||
MSIZE = 2;
|
MSIZE = 2;
|
||||||
GAS = 3;
|
GAS = 3;
|
||||||
|
CALLDATASIZE = 4;
|
||||||
|
CODESIZE = 5;
|
||||||
|
RETURNDATASIZE = 6;
|
||||||
}
|
}
|
||||||
required NOp op = 1;
|
required NOp op = 1;
|
||||||
}
|
}
|
||||||
@ -210,6 +235,8 @@ message Statement {
|
|||||||
BreakStmt breakstmt = 8;
|
BreakStmt breakstmt = 8;
|
||||||
ContinueStmt contstmt = 9;
|
ContinueStmt contstmt = 9;
|
||||||
LogFunc log_func = 10;
|
LogFunc log_func = 10;
|
||||||
|
CopyFunc copy_func = 11;
|
||||||
|
ExtCodeCopy extcode_copy = 12;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user