Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d38937095e | ||
|
|
7d74d84717 | ||
|
|
ce1cc8adad |
@@ -4,3 +4,4 @@ onchain/out/
|
|||||||
offchain/target/
|
offchain/target/
|
||||||
|
|
||||||
.direnv
|
.direnv
|
||||||
|
.env
|
||||||
|
|||||||
@@ -9,6 +9,11 @@ import "forge-std/console.sol";
|
|||||||
* a token-based bytecode approach.
|
* a token-based bytecode approach.
|
||||||
*/
|
*/
|
||||||
contract Push3Interpreter {
|
contract Push3Interpreter {
|
||||||
|
// -----------------------------------------------------
|
||||||
|
// 0. CONSTANTS
|
||||||
|
// -----------------------------------------------------
|
||||||
|
uint8 internal constant OPCODE_BOOL_OFFSET = 0x6;
|
||||||
|
|
||||||
// -----------------------------------------------------
|
// -----------------------------------------------------
|
||||||
// 1. ENUMS
|
// 1. ENUMS
|
||||||
// -----------------------------------------------------
|
// -----------------------------------------------------
|
||||||
@@ -16,16 +21,34 @@ contract Push3Interpreter {
|
|||||||
NO_TAG, // 0
|
NO_TAG, // 0
|
||||||
INSTRUCTION, // 1
|
INSTRUCTION, // 1
|
||||||
INT_LITERAL, // 2
|
INT_LITERAL, // 2
|
||||||
SUBLIST // 3
|
SUBLIST, // 3
|
||||||
|
BOOL_LITERAL // 4
|
||||||
}
|
}
|
||||||
|
|
||||||
enum OpCode {
|
enum OpCode {
|
||||||
NOOP, // 0
|
NOOP, // 0
|
||||||
INTEGER_PLUS, // 1
|
INTEGER_PLUS, // 1
|
||||||
INTEGER_MINUS, // 2
|
INTEGER_MINUS, // 2
|
||||||
INTEGER_MULT, // 3
|
INTEGER_MULT, // 3
|
||||||
INTEGER_DUP, // 4
|
INTEGER_DUP, // 4
|
||||||
INTEGER_POP // 5
|
INTEGER_POP, // 5
|
||||||
|
BOOL_DUP, // OPCODE_BOOL_OFFSET + 0
|
||||||
|
BOOL_POP, // OPCODE_BOOL_OFFSET + 1
|
||||||
|
BOOL_SWAP, // OPCODE_BOOL_OFFSET + 2
|
||||||
|
BOOL_FLUSH, // OPCODE_BOOL_OFFSET + 3
|
||||||
|
BOOL_STACKDEPTH, // OPCODE_BOOL_OFFSET + 4
|
||||||
|
BOOL_NOT, // OPCODE_BOOL_OFFSET + 5
|
||||||
|
BOOL_AND, // OPCODE_BOOL_OFFSET + 6
|
||||||
|
BOOL_OR, // OPCODE_BOOL_OFFSET + 7
|
||||||
|
BOOL_EQ, // OPCODE_BOOL_OFFSET + 8
|
||||||
|
BOOL_FROMFLOAT, // OPCODE_BOOL_OFFSET + 9
|
||||||
|
BOOL_FROMINTEGER,// OPCODE_BOOL_OFFSET + 10
|
||||||
|
BOOL_ROT, // OPCODE_BOOL_OFFSET + 11
|
||||||
|
BOOL_SHOVE, // OPCODE_BOOL_OFFSET + 12
|
||||||
|
BOOL_YANK, // OPCODE_BOOL_OFFSET + 13
|
||||||
|
BOOL_YANKDUP, // OPCODE_BOOL_OFFSET + 14
|
||||||
|
BOOL_DEFINE, // OPCODE_BOOL_OFFSET + 15
|
||||||
|
BOOL_RAND // OPCODE_BOOL_OFFSET + 16
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------
|
// -----------------------------------------------------
|
||||||
@@ -85,11 +108,21 @@ contract Push3Interpreter {
|
|||||||
return makeDescriptor(CodeTag.INT_LITERAL, 0, 0, masked);
|
return makeDescriptor(CodeTag.INT_LITERAL, 0, 0, masked);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function makeBoolLiteral(bool val) internal pure returns (uint256) {
|
||||||
|
uint256 masked;
|
||||||
|
if (val) masked = uint256(1);
|
||||||
|
return makeDescriptor(CodeTag.BOOL_LITERAL, 0, 0, masked);
|
||||||
|
}
|
||||||
|
|
||||||
function extractInt32(uint256 desc) internal pure returns (int32) {
|
function extractInt32(uint256 desc) internal pure returns (int32) {
|
||||||
// read the low 32 bits
|
// read the low 32 bits
|
||||||
return int32(uint32(getLow184(desc)));
|
return int32(uint32(getLow184(desc)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function extractBool(uint256 desc) internal pure returns (bool) {
|
||||||
|
return desc & 1 == 1;
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------
|
// -----------------------------------------------------
|
||||||
// 3. HELPER READS
|
// 3. HELPER READS
|
||||||
// -----------------------------------------------------
|
// -----------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user