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
+1
View File
@@ -4,3 +4,4 @@ onchain/out/
offchain/target/
.direnv
.env
+40 -7
View File
@@ -9,6 +9,11 @@ import "forge-std/console.sol";
* a token-based bytecode approach.
*/
contract Push3Interpreter {
// -----------------------------------------------------
// 0. CONSTANTS
// -----------------------------------------------------
uint8 internal constant OPCODE_BOOL_OFFSET = 0x6;
// -----------------------------------------------------
// 1. ENUMS
// -----------------------------------------------------
@@ -16,16 +21,34 @@ contract Push3Interpreter {
NO_TAG, // 0
INSTRUCTION, // 1
INT_LITERAL, // 2
SUBLIST // 3
SUBLIST, // 3
BOOL_LITERAL // 4
}
enum OpCode {
NOOP, // 0
INTEGER_PLUS, // 1
INTEGER_MINUS, // 2
INTEGER_MULT, // 3
INTEGER_DUP, // 4
INTEGER_POP // 5
NOOP, // 0
INTEGER_PLUS, // 1
INTEGER_MINUS, // 2
INTEGER_MULT, // 3
INTEGER_DUP, // 4
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);
}
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) {
// read the low 32 bits
return int32(uint32(getLow184(desc)));
}
function extractBool(uint256 desc) internal pure returns (bool) {
return desc & 1 == 1;
}
// -----------------------------------------------------
// 3. HELPER READS
// -----------------------------------------------------