📄 interpret.h
字号:
/* * Copyright (c) 1998-2001 Sun Microsystems, Inc. All Rights Reserved. * * This software is the confidential and proprietary information of Sun * Microsystems, Inc. ("Confidential Information"). You shall not * disclose such Confidential Information and shall use it only in * accordance with the terms of the license agreement you entered into * with Sun. * * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING * THIS SOFTWARE OR ITS DERIVATIVES. * * Use is subject to license terms. *//*========================================================================= * SYSTEM: KVM * SUBSYSTEM: Bytecode interpreter * FILE: interpret.h * OVERVIEW: This file defines the general routines used by the * Java bytecode interpreter. * AUTHOR: Antero Taivalsaari, Sun Labs * Major reorganization by Nik Shaylor 9/5/2000 * NOTE: In KVM 1.0.2, the interpreter was restructured for * better performance, but without sacrificing portability. * The high-level interpreter loop is now defined in file * execute.c. Actual bytecode definitions are in file * bytecodes.c. Various high-level compilation flags * for the interpreter have been documented in main.h * and in the KVM Porting Guide. *=======================================================================*//*========================================================================= * Include files *=======================================================================*//*========================================================================= * Virtual machine global registers *=======================================================================*//*========================================================================= * These variables form the heart of the virtual machine. UP holds * a pointer to the currently executing VM thread, IP holds the current * instruction pointer (next bytecode to be executed), FP holds a * pointer to the currently active stack frame, LP holds a pointer * to the local variables of the current stack frame and SP holds a * pointer to the top of the execution stack. * * Note that IP, FP, LP and SP are thread-specific, i.e., their * values are changed every time a thread switch takes place. *========================================================================= * GENERAL COMMENT: * The main reason why virtual machines written in high-level languages * such as C/C++ are inherently slower than machine-coded ones is that * C/C++ does not provide any mechanism to allocate global variables * in hardware registers. KVM provides a compilation option * (LOCALVMREGISTERS, see main.h) to accomplish this in a portable * fashion. *=======================================================================*/struct GlobalStateStruct { BYTE* gs_ip; /* Instruction pointer (program counter) */ cell* gs_sp; /* Execution stack pointer */ cell* gs_lp; /* Local variable pointer */ CONSTANTPOOL gs_cp; /* Constant pool pointer */ FRAME gs_fp; /* Current frame pointer */};extern struct GlobalStateStruct GlobalState;#define ip_global GlobalState.gs_ip#define sp_global GlobalState.gs_sp#define lp_global GlobalState.gs_lp#define cp_global GlobalState.gs_cp#define fp_global GlobalState.gs_fp/* These get and set macros provide better control *//* over the way VM registers are accessed. */#define getIP() (ip_global)#define getFP() (fp_global)#define getSP() (sp_global)#define getLP() (lp_global)#define getCP() (cp_global)#define setIP(x) (ip_global = (x))#define setFP(x) (fp_global = (x))#define setSP(x) (sp_global = (x))#define setLP(x) (lp_global = (x))#define setCP(x) (cp_global = (x))/*========================================================================= * Bytecode declarations *=======================================================================*/typedef enum { NOP = 0x00, ACONST_NULL = 0x01, ICONST_M1 = 0x02, ICONST_0 = 0x03, ICONST_1 = 0x04, ICONST_2 = 0x05, ICONST_3 = 0x06, ICONST_4 = 0x07, ICONST_5 = 0x08, LCONST_0 = 0x09, LCONST_1 = 0x0A, FCONST_0 = 0x0B, FCONST_1 = 0x0C, FCONST_2 = 0x0D, DCONST_0 = 0x0E, DCONST_1 = 0x0F, BIPUSH = 0x10, SIPUSH = 0x11, LDC = 0x12, LDC_W = 0x13, LDC2_W = 0x14, ILOAD = 0x15, LLOAD = 0x16, FLOAD = 0x17, DLOAD = 0x18, ALOAD = 0x19, ILOAD_0 = 0x1A, ILOAD_1 = 0x1B, ILOAD_2 = 0x1C, ILOAD_3 = 0x1D, LLOAD_0 = 0x1E, LLOAD_1 = 0x1F, LLOAD_2 = 0x20, LLOAD_3 = 0x21, FLOAD_0 = 0x22, FLOAD_1 = 0x23, FLOAD_2 = 0x24, FLOAD_3 = 0x25, DLOAD_0 = 0x26, DLOAD_1 = 0x27, DLOAD_2 = 0x28, DLOAD_3 = 0x29, ALOAD_0 = 0x2A, ALOAD_1 = 0x2B, ALOAD_2 = 0x2C, ALOAD_3 = 0x2D, IALOAD = 0x2E, LALOAD = 0x2F, FALOAD = 0x30, DALOAD = 0x31, AALOAD = 0x32, BALOAD = 0x33, CALOAD = 0x34, SALOAD = 0x35, ISTORE = 0x36, LSTORE = 0x37, FSTORE = 0x38, DSTORE = 0x39, ASTORE = 0x3A, ISTORE_0 = 0x3B, ISTORE_1 = 0x3C, ISTORE_2 = 0x3D, ISTORE_3 = 0x3E, LSTORE_0 = 0x3F, LSTORE_1 = 0x40, LSTORE_2 = 0x41, LSTORE_3 = 0x42, FSTORE_0 = 0x43, FSTORE_1 = 0x44, FSTORE_2 = 0x45, FSTORE_3 = 0x46, DSTORE_0 = 0x47, DSTORE_1 = 0x48, DSTORE_2 = 0x49, DSTORE_3 = 0x4A, ASTORE_0 = 0x4B, ASTORE_1 = 0x4C, ASTORE_2 = 0x4D, ASTORE_3 = 0x4E, IASTORE = 0x4F, LASTORE = 0x50, FASTORE = 0x51, DASTORE = 0x52, AASTORE = 0x53, BASTORE = 0x54, CASTORE = 0x55, SASTORE = 0x56, POP = 0x57, POP2 = 0x58, DUP = 0x59, DUP_X1 = 0x5A, DUP_X2 = 0x5B, DUP2 = 0x5C, DUP2_X1 = 0x5D, DUP2_X2 = 0x5E, SWAP = 0x5F, IADD = 0x60, LADD = 0x61, FADD = 0x62, DADD = 0x63, ISUB = 0x64, LSUB = 0x65, FSUB = 0x66, DSUB = 0x67, IMUL = 0x68, LMUL = 0x69, FMUL = 0x6A, DMUL = 0x6B, IDIV = 0x6C, LDIV = 0x6D, FDIV = 0x6E, DDIV = 0x6F, IREM = 0x70, LREM = 0x71, FREM = 0x72, DREM = 0x73, INEG = 0x74, LNEG = 0x75, FNEG = 0x76, DNEG = 0x77, ISHL = 0x78, LSHL = 0x79, ISHR = 0x7A, LSHR = 0x7B, IUSHR = 0x7C, LUSHR = 0x7D, IAND = 0x7E, LAND = 0x7F, IOR = 0x80, LOR = 0x81, IXOR = 0x82, LXOR = 0x83, IINC = 0x84, I2L = 0x85, I2F = 0x86, I2D = 0x87, L2I = 0x88, L2F = 0x89, L2D = 0x8A, F2I = 0x8B, F2L = 0x8C, F2D = 0x8D, D2I = 0x8E, D2L = 0x8F, D2F = 0x90, I2B = 0x91, I2C = 0x92, I2S = 0x93, LCMP = 0x94, FCMPL = 0x95, FCMPG = 0x96, DCMPL = 0x97, DCMPG = 0x98, IFEQ = 0x99, IFNE = 0x9A, IFLT = 0x9B, IFGE = 0x9C, IFGT = 0x9D, IFLE = 0x9E, IF_ICMPEQ = 0x9F, IF_ICMPNE = 0xA0, IF_ICMPLT = 0xA1, IF_ICMPGE = 0xA2, IF_ICMPGT = 0xA3, IF_ICMPLE = 0xA4, IF_ACMPEQ = 0xA5, IF_ACMPNE = 0xA6, GOTO = 0xA7, JSR = 0xA8, RET = 0xA9, TABLESWITCH = 0xAA, LOOKUPSWITCH = 0xAB, IRETURN = 0xAC, LRETURN = 0xAD, FRETURN = 0xAE, DRETURN = 0xAF, ARETURN = 0xB0, RETURN = 0xB1, GETSTATIC = 0xB2, PUTSTATIC = 0xB3, GETFIELD = 0xB4, PUTFIELD = 0xB5, INVOKEVIRTUAL = 0xB6, INVOKESPECIAL = 0xB7, INVOKESTATIC = 0xB8, INVOKEINTERFACE = 0xB9, UNUSED_BA = 0xBA, NEW = 0xBB, NEWARRAY = 0xBC, ANEWARRAY = 0xBD, ARRAYLENGTH = 0xBE, ATHROW = 0xBF, CHECKCAST = 0xC0, INSTANCEOF = 0xC1, MONITORENTER = 0xC2, MONITOREXIT = 0xC3, WIDE = 0xC4, MULTIANEWARRAY = 0xC5, IFNULL = 0xC6, IFNONNULL = 0xC7, GOTO_W = 0xC8, JSR_W = 0xC9, BREAKPOINT = 0xCA,/*========================================================================= * Fast bytecodes (used internally by the system * only if FASTBYTECODES flag is on) *=======================================================================*/ GETFIELD_FAST = 0xCB, GETFIELDP_FAST = 0xCC, GETFIELD2_FAST = 0xCD, PUTFIELD_FAST = 0xCE, PUTFIELD2_FAST = 0xCF, GETSTATIC_FAST = 0xD0, GETSTATICP_FAST = 0xD1, GETSTATIC2_FAST = 0xD2, PUTSTATIC_FAST = 0xD3, PUTSTATIC2_FAST = 0xD4, UNUSED_D5 = 0xD5, INVOKEVIRTUAL_FAST = 0xD6, INVOKESPECIAL_FAST = 0xD7, INVOKESTATIC_FAST = 0xD8, INVOKEINTERFACE_FAST = 0xD9, NEW_FAST = 0xDA, ANEWARRAY_FAST = 0xDB, MULTIANEWARRAY_FAST = 0xDC, CHECKCAST_FAST = 0xDD, INSTANCEOF_FAST = 0xDE, CUSTOMCODE = 0xDF, LASTBYTECODE = 0xDF} ByteCode ;#define BYTE_CODE_NAMES { \ "NOP", /* 0x00 */ \ "ACONST_NULL", /* 0x01 */ \ "ICONST_M1", /* 0x02 */ \ "ICONST_0", /* 0x03 */ \ "ICONST_1", /* 0x04 */ \ "ICONST_2", /* 0x05 */ \ "ICONST_3", /* 0x06 */ \ "ICONST_4", /* 0x07 */ \ "ICONST_5", /* 0x08 */ \ "LCONST_0", /* 0x09 */ \ "LCONST_1", /* 0x0A */ \ "FCONST_0", /* 0x0B */ \ "FCONST_1", /* 0x0C */ \ "FCONST_2", /* 0x0D */ \ "DCONST_0", /* 0x0E */ \ "DCONST_1", /* 0x0F */ \ "BIPUSH", /* 0x10 */ \ "SIPUSH", /* 0x11 */ \ "LDC", /* 0x12 */ \ "LDC_W", /* 0x13 */ \ "LDC2_W", /* 0x14 */ \ "ILOAD", /* 0x15 */ \ "LLOAD", /* 0x16 */ \ "FLOAD", /* 0x17 */ \ "DLOAD", /* 0x18 */ \ "ALOAD", /* 0x19 */ \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -