Author SHA1 Message Date
navelbuffle d38937095e extend Descriptor with a boolean type 2025-01-03 09:21:57 +03:00
navelbuffle 7d74d84717 extend CodeTag and OpCode enums with a boolean type 2025-01-03 08:34:30 +03:00
navelbuffle ce1cc8adad extend gitignore 2024-12-31 02:41:28 +03:00
2 changed files with 42 additions and 8 deletions
+2 -1
View File
@@ -3,4 +3,5 @@ onchain/out/
offchain/target/ offchain/target/
.direnv .direnv
.env
+40 -7
View File
@@ -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
// ----------------------------------------------------- // -----------------------------------------------------