Module Ruva::VM
In: lib/ruva/class.rb
lib/ruva/stack.rb
lib/ruva/opcodes.rb
lib/ruva/class_loader.rb
lib/ruva/vm.rb
lib/ruva/types.rb
lib/ruva/class_pool.rb
lib/ruva/vmerrors.rb

Classes and Modules

Module Ruva::VM::Helpers
Module Ruva::VM::Opcodes
Module Ruva::VM::Stack
Module Ruva::VM::Types
Class Ruva::VM::AbnormalTermination
Class Ruva::VM::AbstractMethodError
Class Ruva::VM::BootClass
Class Ruva::VM::Class
Class Ruva::VM::ClassFormatError
Class Ruva::VM::ClassLoader
Class Ruva::VM::ClassPoolManager
Class Ruva::VM::DuplicateClassDefError
Class Ruva::VM::IllegalAccessError
Class Ruva::VM::IllegalArgumentError
Class Ruva::VM::IncompatibleClassChangeError
Class Ruva::VM::NoClassDefFoundError
Class Ruva::VM::NoSuchMethodError
Class Ruva::VM::NullPointerError
Class Ruva::VM::RuntimeError
Class Ruva::VM::StackOverflowError
Class Ruva::VM::StackStateError
Class Ruva::VM::StackUnderflowError
Class Ruva::VM::SystemStackError
Class Ruva::VM::UnsatisfiedLinkError
Class Ruva::VM::VMError
Class Ruva::VM::VMException

Constants

OPMAP = { # byte => [mnemonic, argc] 0x00 => ['NOP', 0], 0x01 => ['ACONST_NULL', 0], 0x02 => ['ICONST_M1', 0], 0x03 => ['ICONST_0', 0], 0x04 => ['ICONST_1', 0], 0x05 => ['ICONST_2', 0], 0x06 => ['ICONST_3', 0], 0x07 => ['ICONST_4', 0], 0x08 => ['ICONST_5', 0], 0x09 => ['LCONST_0', 0], 0x0a => ['LCONST_1', 0], 0x0b => ['FCONST_0', 0], 0x0c => ['FCONST_1', 0], 0x0d => ['FCONST_2', 0], 0x0e => ['DCONST_0', 0], 0x0f => ['DCONST_1', 0], 0x10 => ['BIPUSH', 1], 0x11 => ['SIPUSH', 2], 0x12 => ['LDC', 1], 0x13 => ['LDCW', 2], 0x14 => ['LDC2W', 2], 0x15 => ['ILOAD', 1], 0x16 => ['LLOAD', 1], 0x17 => ['FLOAD', 1], 0x18 => ['DLOAD', 1], 0x19 => ['ALOAD', 1], 0x1a => ['ILOAD_0', 0], 0x1b => ['ILOAD_1', 0], 0x1c => ['ILOAD_2', 0], 0x1d => ['ILOAD_3', 0], 0x1e => ['LLOAD_0', 0], 0x1f => ['LLOAD_1', 0], 0x20 => ['LLOAD_2', 0], 0x21 => ['LLOAD_3', 0], 0x22 => ['FLOAD_0', 0], 0x23 => ['FLOAD_1', 0], 0x24 => ['FLOAD_2', 0], 0x25 => ['FLOAD_3', 0], 0x26 => ['DLOAD_0', 0], 0x27 => ['DLOAD_1', 0], 0x28 => ['DLOAD_2', 0], 0x29 => ['DLOAD_3', 0], 0x2a => ['ALOAD_0', 0], 0x2b => ['ALOAD_1', 0], 0x2c => ['ALOAD_2', 0], 0x2d => ['ALOAD_3', 0], 0x2e => ['IALOAD', 0], 0x2f => ['LALOAD', 0], 0x30 => ['FALOAD', 0], 0x31 => ['DALOAD', 0], 0x32 => ['AALOAD', 0], 0x33 => ['BALOAD', 0], 0x34 => ['CALOAD', 0], 0x35 => ['SALOAD', 0], 0x36 => ['ISTORE', 1], 0x37 => ['LSTORE', 1], 0x38 => ['FSTORE', 1], 0x39 => ['DSTORE', 1], 0x3a => ['ASTORE', 1], 0x3b => ['ISTORE_0', 0], 0x3c => ['ISTORE_1', 0], 0x3d => ['ISTORE_2', 0], 0x3e => ['ISTORE_3', 0], 0x3f => ['LSTORE_0', 0], 0x40 => ['LSTORE_1', 0], 0x41 => ['LSTORE_2', 0], 0x42 => ['LSTORE_3', 0], 0x43 => ['FSTORE_0', 0], 0x44 => ['FSTORE_1', 0], 0x45 => ['FSTORE_2', 0], 0x46 => ['FSTORE_3', 0], 0x47 => ['DSTORE_0', 0], 0x48 => ['DSTORE_1', 0], 0x49 => ['DSTORE_2', 0], 0x50 => ['DSTORE_3', 0], 0x4b => ['ASTORE_0', 0], 0x4c => ['ASTORE_1', 0], 0x4d => ['ASTORE_2', 0], 0x4e => ['ASTORE_3', 0], 0x4f => ['IASTORE', 0], 0x50 => ['LASTORE', 0], 0x51 => ['FASTORE', 0], 0x52 => ['DASTORE', 0], 0x53 => ['AASTORE', 0], 0x54 => ['BASTORE', 0], 0x55 => ['CASTORE', 0], 0x56 => ['SASTORE', 0], 0x57 => ['POP', 0], 0x58 => ['POP2', 0], 0x59 => ['DUP', 0], 0x5a => ['DUPX1', 0], 0x5b => ['DUPX2', 0], 0x5c => ['DUP2', 0], 0x5d => ['DUP2X1', [ 0]], 0x5e => ['DUP2X2', [ 0]], 0x5f => ['SWAP', 0], 0x60 => ['IADD', 0], 0x61 => ['LADD', 0], 0x62 => ['FADD', 0], 0x63 => ['DADD', 0], 0x64 => ['ISUB', 0], 0x65 => ['LSUB', 0], 0x66 => ['FSUB', 0], 0x67 => ['DSUB', 0], 0x68 => ['IMUL', 0], 0x69 => ['LMUL', 0], 0x6a => ['FMUL', 0], 0x6b => ['DMUL', 0], 0x6c => ['IDIV', 0], 0x6d => ['LDIV', 0], 0x6e => ['FDIV', 0], 0x6f => ['DDIV', 0], 0x70 => ['IREM', 0], 0x71 => ['LREM', 0], 0x72 => ['FREM', 0], 0x73 => ['DREM', 0], 0x74 => ['INEG', 0], 0x75 => ['LNEG', 0], 0x76 => ['FNEG', 0], 0x77 => ['DNEG', 0], 0x78 => ['ISHL', 0], 0x79 => ['LSHL', 0], 0x7a => ['ISHR', 0], 0x7b => ['LSHR', 0], 0x7c => ['IUSHR', 0], 0x7d => ['LUSHR', 0], 0x7e => ['IAND', 0], 0x7f => ['LAND', 0], 0x80 => ['IOR', 0], 0x82 => ['IXOR', 0], 0x81 => ['LOR', 0], 0x83 => ['LXOR', 0], 0x84 => ['IINC', 2], 0x85 => ['I2L', 0], 0x86 => ['I2F', 0], 0x87 => ['I2D', 0], 0x88 => ['L2I', 0], 0x89 => ['L2F', 0], 0x8a => ['L2D', 0], 0x8b => ['F2I', 0], 0x8c => ['F2L', 0], 0x8d => ['F2D', 0], 0x8e => ['D2I', 0], 0x8f => ['D2L', 0], 0x90 => ['D2F', 0], 0x91 => ['I2B', 0], 0x92 => ['I2C', 0], 0x93 => ['I2S', 0], 0x94 => ['LCMP', 0], 0x95 => ['FCMPL', 0], 0x96 => ['FCMPG', 0], 0x97 => ['DCMPL', 0], 0x98 => ['DCMPG', 0], 0x99 => ['IFEQ', 2], 0x9a => ['IFNE', 2], 0x9b => ['IFLT', 2], 0x9c => ['IFGE', 2], 0x9d => ['IFGT', 2], 0x9e => ['IFLE', 2], 0x9f => ['IFICMPEQ', 2], 0xa0 => ['IFICMPNE', 2], 0xa1 => ['IFICMPLT', 2], 0xa2 => ['IFICMPGE', 2], 0xa3 => ['IFICMPGT', 2], 0xa4 => ['IFICMPLE', 2], 0xa5 => ['IFACMPEQ', 2], 0xa6 => ['IFACMPNE', 2], 0xa7 => ['GOTO', 2], 0xa8 => ['JSR', 2], 0xa9 => ['RET', 1], 0xaa => ['TABLESWITCH', 0], 0xab => ['LOOKUPSWITCH', 0], 0xac => ['IRETURN', 0], 0xad => ['LRETURN', 0], 0xae => ['FRETURN', 0], 0xaf => ['DRETURN', 0], 0xb1 => ['RETURN', 0], 0xb2 => ['GETSTATIC', 2], 0xb4 => ['GETFIELD', 2], 0xb0 => ['ARETURN', 0], 0xb3 => ['PUTSTATIC', 2], 0xb5 => ['PUTFIELD', 2], 0xb6 => ['INVOKEVIRTUAL', 2], 0xb7 => ['INVOKESPECIAL', 2], 0xb8 => ['INVOKESTATIC', 2], 0xb9 => ['INVOKEINTERFACE', 4], 0xba => ['INVOKEDYNAMIC', [ 2]], 0xbb => ['NEW', 2], 0xbc => ['NEWARRAY', 1], 0xbd => ['ANEWARRAY', 2], 0xbe => ['ARRAYLENGTH', 0], 0xbf => ['ATHROW', 0], 0xc8 => ['GOTO_W', 4], 0xc0 => ['CHECKCAST', 2], 0xc1 => ['INSTANCEOF', 2], 0xc2 => ['MONITORENTER', 0], 0xc3 => ['MONITOREXIT', 0], 0xc4 => ['WIDE', 0], 0xc5 => ['MULTIANEWARRAY', 3], 0xc6 => ['IFNULL', 2], 0xc7 => ['IFNONNULL', 2], 0xc9 => ['JSRW', 4], 0xca => ['BREAKPOINT', 0], 0xfe => ['IMPDEP1', 0], 0xff => ['NATIVERETURN', 0]   Mapping of opcodes to mnemonics and arg counts. This is useful for e.g. printing stuff out. The counts are mapped into an array (See below) for use at runtime, so the VM knows how many args to pass to the implementation.
OP_ARGC = OPMAP.sort_by { |k,v| k }.inject([]) { |ary, (idx, (name, argc))| ary[idx] = argc and ary }   Array mapping opcode to arg count (bytes) for that opcode

[Validate]