instruction_table
Comptime generated table from EVM instructions.
InstructionTable.generateTable(.{
.STOP = .{ .execution = instructions.control.stopInstruction, .max_stack = maxStack(1024, 0, 0) },
.ADD = .{ .execution = instructions.arithmetic.addInstruction, .max_stack = maxStack(1024, 2, 1) },
.MUL = .{ .execution = instructions.arithmetic.mulInstruction, .max_stack = maxStack(1024, 2, 1) },
.SUB = .{ .execution = instructions.arithmetic.subInstruction, .max_stack = maxStack(1024, 2, 1) },
.DIV = .{ .execution = instructions.arithmetic.divInstruction, .max_stack = maxStack(1024, 2, 1) },
.SDIV = .{ .execution = instructions.arithmetic.signedDivInstruction, .max_stack = maxStack(1024, 2, 1) },
.MOD = .{ .execution = instructions.arithmetic.modInstruction, .max_stack = maxStack(1024, 2, 1) },
.SMOD = .{ .execution = instructions.arithmetic.signedModInstruction, .max_stack = maxStack(1024, 2, 1) },
.ADDMOD = .{ .execution = instructions.arithmetic.modAdditionInstruction, .max_stack = maxStack(1024, 3, 1) },
.MULMOD = .{ .execution = instructions.arithmetic.modMultiplicationInstruction, .max_stack = maxStack(1024, 3, 1) },
.EXP = .{ .execution = instructions.arithmetic.exponentInstruction, .max_stack = maxStack(1024, 2, 1) },
.SIGNEXTEND = .{ .execution = instructions.arithmetic.signExtendInstruction, .max_stack = maxStack(1024, 2, 1) },
.LT = .{ .execution = instructions.bitwise.lowerThanInstruction, .max_stack = maxStack(1024, 2, 1) },
.GT = .{ .execution = instructions.bitwise.greaterThanInstruction, .max_stack = maxStack(1024, 2, 1) },
.SLT = .{ .execution = instructions.bitwise.signedLowerThanInstruction, .max_stack = maxStack(1024, 2, 1) },
.SGT = .{ .execution = instructions.bitwise.signedGreaterThanInstruction, .max_stack = maxStack(1024, 2, 1) },
.EQ = .{ .execution = instructions.bitwise.equalInstruction, .max_stack = maxStack(1024, 2, 1) },
.ISZERO = .{ .execution = instructions.bitwise.isZeroInstruction, .max_stack = maxStack(1024, 2, 1) },
.AND = .{ .execution = instructions.bitwise.andInstruction, .max_stack = maxStack(1024, 2, 1) },
.OR = .{ .execution = instructions.bitwise.orInstruction, .max_stack = maxStack(1024, 2, 1) },
.XOR = .{ .execution = instructions.bitwise.xorInstruction, .max_stack = maxStack(1024, 2, 1) },
.NOT = .{ .execution = instructions.bitwise.notInstruction, .max_stack = maxStack(1024, 2, 1) },
.BYTE = .{ .execution = instructions.bitwise.byteInstruction, .max_stack = maxStack(1024, 2, 1) },
.SHL = .{ .execution = instructions.bitwise.shiftLeftInstruction, .max_stack = maxStack(1024, 2, 1) },
.SHR = .{ .execution = instructions.bitwise.shiftRightInstruction, .max_stack = maxStack(1024, 2, 1) },
.SAR = .{ .execution = instructions.bitwise.signedShiftRightInstruction, .max_stack = maxStack(1024, 2, 1) },
.KECCAK256 = .{ .execution = instructions.system.keccakInstruction, .max_stack = maxStack(1024, 2, 1) },
.ADDRESS = .{ .execution = instructions.system.addressInstruction, .max_stack = maxStack(1024, 0, 1) },
.BALANCE = .{ .execution = instructions.host.balanceInstruction, .max_stack = maxStack(1024, 1, 1) },
.ORIGIN = .{ .execution = instructions.enviroment.originInstruction, .max_stack = maxStack(1024, 0, 1) },
.CALLER = .{ .execution = instructions.system.callerInstruction, .max_stack = maxStack(1024, 0, 1) },
.CALLVALUE = .{ .execution = instructions.system.callValueInstruction, .max_stack = maxStack(1024, 0, 1) },
.CALLDATALOAD = .{ .execution = instructions.system.callDataLoadInstruction, .max_stack = maxStack(1024, 1, 1) },
.CALLDATASIZE = .{ .execution = instructions.system.callDataSizeInstruction, .max_stack = maxStack(1024, 0, 1) },
.CALLDATACOPY = .{ .execution = instructions.system.callDataCopyInstruction, .max_stack = maxStack(1024, 3, 0) },
.CODESIZE = .{ .execution = instructions.system.codeSizeInstruction, .max_stack = maxStack(1024, 0, 1) },
.CODECOPY = .{ .execution = instructions.system.codeCopyInstruction, .max_stack = maxStack(1024, 3, 0) },
.GASPRICE = .{ .execution = instructions.enviroment.gasPriceInstruction, .max_stack = maxStack(1024, 0, 1) },
.EXTCODESIZE = .{ .execution = instructions.host.extCodeSizeInstruction, .max_stack = maxStack(1024, 1, 1) },
.EXTCODECOPY = .{ .execution = instructions.host.extCodeSizeInstruction, .max_stack = maxStack(1024, 4, 0) },
.RETURNDATASIZE = .{ .execution = instructions.system.returnDataSizeInstruction, .max_stack = maxStack(1024, 0, 1) },
.RETURNDATACOPY = .{ .execution = instructions.system.returnDataCopyInstruction, .max_stack = maxStack(1024, 3, 0) },
.EXTCODEHASH = .{ .execution = instructions.host.extCodeHashInstruction, .max_stack = maxStack(1024, 1, 1) },
.BLOCKHASH = .{ .execution = instructions.host.blockHashInstruction, .max_stack = maxStack(1024, 1, 1) },
.COINBASE = .{ .execution = instructions.enviroment.coinbaseInstruction, .max_stack = maxStack(1024, 0, 1) },
.TIMESTAMP = .{ .execution = instructions.enviroment.timestampInstruction, .max_stack = maxStack(1024, 0, 1) },
.NUMBER = .{ .execution = instructions.enviroment.blockNumberInstruction, .max_stack = maxStack(1024, 0, 1) },
.PREVRANDAO = .{ .execution = instructions.enviroment.difficultyInstruction, .max_stack = maxStack(1024, 0, 1) },
.GASLIMIT = .{ .execution = instructions.enviroment.gasLimitInstruction, .max_stack = maxStack(1024, 0, 1) },
.CHAINID = .{ .execution = instructions.enviroment.chainIdInstruction, .max_stack = maxStack(1024, 0, 1) },
.SELFBALANCE = .{ .execution = instructions.host.selfBalanceInstruction, .max_stack = maxStack(1024, 0, 1) },
.BASEFEE = .{ .execution = instructions.enviroment.baseFeeInstruction, .max_stack = maxStack(1024, 0, 1) },
.BLOBHASH = .{ .execution = instructions.enviroment.blobHashInstruction, .max_stack = maxStack(1024, 1, 1) },
.BLOBBASEFEE = .{ .execution = instructions.enviroment.blobBaseFeeInstruction, .max_stack = maxStack(1024, 0, 1) },
.POP = .{ .execution = instructions.stack.popInstruction, .max_stack = maxStack(1024, 1, 0) },
.MLOAD = .{ .execution = instructions.memory.mloadInstruction, .max_stack = maxStack(1024, 1, 1) },
.MSTORE = .{ .execution = instructions.memory.mstoreInstruction, .max_stack = maxStack(1024, 2, 0) },
.MSTORE8 = .{ .execution = instructions.memory.mstore8Instruction, .max_stack = maxStack(1024, 2, 0) },
.SLOAD = .{ .execution = instructions.host.sloadInstruction, .max_stack = maxStack(1024, 1, 1) },
.SSTORE = .{ .execution = instructions.host.sstoreInstruction, .max_stack = maxStack(1024, 2, 0) },
.JUMP = .{ .execution = instructions.control.jumpInstruction, .max_stack = maxStack(1024, 1, 0) },
.JUMPI = .{ .execution = instructions.control.conditionalJumpInstruction, .max_stack = maxStack(1024, 2, 0) },
.PC = .{ .execution = instructions.control.programCounterInstruction, .max_stack = maxStack(1024, 0, 1) },
.MSIZE = .{ .execution = instructions.memory.msizeInstruction, .max_stack = maxStack(1024, 0, 1) },
.GAS = .{ .execution = instructions.system.gasInstruction, .max_stack = maxStack(1024, 0, 1) },
.JUMPDEST = .{ .execution = instructions.control.jumpDestInstruction, .max_stack = maxStack(1024, 0, 0) },
.TLOAD = .{ .execution = instructions.host.tloadInstruction, .max_stack = maxStack(1024, 1, 1) },
.TSTORE = .{ .execution = instructions.host.tstoreInstruction, .max_stack = maxStack(1024, 2, 0) },
.MCOPY = .{ .execution = instructions.memory.mcopyInstruction, .max_stack = maxStack(1024, 3, 0) },
.PUSH0 = .{ .execution = instructions.stack.pushZeroInstruction, .max_stack = maxStack(1024, 0, 1) },
.PUSH1 = .{ .execution = makePushInstruction(1), .max_stack = maxStack(1024, 0, 1) },
.PUSH2 = .{ .execution = makePushInstruction(2), .max_stack = maxStack(1024, 0, 1) },
.PUSH3 = .{ .execution = makePushInstruction(3), .max_stack = maxStack(1024, 0, 1) },
.PUSH4 = .{ .execution = makePushInstruction(4), .max_stack = maxStack(1024, 0, 1) },
.PUSH5 = .{ .execution = makePushInstruction(5), .max_stack = maxStack(1024, 0, 1) },
.PUSH6 = .{ .execution = makePushInstruction(6), .max_stack = maxStack(1024, 0, 1) },
.PUSH7 = .{ .execution = makePushInstruction(7), .max_stack = maxStack(1024, 0, 1) },
.PUSH8 = .{ .execution = makePushInstruction(8), .max_stack = maxStack(1024, 0, 1) },
.PUSH9 = .{ .execution = makePushInstruction(9), .max_stack = maxStack(1024, 0, 1) },
.PUSH10 = .{ .execution = makePushInstruction(10), .max_stack = maxStack(1024, 0, 1) },
.PUSH11 = .{ .execution = makePushInstruction(11), .max_stack = maxStack(1024, 0, 1) },
.PUSH12 = .{ .execution = makePushInstruction(12), .max_stack = maxStack(1024, 0, 1) },
.PUSH13 = .{ .execution = makePushInstruction(13), .max_stack = maxStack(1024, 0, 1) },
.PUSH14 = .{ .execution = makePushInstruction(14), .max_stack = maxStack(1024, 0, 1) },
.PUSH15 = .{ .execution = makePushInstruction(15), .max_stack = maxStack(1024, 0, 1) },
.PUSH16 = .{ .execution = makePushInstruction(16), .max_stack = maxStack(1024, 0, 1) },
.PUSH17 = .{ .execution = makePushInstruction(17), .max_stack = maxStack(1024, 0, 1) },
.PUSH18 = .{ .execution = makePushInstruction(18), .max_stack = maxStack(1024, 0, 1) },
.PUSH19 = .{ .execution = makePushInstruction(19), .max_stack = maxStack(1024, 0, 1) },
.PUSH20 = .{ .execution = makePushInstruction(20), .max_stack = maxStack(1024, 0, 1) },
.PUSH21 = .{ .execution = makePushInstruction(21), .max_stack = maxStack(1024, 0, 1) },
.PUSH22 = .{ .execution = makePushInstruction(22), .max_stack = maxStack(1024, 0, 1) },
.PUSH23 = .{ .execution = makePushInstruction(23), .max_stack = maxStack(1024, 0, 1) },
.PUSH24 = .{ .execution = makePushInstruction(24), .max_stack = maxStack(1024, 0, 1) },
.PUSH25 = .{ .execution = makePushInstruction(25), .max_stack = maxStack(1024, 0, 1) },
.PUSH26 = .{ .execution = makePushInstruction(26), .max_stack = maxStack(1024, 0, 1) },
.PUSH27 = .{ .execution = makePushInstruction(27), .max_stack = maxStack(1024, 0, 1) },
.PUSH28 = .{ .execution = makePushInstruction(28), .max_stack = maxStack(1024, 0, 1) },
.PUSH29 = .{ .execution = makePushInstruction(29), .max_stack = maxStack(1024, 0, 1) },
.PUSH30 = .{ .execution = makePushInstruction(30), .max_stack = maxStack(1024, 0, 1) },
.PUSH31 = .{ .execution = makePushInstruction(31), .max_stack = maxStack(1024, 0, 1) },
.PUSH32 = .{ .execution = makePushInstruction(32), .max_stack = maxStack(1024, 0, 1) },
.DUP1 = .{ .execution = makeDupInstruction(1), .max_stack = maxStack(1024, 1, 2) },
.DUP2 = .{ .execution = makeDupInstruction(2), .max_stack = maxStack(1024, 2, 3) },
.DUP3 = .{ .execution = makeDupInstruction(3), .max_stack = maxStack(1024, 3, 4) },
.DUP4 = .{ .execution = makeDupInstruction(4), .max_stack = maxStack(1024, 4, 5) },
.DUP5 = .{ .execution = makeDupInstruction(5), .max_stack = maxStack(1024, 5, 6) },
.DUP6 = .{ .execution = makeDupInstruction(6), .max_stack = maxStack(1024, 6, 7) },
.DUP7 = .{ .execution = makeDupInstruction(7), .max_stack = maxStack(1024, 7, 8) },
.DUP8 = .{ .execution = makeDupInstruction(8), .max_stack = maxStack(1024, 8, 9) },
.DUP9 = .{ .execution = makeDupInstruction(9), .max_stack = maxStack(1024, 10, 10) },
.DUP10 = .{ .execution = makeDupInstruction(10), .max_stack = maxStack(1024, 10, 11) },
.DUP11 = .{ .execution = makeDupInstruction(11), .max_stack = maxStack(1024, 11, 12) },
.DUP12 = .{ .execution = makeDupInstruction(12), .max_stack = maxStack(1024, 12, 13) },
.DUP13 = .{ .execution = makeDupInstruction(13), .max_stack = maxStack(1024, 13, 14) },
.DUP14 = .{ .execution = makeDupInstruction(14), .max_stack = maxStack(1024, 14, 15) },
.DUP15 = .{ .execution = makeDupInstruction(15), .max_stack = maxStack(1024, 15, 16) },
.DUP16 = .{ .execution = makeDupInstruction(16), .max_stack = maxStack(1024, 16, 17) },
.SWAP1 = .{ .execution = makeSwapInstruction(1), .max_stack = maxStack(1024, 2, 2) },
.SWAP2 = .{ .execution = makeSwapInstruction(2), .max_stack = maxStack(1024, 3, 3) },
.SWAP3 = .{ .execution = makeSwapInstruction(3), .max_stack = maxStack(1024, 4, 4) },
.SWAP4 = .{ .execution = makeSwapInstruction(4), .max_stack = maxStack(1024, 5, 5) },
.SWAP5 = .{ .execution = makeSwapInstruction(5), .max_stack = maxStack(1024, 6, 6) },
.SWAP6 = .{ .execution = makeSwapInstruction(6), .max_stack = maxStack(1024, 7, 7) },
.SWAP7 = .{ .execution = makeSwapInstruction(7), .max_stack = maxStack(1024, 8, 8) },
.SWAP8 = .{ .execution = makeSwapInstruction(8), .max_stack = maxStack(1024, 9, 9) },
.SWAP9 = .{ .execution = makeSwapInstruction(9), .max_stack = maxStack(1024, 10, 10) },
.SWAP10 = .{ .execution = makeSwapInstruction(10), .max_stack = maxStack(1024, 11, 11) },
.SWAP11 = .{ .execution = makeSwapInstruction(11), .max_stack = maxStack(1024, 12, 12) },
.SWAP12 = .{ .execution = makeSwapInstruction(12), .max_stack = maxStack(1024, 13, 13) },
.SWAP13 = .{ .execution = makeSwapInstruction(13), .max_stack = maxStack(1024, 14, 14) },
.SWAP14 = .{ .execution = makeSwapInstruction(14), .max_stack = maxStack(1024, 15, 15) },
.SWAP15 = .{ .execution = makeSwapInstruction(15), .max_stack = maxStack(1024, 16, 16) },
.SWAP16 = .{ .execution = makeSwapInstruction(16), .max_stack = maxStack(1024, 17, 17) },
.LOG0 = .{ .execution = makeLogInstruction(0), .max_stack = maxStack(1024, 2, 0) },
.LOG1 = .{ .execution = makeLogInstruction(1), .max_stack = maxStack(1024, 3, 0) },
.LOG2 = .{ .execution = makeLogInstruction(2), .max_stack = maxStack(1024, 4, 0) },
.LOG3 = .{ .execution = makeLogInstruction(3), .max_stack = maxStack(1024, 5, 0) },
.LOG4 = .{ .execution = makeLogInstruction(4), .max_stack = maxStack(1024, 6, 0) },
.CREATE = .{ .execution = makeCreateInstruction(false), .max_stack = maxStack(1024, 3, 1) },
.CALL = .{ .execution = instructions.contract.callInstruction, .max_stack = maxStack(1024, 7, 1) },
.CALLCODE = .{ .execution = instructions.contract.callCodeInstruction, .max_stack = maxStack(1024, 7, 1) },
.RETURN = .{ .execution = instructions.control.returnInstruction, .max_stack = maxStack(1024, 2, 0) },
.DELEGATECALL = .{ .execution = instructions.contract.delegateCallInstruction, .max_stack = maxStack(1024, 6, 1) },
.CREATE2 = .{ .execution = makeCreateInstruction(true), .max_stack = maxStack(1024, 6, 0) },
.STATICCALL = .{ .execution = instructions.contract.staticCallInstruction, .max_stack = maxStack(1024, 6, 1) },
.REVERT = .{ .execution = instructions.control.revertInstruction, .max_stack = maxStack(1024, 2, 0) },
.INVALID = .{ .execution = instructions.control.invalidInstruction, .max_stack = maxStack(1024, 0, 0) },
.SELFDESTRUCT = .{ .execution = instructions.host.selfDestructInstruction, .max_stack = maxStack(1024, 1, 0) },
})
Opcodes
EVM Opcodes.
Properties
enum {
STOP = 0x00
ADD = 0x01
MUL = 0x02
SUB = 0x03
DIV = 0x04
SDIV = 0x05
MOD = 0x06
SMOD = 0x07
ADDMOD = 0x08
MULMOD = 0x09
EXP = 0x0a
SIGNEXTEND = 0x0b
LT = 0x10
GT = 0x11
SLT = 0x12
SGT = 0x13
EQ = 0x14
ISZERO = 0x15
AND = 0x16
OR = 0x17
XOR = 0x18
NOT = 0x19
BYTE = 0x1a
SHL = 0x1b
SHR = 0x1c
SAR = 0x1d
KECCAK256 = 0x20
ADDRESS = 0x30
BALANCE = 0x31
ORIGIN = 0x32
CALLER = 0x33
CALLVALUE = 0x34
CALLDATALOAD = 0x35
CALLDATASIZE = 0x36
CALLDATACOPY = 0x37
CODESIZE = 0x38
CODECOPY = 0x39
GASPRICE = 0x3a
EXTCODESIZE = 0x3b
EXTCODECOPY = 0x3c
RETURNDATASIZE = 0x3d
RETURNDATACOPY = 0x3e
EXTCODEHASH = 0x3f
BLOCKHASH = 0x40
COINBASE = 0x41
TIMESTAMP = 0x42
NUMBER = 0x43
PREVRANDAO = 0x44
GASLIMIT = 0x45
CHAINID = 0x46
SELFBALANCE = 0x47
BASEFEE = 0x48
BLOBHASH = 0x49
BLOBBASEFEE = 0x4a
POP = 0x50
MLOAD = 0x51
MSTORE = 0x52
MSTORE8 = 0x53
SLOAD = 0x54
SSTORE = 0x55
JUMP = 0x56
JUMPI = 0x57
PC = 0x58
MSIZE = 0x59
GAS = 0x5a
JUMPDEST = 0x5b
TLOAD = 0x5c
TSTORE = 0x5d
MCOPY = 0x5e
PUSH0 = 0x5f
PUSH1 = 0x60
PUSH2 = 0x61
PUSH3 = 0x62
PUSH4 = 0x63
PUSH5 = 0x64
PUSH6 = 0x65
PUSH7 = 0x66
PUSH8 = 0x67
PUSH9 = 0x68
PUSH10 = 0x69
PUSH11 = 0x6a
PUSH12 = 0x6b
PUSH13 = 0x6c
PUSH14 = 0x6d
PUSH15 = 0x6e
PUSH16 = 0x6f
PUSH17 = 0x70
PUSH18 = 0x71
PUSH19 = 0x72
PUSH20 = 0x73
PUSH21 = 0x74
PUSH22 = 0x75
PUSH23 = 0x76
PUSH24 = 0x77
PUSH25 = 0x78
PUSH26 = 0x79
PUSH27 = 0x7a
PUSH28 = 0x7b
PUSH29 = 0x7c
PUSH30 = 0x7d
PUSH31 = 0x7e
PUSH32 = 0x7f
DUP1 = 0x80
DUP2 = 0x81
DUP3 = 0x82
DUP4 = 0x83
DUP5 = 0x84
DUP6 = 0x85
DUP7 = 0x86
DUP8 = 0x87
DUP9 = 0x88
DUP10 = 0x89
DUP11 = 0x8a
DUP12 = 0x8b
DUP13 = 0x8c
DUP14 = 0x8d
DUP15 = 0x8e
DUP16 = 0x8f
SWAP1 = 0x90
SWAP2 = 0x91
SWAP3 = 0x92
SWAP4 = 0x93
SWAP5 = 0x94
SWAP6 = 0x95
SWAP7 = 0x96
SWAP8 = 0x97
SWAP9 = 0x98
SWAP10 = 0x99
SWAP11 = 0x9a
SWAP12 = 0x9b
SWAP13 = 0x9c
SWAP14 = 0x9d
SWAP15 = 0x9e
SWAP16 = 0x9f
LOG0 = 0xa0
LOG1 = 0xa1
LOG2 = 0xa2
LOG3 = 0xa3
LOG4 = 0xa4
CREATE = 0xf0
CALL = 0xf1
CALLCODE = 0xf2
RETURN = 0xf3
DELEGATECALL = 0xf4
CREATE2 = 0xf5
STATICCALL = 0xfa
REVERT = 0xfd
INVALID = 0xfe
SELFDESTRUCT = 0xff
}
ToOpcode
Converts u8
to associated opcode.
Will return null for unknown opcodes
Signature
pub fn toOpcode(num: u8) ?Opcodes
InstructionTable
EVM instruction table.
Properties
struct {
/// Array of instructions.
inner: [256]Operations
}
GenerateTable
Generates the instruction opcode table.
This is a similar implementation to std.enums.directEnumArray
Signature
pub fn generateTable(fields: EnumFieldStruct(Opcodes, Operations, null)) InstructionTable
GetInstruction
Gets the associated operation for the provided opcode.
Signature
pub fn getInstruction(self: @This(), opcode: u8) Operations
Operations
Opcode operations and checks.
Properties
struct {
/// The execution function attached to the opcode.
execution: *const fn (ctx: *Interpreter) anyerror!void
/// The max allowed size of the stack
max_stack: usize
}
MakeDupInstruction
Creates the dup instructions for the instruction table.
Signature
pub fn makeDupInstruction(comptime dup_size: u8) *const fn (ctx: *Interpreter) anyerror!void
Dup
Signature
pub fn dup(self: *Interpreter) anyerror!void
MakePushInstruction
Creates the push instructions for the instruction table.
Signature
pub fn makePushInstruction(comptime push_size: u8) *const fn (ctx: *Interpreter) anyerror!void
Push
Signature
pub fn push(self: *Interpreter) anyerror!void
MakeSwapInstruction
Creates the swap instructions for the instruction table.
Signature
pub fn makeSwapInstruction(comptime swap_size: u8) *const fn (ctx: *Interpreter) anyerror!void
Swap
Signature
pub fn swap(self: *Interpreter) anyerror!void
MakeLogInstruction
Creates the log instructions for the instruction table.
Signature
pub fn makeLogInstruction(comptime swap_size: u8) *const fn (ctx: *Interpreter) anyerror!void
Log
Signature
pub fn log(self: *Interpreter) anyerror!void
MakeCreateInstruction
Creates the log instructions for the instruction table.
Signature
pub fn makeCreateInstruction(comptime is_create2: bool) *const fn (ctx: *Interpreter) anyerror!void
Log
Signature
pub fn log(self: *Interpreter) anyerror!void
MaxStack
Callculates the max avaliable size of the stack for the operation to execute.
Signature
pub fn maxStack(comptime limit: comptime_int, comptime pop: comptime_int, comptime push: comptime_int) usize