All Downloads are FREE. Search and download functionalities are using the official Maven repository.

shz.core.jvm.cfs.CFSConstants Maven / Gradle / Ivy

package shz.core.jvm.cfs;

import shz.core.jvm.cfs.un.HexU1;
import shz.core.jvm.cfs.un.HexU2;

public final class CFSConstants {
    private CFSConstants() {
        throw new IllegalStateException();
    }

    /**
     * 位数
     */
    public static final byte BIT1 = 0b01;
    public static final byte BIT2 = 0b10;
    public static final byte BIT4 = 0b100;
    public static final byte BIT8 = 0b1000;

    /**
     * 类访问标志
     */
    public enum ClassAccessFlag {
        ACC_PUBLIC(HexU2._0x0001), ACC_FINAL(HexU2._0x0010), ACC_SUPER(HexU2._0x0020), ACC_INTERFACE(HexU2._0x0200),
        ACC_ABSTRACT(HexU2._0x0400), ACC_SYNTHETIC(HexU2._0x1000), ACC_ANNOTATION(HexU2._0x2000), ACC_ENUM(HexU2._0x4000);

        public final HexU2 value;

        ClassAccessFlag(HexU2 value) {
            this.value = value;
        }
    }

    /**
     * 内部类访问标志
     */
    public enum InnerClassAccessFlag {
        ACC_PUBLIC(HexU2._0x0001), ACC_PRIVATE(HexU2._0x0002), ACC_PROTECTED(HexU2._0x0004), ACC_STATIC(HexU2._0x0008),
        ACC_FINAL(HexU2._0x0010), ACC_INTERFACE(HexU2._0x0200), ACC_ABSTRACT(HexU2._0x0400), ACC_SYNTHETIC(HexU2._0x1000),
        ACC_ANNOTATION(HexU2._0x2000), ACC_ENUM(HexU2._0x4000);

        public final HexU2 value;

        InnerClassAccessFlag(HexU2 value) {
            this.value = value;
        }
    }

    /**
     * 字段访问标志
     */
    public enum FieldAccessFlag {
        ACC_PUBLIC(HexU2._0x0001), ACC_PRIVATE(HexU2._0x0002), ACC_PROTECTED(HexU2._0x0004), ACC_STATIC(HexU2._0x0008),
        ACC_FINAL(HexU2._0x0010), ACC_VOLATILE(HexU2._0x0040), ACC_TRANSIENT(HexU2._0x0080), ACC_SYNTHETIC(HexU2._0x1000),
        ACC_ENUM(HexU2._0x4000);

        public final HexU2 value;

        FieldAccessFlag(HexU2 value) {
            this.value = value;
        }
    }

    /**
     * 方法访问标志
     */
    public enum MethodAccessFlag {
        ACC_PUBLIC(HexU2._0x0001), ACC_PRIVATE(HexU2._0x0002), ACC_PROTECTED(HexU2._0x0004), ACC_STATIC(HexU2._0x0008),
        ACC_FINAL(HexU2._0x0010), ACC_SYNCHRONIZED(HexU2._0x0020), ACC_BRIDGE(HexU2._0x0040), ACC_VARARGS(HexU2._0x0080),
        ACC_NATIVE(HexU2._0x0100), ACC_ABSTRACT(HexU2._0x0400), ACC_STRICTFP(HexU2._0x0800), ACC_SYNTHETIC(HexU2._0x1000);

        public final HexU2 value;

        MethodAccessFlag(HexU2 value) {
            this.value = value;
        }
    }

    /**
     * 描述符标识字符
     */
    public enum DescriptorFlag {
        /**
         * 基本类型byte
         */
        B,
        /**
         * 基本类型char
         */
        C,
        /**
         * 基本类型double
         */
        D,
        /**
         * 基本类型float
         */
        F,
        /**
         * 基本类型int
         */
        I,
        /**
         * 基本类型long
         */
        J,
        /**
         * 基本类型short
         */
        S,
        /**
         * 基本类型boolean
         */
        Z,
        /**
         * 特殊类型void
         */
        V,
        /**
         * 对象类型,如Ljava/lang/Object;
         */
        L,

        // String[][] [[Ljava/lang/String;
        // int[] [I

        // 用描述符描述方法时,先参数列表后返回值,参数列表按顺序放入小括号()中
        // void inc() -> ()V
        // java.lang.String toString() -> ()Ljava/lang/String;
        // int indexOf(char[] source,int sourceOffset,int sourceCount,char[] target,int
        // targetOffset,int targetCount,int fromIndex) -> ([CII[CIII)I

        ;
    }

    /**
     * 字节码指令
     */
    public enum Bytecode {
        /**
         * 什么都不做
         */
        nop(HexU1._0x00),
        /**
         * 将null推送至栈顶
         */
        aconst_null(HexU1._0x01),
        /**
         * 将int型-1推送至栈顶
         */
        iconst_m1(HexU1._0x02),
        /**
         * 将int型0推送至栈顶
         */
        iconst_0(HexU1._0x03), iconst_1(HexU1._0x04), iconst_2(HexU1._0x05), iconst_3(HexU1._0x06),
        iconst_4(HexU1._0x07), iconst_5(HexU1._0x08), lconst_0(HexU1._0x09), lconst_1(HexU1._0x0a),
        fconst_0(HexU1._0x0b), fconst_1(HexU1._0x0c), fconst_2(HexU1._0x0d), dconst_0(HexU1._0x0e),
        dconst_1(HexU1._0x0f),
        /**
         * 将单字节的常量值(-128~127)推送至栈顶
         */
        bipush(HexU1._0x10),
        /**
         * 将一个短整型常量值(-32768~32767)推送至栈顶
         */
        sipush(HexU1._0x11),
        /**
         * 将int、float或String型常量值从常量池推送至栈顶
         */
        ldc(HexU1._0x12),
        /**
         * 将int、float或String型常量值从常量池推送至栈顶(宽索引)
         */
        ldc_w(HexU1._0x13),
        /**
         * 将long或double型常量值从常量池推送至栈顶(宽索引)
         */
        ldc2_w(HexU1._0x14),
        /**
         * 将指定的int型本地变量推送至栈顶
         */
        iload(HexU1._0x15), lload(HexU1._0x16), fload(HexU1._0x17), dload(HexU1._0x18), aload(HexU1._0x19),
        /**
         * 将第一个int型本地变量推送至栈顶
         */
        iload_0(HexU1._0x1a), iload_1(HexU1._0x1b), iload_2(HexU1._0x1c), iload_3(HexU1._0x1d), lload_0(HexU1._0x1e),
        lload_1(HexU1._0x1f), lload_2(HexU1._0x20), lload_3(HexU1._0x21), fload_0(HexU1._0x22), fload_1(HexU1._0x23),
        fload_2(HexU1._0x24), fload_3(HexU1._0x25), dload_0(HexU1._0x26), dload_1(HexU1._0x27), dload_2(HexU1._0x28),
        dload_3(HexU1._0x29), aload_0(HexU1._0x2a), aload_1(HexU1._0x2b), aload_2(HexU1._0x2c), aload_3(HexU1._0x2d),
        /**
         * 将int型数组指定索引的值推送至栈顶
         */
        iaload(HexU1._0x2e), laload(HexU1._0x2f), faload(HexU1._0x30), daload(HexU1._0x31), aaload(HexU1._0x32),
        baload(HexU1._0x33), caload(HexU1._0x34), saload(HexU1._0x35),
        /**
         * 将栈顶int型数值存入指定本地变量
         */
        istore(HexU1._0x36), lstore(HexU1._0x37), fstore(HexU1._0x38), dstore(HexU1._0x39), astore(HexU1._0x3a),
        /**
         * 将栈顶int型数值存入第一个本地变量
         */
        istore_0(HexU1._0x3b), istore_1(HexU1._0x3c), istore_2(HexU1._0x3d), istore_3(HexU1._0x3e),
        lstore_0(HexU1._0x3f), lstore_1(HexU1._0x40), lstore_2(HexU1._0x41), lstore_3(HexU1._0x42),
        fstore_0(HexU1._0x43), fstore_1(HexU1._0x44), fstore_2(HexU1._0x45), fstore_3(HexU1._0x46),
        dstore_0(HexU1._0x47), dstore_1(HexU1._0x48), dstore_2(HexU1._0x49), dstore_3(HexU1._0x4a),
        astore_0(HexU1._0x4b), astore_1(HexU1._0x4c), astore_2(HexU1._0x4d), astore_3(HexU1._0x4e),
        /**
         * 将栈顶int型数值存入指定数组的指定索引位置
         */
        iastore(HexU1._0x4f), lastore(HexU1._0x50), fastore(HexU1._0x51), dastore(HexU1._0x52), aastore(HexU1._0x53),
        bastore(HexU1._0x54), castore(HexU1._0x55), sastore(HexU1._0x56),
        /**
         * 将栈顶数值弹出(非long且非doubel类型)
         */
        pop(HexU1._0x57),
        /**
         * 将栈顶一个(long或doubel类型)或两个(非long且非doubel类型)数值弹出
         */
        pop2(HexU1._0x58),
        /**
         * 复制栈顶数值并将复制值压入栈顶
         */
        dup(HexU1._0x59),
        /**
         * 复制栈顶数值并将两个复制值压入栈顶
         */
        dup_x1(HexU1._0x5a),
        /**
         * 复制栈顶数值并将三个(或两个)复制值压入栈顶
         */
        dup_x2(HexU1._0x5b),
        /**
         * 复制栈顶数一个(long或doubel类型)或两个(非long且非doubel类型)数值并将复制值压入栈顶
         */
        dup2(HexU1._0x5c), dup2_x1(HexU1._0x5d), dup2_x2(HexU1._0x5e),
        /**
         * 将栈最顶端的两个数值互换(非long且非doubel类型)
         */
        swap(HexU1._0x5f),
        /**
         * 将栈顶两int型数值相加并将结果压入栈顶
         */
        iadd(HexU1._0x60), ladd(HexU1._0x61), fadd(HexU1._0x62), dadd(HexU1._0x63),
        /**
         * 将栈顶两int型数值相减并将结果压入栈顶
         */
        isub(HexU1._0x64), lsub(HexU1._0x65), fsub(HexU1._0x66), dsub(HexU1._0x67),
        /**
         * 将栈顶两int型数值相乘并将结果压入栈顶
         */
        imul(HexU1._0x68), lmul(HexU1._0x69), fmul(HexU1._0x6a), dmul(HexU1._0x6b),
        /**
         * 将栈顶两int型数值相除并将结果压入栈顶
         */
        idiv(HexU1._0x6c), ldiv(HexU1._0x6d), fdiv(HexU1._0x6e), ddiv(HexU1._0x6f),
        /**
         * 将栈顶两int型数值作取模运算并将结果压入栈顶
         */
        irem(HexU1._0x70), lrem(HexU1._0x71), frem(HexU1._0x72), drem(HexU1._0x73),
        /**
         * 将栈顶int型数值取负并将结果压入栈顶
         */
        ineg(HexU1._0x74), lneg(HexU1._0x75), fneg(HexU1._0x76), dneg(HexU1._0x77),
        /**
         * 将int型数值左移位指定位数并将结果压入栈顶
         */
        ishl(HexU1._0x78), lshl(HexU1._0x79),
        /**
         * 将int型数值右(带符号)移位指定位数并将结果压入栈顶
         */
        ishr(HexU1._0x7a), lshr(HexU1._0x7b),
        /**
         * 将int型数值右(无符号)移位指定位数并将结果压入栈顶
         */
        iushr(HexU1._0x7c), lushr(HexU1._0x7d),
        /**
         * 将栈顶两int型数值作"按位与"并将结果压入栈顶
         */
        iand(HexU1._0x7e), land(HexU1._0x7f),
        /**
         * 将栈顶两int型数值作"按位或"并将结果压入栈顶
         */
        ior(HexU1._0x80), lor(HexU1._0x81),
        /**
         * 将栈顶两int型数值作"按位异或"并将结果压入栈顶
         */
        ixor(HexU1._0x82), lxor(HexU1._0x83),
        /**
         * 将指定int型变量增加指定值(如i++、i--、i+=2等)
         */
        iinc(HexU1._0x84),
        /**
         * 将栈顶int型数值强制转换成long型数值并将结果压入栈顶
         */
        i2l(HexU1._0x85), i2f(HexU1._0x86), i2d(HexU1._0x87), l2i(HexU1._0x88), l2f(HexU1._0x89), l2d(HexU1._0x8a),
        f2i(HexU1._0x8b), f2l(HexU1._0x8c), f2d(HexU1._0x8d), d2i(HexU1._0x8e), d2l(HexU1._0x8f), d2f(HexU1._0x90),
        i2b(HexU1._0x91), i2c(HexU1._0x92), i2s(HexU1._0x93),
        /**
         * 比较栈顶两long型数值的大小,并将结果(1、0或-1)压入栈顶
         */
        lcmp(HexU1._0x94),
        /**
         * 比较栈顶两float型数值的大小,并将结果(1、0或-1)压入栈顶;当其中一个数值为NaN时,将-1压入栈顶
         */
        fcmpl(HexU1._0x95),
        /**
         * 比较栈顶两float型数值的大小,并将结果(1、0或-1)压入栈顶;当其中一个数值为NaN时,将1压入栈顶
         */
        fcmpg(HexU1._0x96), dcmpl(HexU1._0x97), dcmpg(HexU1._0x98),
        /**
         * 当栈顶int型数值==0时跳转
         */
        ifeg(HexU1._0x99),
        /**
         * 当栈顶int型数值!=0时跳转
         */
        ifne(HexU1._0x9a),
        /**
         * 当栈顶int型数值<0时跳转
         */
        iflt(HexU1._0x9b),
        /**
         * 当栈顶int型数值>=0时跳转
         */
        ifge(HexU1._0x9c),
        /**
         * 当栈顶int型数值>0时跳转
         */
        ifgt(HexU1._0x9d),
        /**
         * 当栈顶int型数值<=0时跳转
         */
        ifle(HexU1._0x9e),
        /**
         * 比较栈顶两int型数值的大小,当结果==0时跳转
         */
        if_icmpeg(HexU1._0x9f), if_icmpne(HexU1._0xa0), if_icmplt(HexU1._0xa1), if_icmpge(HexU1._0xa2),
        if_icmpgt(HexU1._0xa3), if_icmple(HexU1._0xa4), if_acmpeg(HexU1._0xa5), if_acmpne(HexU1._0xa6),
        /**
         * 无条件跳转
         */
        _goto(HexU1._0xa7),
        /**
         * 跳转至指定的16位offset位置,并将jsr的下一条指令地址压入栈顶
         */
        jsr(HexU1._0xa8),
        /**
         * 返回至本地变量指定的index的指令位置(一般与jsr或jsr_w联合使用)
         */
        ret(HexU1._0xa9),
        /**
         * 用于switch条件跳转,case值连续(可变长度指令)
         */
        tableswitch(HexU1._0xaa),
        /**
         * 用于switch条件跳转,case值不连续(可变长度指令)
         */
        lookupswitch(HexU1._0xab),
        /**
         * 从当前方法返回int
         */
        ireturn(HexU1._0xac), lreturn(HexU1._0xad), freturn(HexU1._0xae), dreturn(HexU1._0xaf), areturn(HexU1._0xb0),
        /**
         * 从当前方法返回void
         */
        _return(HexU1._0xb1),
        /**
         * 获取指定类的静态域,并将其值压入栈顶
         */
        getstatic(HexU1._0xb2),
        /**
         * 为指定的类的静态域赋值
         */
        putstatic(HexU1._0xb3),
        /**
         * 获取指定类的实例域,并将其值压入栈顶
         */
        getfield(HexU1._0xb4),
        /**
         * 为指定的类的实例域赋值
         */
        putfield(HexU1._0xb5),
        /**
         * 调用实例方法
         */
        invokevirtual(HexU1._0xb6),
        /**
         * 调用超类构造方法,实例初始化方法,私有方法
         */
        invokespecial(HexU1._0xb7),
        /**
         * 调用静态方法
         */
        invokestatic(HexU1._0xb8),
        /**
         * 调用接口方法
         */
        invokeinterface(HexU1._0xb9),
        /**
         * 调用动态方法
         */
        invokedynamic(HexU1._0xba),
        /**
         * 创建一个对象,并将其引用值压入栈顶
         */
        _new(HexU1._0xbb),
        /**
         * 创建一个指定的原始类型(如int、float、char等)的数组,并将其引用值压入栈顶
         */
        newarray(HexU1._0xbc),
        /**
         * 创建一个引用型(如类、接口、数组等)的数组,并将其引用值压入栈顶
         */
        anewarray(HexU1._0xbd),
        /**
         * 获得数组的长度值并压入栈顶
         */
        arraylength(HexU1._0xbe),
        /**
         * 将栈顶的异常抛出
         */
        athrow(HexU1._0xbf),
        /**
         * 检验类型转换,检验未通过将抛出ClassCastException
         */
        checkcast(HexU1._0xc0),
        /**
         * 检验对象是否是指定的类的实例,如果是,则将1压入栈顶,否则将0压入栈顶
         */
        _instanceof(HexU1._0xc1),
        /**
         * 获得对象的锁,用于同步方法或同步块
         */
        monitorenter(HexU1._0xc2),
        /**
         * 释放对象的锁,用于同步方法或同步块
         */
        monitorexit(HexU1._0xc3),
        /**
         * 扩展本地变量的宽度
         */
        wide(HexU1._0xc4),
        /**
         * 创建指定类型和指定维度的多维数组(执行该指令时,操作栈中必须包含各维度的长度值),并将其引用值压入栈顶
         */
        multianewarray(HexU1._0xc5),
        /**
         * 为null时跳转
         */
        ifnull(HexU1._0xc6),
        /**
         * 不为null时跳转
         */
        ifnonnull(HexU1._0xc7),
        /**
         * 无条件跳转(宽索引)
         */
        goto_w(HexU1._0xc8),
        /**
         * 跳转至指定的32位offset位置,并将jsr_w的下一条指令地址压入栈顶
         */
        jsr_w(HexU1._0xc9),

        ;

        public final HexU1 value;

        Bytecode(HexU1 value) {
            this.value = value;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy