Full Code of zachaxy/JVM for AI

master 0e3b830c12d5 cached
299 files
315.3 KB
94.5k tokens
994 symbols
1 requests
Download .txt
Showing preview only (417K chars total). Download the full file or copy to clipboard to get everything.
Repository: zachaxy/JVM
Branch: master
Commit: 0e3b830c12d5
Files: 299
Total size: 315.3 KB

Directory structure:
gitextract_uyxsbubc/

├── .gitignore
├── Java/
│   └── src/
│       ├── Main.java
│       ├── Utils/
│       │   ├── ByteUtils.java
│       │   └── Cmd.java
│       ├── classfile/
│       │   ├── ClassFile.java
│       │   ├── ClassReader.java
│       │   ├── ConstantPool.java
│       │   ├── MemberInfo.java
│       │   ├── attribute/
│       │   │   ├── AttributeInfo.java
│       │   │   ├── CodeAttribute.java
│       │   │   ├── ConstantValueAttribute.java
│       │   │   ├── DeprecatedAttribute.java
│       │   │   ├── ExceptionsAttribute.java
│       │   │   ├── LineNumberTableAttribute.java
│       │   │   ├── LocalVariableTableAttribute.java
│       │   │   ├── SourceFileAttribute.java
│       │   │   ├── SyntheticAttribute.java
│       │   │   └── UnparsedAttribute.java
│       │   └── classconstant/
│       │       ├── ConstantClassInfo.java
│       │       ├── ConstantDoubleInfo.java
│       │       ├── ConstantFieldRefInfo.java
│       │       ├── ConstantFloatInfo.java
│       │       ├── ConstantInfo.java
│       │       ├── ConstantIntegerInfo.java
│       │       ├── ConstantInterfaceMethodRefInfo.java
│       │       ├── ConstantInvokeDynamicInfo.java
│       │       ├── ConstantLongInfo.java
│       │       ├── ConstantMemberRefInfo.java
│       │       ├── ConstantMethodHandleInfo.java
│       │       ├── ConstantMethodRefInfo.java
│       │       ├── ConstantMethodTypeInfo.java
│       │       ├── ConstantNameAndTypeInfo.java
│       │       ├── ConstantStringInfo.java
│       │       └── ConstantUtf8Info.java
│       ├── classpath/
│       │   ├── ClassPath.java
│       │   ├── CompositeEntry.java
│       │   ├── DirEntry.java
│       │   ├── Entry.java
│       │   ├── WildcardEntry.java
│       │   └── ZipJarEntry.java
│       ├── instructions/
│       │   ├── InstructionFactory.java
│       │   ├── base/
│       │   │   ├── BranchInstruction.java
│       │   │   ├── BranchLogic.java
│       │   │   ├── BytecodeReader.java
│       │   │   ├── ClassInitLogic.java
│       │   │   ├── Index16Instruction.java
│       │   │   ├── Index8Instruction.java
│       │   │   ├── Instruction.java
│       │   │   ├── MethodInvokeLogic.java
│       │   │   └── NoOperandsInstruction.java
│       │   ├── comparisons/
│       │   │   ├── dcmp/
│       │   │   │   ├── DCMP.java
│       │   │   │   ├── DCMPG.java
│       │   │   │   └── DCMPL.java
│       │   │   ├── fcmp/
│       │   │   │   ├── FCMP.java
│       │   │   │   ├── FCMPG.java
│       │   │   │   └── FCMPL.java
│       │   │   ├── ifacmp/
│       │   │   │   ├── IF_ACMPEQ.java
│       │   │   │   ├── IF_ACMPNE.java
│       │   │   │   └── IfAcmp.java
│       │   │   ├── ifcond/
│       │   │   │   ├── IFEQ.java
│       │   │   │   ├── IFGE.java
│       │   │   │   ├── IFGT.java
│       │   │   │   ├── IFLE.java
│       │   │   │   ├── IFLT.java
│       │   │   │   └── IFNE.java
│       │   │   ├── ificmp/
│       │   │   │   ├── IF_ICMPEQ.java
│       │   │   │   ├── IF_ICMPGE.java
│       │   │   │   ├── IF_ICMPGT.java
│       │   │   │   ├── IF_ICMPLE.java
│       │   │   │   ├── IF_ICMPLT.java
│       │   │   │   ├── IF_ICMPNE.java
│       │   │   │   └── IfIcmp.java
│       │   │   └── lcmp/
│       │   │       └── LCMP.java
│       │   ├── constants/
│       │   │   ├── ACONST_NULL.java
│       │   │   ├── BIPUSH.java
│       │   │   ├── DCONST_0.java
│       │   │   ├── DCONST_1.java
│       │   │   ├── FCONST_0.java
│       │   │   ├── FCONST_1.java
│       │   │   ├── FCONST_2.java
│       │   │   ├── ICONST_0.java
│       │   │   ├── ICONST_1.java
│       │   │   ├── ICONST_2.java
│       │   │   ├── ICONST_3.java
│       │   │   ├── ICONST_4.java
│       │   │   ├── ICONST_5.java
│       │   │   ├── ICONST_M1.java
│       │   │   ├── LCONST_0.java
│       │   │   ├── LCONST_1.java
│       │   │   ├── LDC.java
│       │   │   ├── LDC2_W.java
│       │   │   ├── LDC_W.java
│       │   │   ├── NOP.java
│       │   │   └── SIPUSH.java
│       │   ├── control/
│       │   │   ├── ARETURN.java
│       │   │   ├── DRETURN.java
│       │   │   ├── FRETURN.java
│       │   │   ├── GOTO.java
│       │   │   ├── IRETURN.java
│       │   │   ├── LOOKUP_SWITCH.java
│       │   │   ├── LRETURN.java
│       │   │   ├── RETURN.java
│       │   │   └── TABLE_SWITCH.java
│       │   ├── conversions/
│       │   │   ├── d2x/
│       │   │   │   ├── D2F.java
│       │   │   │   ├── D2I.java
│       │   │   │   └── D2L.java
│       │   │   ├── f2x/
│       │   │   │   ├── F2D.java
│       │   │   │   ├── F2I.java
│       │   │   │   └── F2L.java
│       │   │   ├── i2x/
│       │   │   │   ├── I2B.java
│       │   │   │   ├── I2C.java
│       │   │   │   ├── I2D.java
│       │   │   │   ├── I2F.java
│       │   │   │   ├── I2L.java
│       │   │   │   └── I2S.java
│       │   │   └── l2x/
│       │   │       ├── L2D.java
│       │   │       ├── L2F.java
│       │   │       └── L2I.java
│       │   ├── extended/
│       │   │   ├── GOTO_W.java
│       │   │   ├── IFNONNULL.java
│       │   │   ├── IFNULL.java
│       │   │   └── WIDE.java
│       │   ├── loads/
│       │   │   ├── Load.java
│       │   │   ├── loaddouble/
│       │   │   │   ├── DLOAD.java
│       │   │   │   ├── DLOAD_0.java
│       │   │   │   ├── DLOAD_1.java
│       │   │   │   ├── DLOAD_2.java
│       │   │   │   └── DLOAD_3.java
│       │   │   ├── loadfloat/
│       │   │   │   ├── FLOAD.java
│       │   │   │   ├── FLOAD_0.java
│       │   │   │   ├── FLOAD_1.java
│       │   │   │   ├── FLOAD_2.java
│       │   │   │   └── FLOAD_3.java
│       │   │   ├── loadint/
│       │   │   │   ├── ILOAD.java
│       │   │   │   ├── ILOAD_0.java
│       │   │   │   ├── ILOAD_1.java
│       │   │   │   ├── ILOAD_2.java
│       │   │   │   └── ILOAD_3.java
│       │   │   ├── loadlong/
│       │   │   │   ├── LLOAD.java
│       │   │   │   ├── LLOAD_0.java
│       │   │   │   ├── LLOAD_1.java
│       │   │   │   ├── LLOAD_2.java
│       │   │   │   └── LLOAD_3.java
│       │   │   ├── loadref/
│       │   │   │   ├── ALOAD.java
│       │   │   │   ├── ALOAD_0.java
│       │   │   │   ├── ALOAD_1.java
│       │   │   │   ├── ALOAD_2.java
│       │   │   │   └── ALOAD_3.java
│       │   │   └── loadxarr/
│       │   │       ├── AALOAD.java
│       │   │       ├── BALOAD.java
│       │   │       ├── CALOAD.java
│       │   │       ├── DALOAD.java
│       │   │       ├── FALOAD.java
│       │   │       ├── IALOAD.java
│       │   │       ├── LALOAD.java
│       │   │       └── SALOAD.java
│       │   ├── math/
│       │   │   ├── add/
│       │   │   │   ├── DADD.java
│       │   │   │   ├── FADD.java
│       │   │   │   ├── IADD.java
│       │   │   │   └── LADD.java
│       │   │   ├── and/
│       │   │   │   ├── IAND.java
│       │   │   │   └── LAND.java
│       │   │   ├── div/
│       │   │   │   ├── DDIV.java
│       │   │   │   ├── FDIV.java
│       │   │   │   ├── IDIV.java
│       │   │   │   └── LDIV.java
│       │   │   ├── iinc/
│       │   │   │   └── IINC.java
│       │   │   ├── mul/
│       │   │   │   ├── DMUL.java
│       │   │   │   ├── FMUL.java
│       │   │   │   ├── IMUL.java
│       │   │   │   └── LMUL.java
│       │   │   ├── neg/
│       │   │   │   ├── DNEG.java
│       │   │   │   ├── FNEG.java
│       │   │   │   ├── INEG.java
│       │   │   │   └── LNEG.java
│       │   │   ├── or/
│       │   │   │   ├── IOR.java
│       │   │   │   └── LOR.java
│       │   │   ├── rem/
│       │   │   │   ├── DREM.java
│       │   │   │   ├── FREM.java
│       │   │   │   ├── IREM.java
│       │   │   │   └── LREM.java
│       │   │   ├── sh/
│       │   │   │   ├── ISHL.java
│       │   │   │   ├── ISHR.java
│       │   │   │   ├── IUSHR.java
│       │   │   │   ├── LSHL.java
│       │   │   │   ├── LSHR.java
│       │   │   │   └── LUSHR.java
│       │   │   ├── sub/
│       │   │   │   ├── DSUB.java
│       │   │   │   ├── FSUB.java
│       │   │   │   ├── ISUB.java
│       │   │   │   └── LSUB.java
│       │   │   └── xor/
│       │   │       ├── IXOR.java
│       │   │       └── LXOR.java
│       │   ├── references/
│       │   │   ├── ANEW_ARRAY.java
│       │   │   ├── ARRAY_LENGTH.java
│       │   │   ├── ATHROW.java
│       │   │   ├── CHECK_CAST.java
│       │   │   ├── GET_FIELD.java
│       │   │   ├── GET_STATIC.java
│       │   │   ├── INSTANCE_OF.java
│       │   │   ├── INVOKE_INTERFACE.java
│       │   │   ├── INVOKE_NATIVE.java
│       │   │   ├── INVOKE_SPECIAL.java
│       │   │   ├── INVOKE_STATIC.java
│       │   │   ├── INVOKE_VIRTUAL.java
│       │   │   ├── MULTI_ANEW_ARRAY.java
│       │   │   ├── NEW.java
│       │   │   ├── NEW_ARRAY.java
│       │   │   ├── PUT_FIELD.java
│       │   │   └── PUT_STATIC.java
│       │   ├── stack/
│       │   │   ├── dup/
│       │   │   │   ├── DUP.java
│       │   │   │   ├── DUP2.java
│       │   │   │   ├── DUP2_X1.java
│       │   │   │   ├── DUP2_X2.java
│       │   │   │   ├── DUP_X1.java
│       │   │   │   └── DUP_X2.java
│       │   │   ├── pop/
│       │   │   │   ├── POP.java
│       │   │   │   └── POP2.java
│       │   │   └── swap/
│       │   │       └── SWAP.java
│       │   └── stores/
│       │       ├── Store.java
│       │       ├── storedouble/
│       │       │   ├── DSTORE.java
│       │       │   ├── DSTORE_0.java
│       │       │   ├── DSTORE_1.java
│       │       │   ├── DSTORE_2.java
│       │       │   └── DSTORE_3.java
│       │       ├── storefloat/
│       │       │   ├── FSTORE.java
│       │       │   ├── FSTORE_0.java
│       │       │   ├── FSTORE_1.java
│       │       │   ├── FSTORE_2.java
│       │       │   └── FSTORE_3.java
│       │       ├── storeint/
│       │       │   ├── ISTORE.java
│       │       │   ├── ISTORE_0.java
│       │       │   ├── ISTORE_1.java
│       │       │   ├── ISTORE_2.java
│       │       │   └── ISTORE_3.java
│       │       ├── storelong/
│       │       │   ├── LSTORE.java
│       │       │   ├── LSTORE_0.java
│       │       │   ├── LSTORE_1.java
│       │       │   ├── LSTORE_2.java
│       │       │   └── LSTORE_3.java
│       │       ├── storeref/
│       │       │   ├── ASTORE.java
│       │       │   ├── ASTORE_0.java
│       │       │   ├── ASTORE_1.java
│       │       │   ├── ASTORE_2.java
│       │       │   └── ASTORE_3.java
│       │       └── storexarr/
│       │           ├── AASTORE.java
│       │           ├── BASTORE.java
│       │           ├── CASTORE.java
│       │           ├── DASTORE.java
│       │           ├── FASTORE.java
│       │           ├── IASTORE.java
│       │           ├── LASTORE.java
│       │           └── SASTORE.java
│       ├── runtimedata/
│       │   ├── LocalVars.java
│       │   ├── OperandStack.java
│       │   ├── Slot.java
│       │   ├── Slots.java
│       │   ├── Zframe.java
│       │   ├── Zstack.java
│       │   ├── Zthread.java
│       │   └── heap/
│       │       ├── AccessFlag.java
│       │       ├── ClassMember.java
│       │       ├── ClassNameHelper.java
│       │       ├── ClassRef.java
│       │       ├── ExceptionTable.java
│       │       ├── FieldRef.java
│       │       ├── InterfaceMethodRef.java
│       │       ├── MemberRef.java
│       │       ├── MethodDescriptor.java
│       │       ├── MethodLookup.java
│       │       ├── MethodRef.java
│       │       ├── RuntimeConstantInfo.java
│       │       ├── RuntimeConstantPool.java
│       │       ├── StringPool.java
│       │       ├── SymRef.java
│       │       ├── Zclass.java
│       │       ├── ZclassLoader.java
│       │       ├── Zfield.java
│       │       ├── Zmethod.java
│       │       └── Zobject.java
│       ├── test/
│       │   ├── TestClassFile03.java
│       │   ├── TestClassLoader07.java
│       │   ├── TestClassPath02.java
│       │   ├── TestCmd01.java
│       │   ├── TestException12.java
│       │   ├── TestGetClass11.java
│       │   ├── TestInterpreter06.java
│       │   ├── TestInvokeMethod08.java
│       │   ├── TestLocalVars04.java
│       │   ├── TestNewArray09.java
│       │   ├── TestOperandStack05.java
│       │   └── TestStringPool10.java
│       └── znative/
│           ├── NativeMethod.java
│           ├── RegisterCenter.java
│           └── java/
│               └── lang/
│                   ├── NStackTraceElement.java
│                   ├── Nclass.java
│                   ├── Nobject.java
│                   └── Nthrowable.java
└── README.md

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
*.iml
/local.properties
/.idea/
/out
.DS_Store
/captures
/Java/src/help.java
/tmp



================================================
FILE: Java/src/Main.java
================================================
/**
 * Author: zhangxin
 * Time: 2017/4/30 0030.
 * Desc:
 */
public class Main {
    public static void main(String[] args) {
        System.out.println("please refer to the test package to make your own code. enjoy!");
    }
}


================================================
FILE: Java/src/Utils/ByteUtils.java
================================================
package Utils;

/**
 * Author: zhangxin
 * Time: 2017/5/2 0002.
 * Desc:
 */
public class ByteUtils {


    public static String bytesToHexString(byte[] src) {
        return bytesToHexString(src, src.length);
    }

    /**
     * @param src 待转换的字节数组
     * @param len 只转换字节数组中的前len个字节
     * @return 转换成的字符串, 考虑到这是对底层数据的操作,
     */
    public static String bytesToHexString(byte[] src, int len) {
        StringBuilder stringBuilder = new StringBuilder("");
        if (src == null || len <= 0) {
            return null;
        }
        for (int i = 0; i < len; i++) {
            int v = src[i] & 0xFF;
            String hv = Integer.toHexString(v).toUpperCase();
            if (hv.length() < 2) {
                stringBuilder.append(0);
            }
            stringBuilder.append(hv);
        }
        return stringBuilder.toString();
    }

    //Java中并没有u16,所以这里使用int来表示;
    public static int bytesToU16(byte[] data) {
        assert data.length == 2;
        return (data[0] + 256) % 256 * 256 + (data[1] + 256) % 256;
    }

    //这个方法和下个方法区别在哪里,返回值不同啊...
    /*public static long bytesToU32(byte[] data) {
        assert data.length == 4;
        long res = 0;
        for (int i = 0; i < 4; i++) {
            res += res * 256 + (data[i] + 256) % 256;
        }
        return res;
    }*/

    public static int byteToInt32(byte[] data) {
        assert data.length == 4;
        int res = 0;
        for (int i = 0; i < data.length; i++) {
            res = res << 8 | (data[i] + 256) % 256;
        }
        return res;
    }

    public static long byteToLong64(byte[] data) {
        assert data.length == 8;
        long res = 0;
        for (int i = 0; i < data.length; i++) {
            res = res << 8 | (data[i] + 256) % 256;
        }
        return res;
    }


    public static float byte2Float32(byte[] b) {
        int i = byteToInt32(b);
        return Float.intBitsToFloat(i);
    }


    public static double byte2Double64(byte[] b) {
        long l = byteToLong64(b);
        return Double.longBitsToDouble(l);
    }
}


================================================
FILE: Java/src/Utils/Cmd.java
================================================
package Utils;

/**
 * Author: zhangxin
 * Time: 2017/4/30 0030.
 * Desc:Cmd解析程序
 */
public class Cmd {

    private boolean isRightFmt = true;     //是否是正确的格式;
    private boolean isRightOpt = true;     //是否是正确的格式;
    private boolean helpFlag;        //是否是help 查看帮助
    private boolean versionFlag;    //是否是查看版本
    private String cpOption;  //classPath 的路径;          java -cp(-classpath) xxx
    /*使用 -Xjre 的选项:这是一个非标准的选项,java命令中是没有的,使用这个选项目的是用来指定启动类路径来寻找和加载Java标准库中的类
    即JAVA_HOME/jre的路径;
    这里要注意的是,如果真的要指定XjreOption,那么其路径值必须要用双引号包含起来
    */
    private String xJreOption;
    private String clazz;  //包含main方法的class文件;
    private String[] args; //执行clazz文件需要的参数


    public Cmd(String cmdLine) {
        parseCmd(cmdLine);
    }

    public Cmd(String[] strs) {
        parseCmd(strs);
    }

    public void parseCmd(String[] args) {
        int classNameIndex = 1;
        //参数必须大于等于2,否则不合法。最简短的java命令:java -version
        if (args.length < 2) {
            isRightFmt = false;
            return;
        }
        //首先判断开头是不是 java ,如果连这个都不是,直接退出吧,提示正确的使用方法;
        if (!"java".equals(args[0])) {
            isRightFmt = false;
        } else {
            if ("-help".equals(args[1]) || "-?".equals(args[1])) {
                helpFlag = true;
            } else if ("-version".equals(args[1])) {
                versionFlag = true;
            } else if ("-cp".equals(args[1]) || "classpath".equals(args[1])) {
                if (args.length < 4) {
                    //如果走到这一步,那么命令行必定是java -cp aa/bb test 11 22 33 的形式,所以应该至少有4项;
                    isRightFmt = false;
                }
                classNameIndex = 3;
                this.cpOption = args[2];
            } else if ("-Xjre".equals(args[1])) {
                if (args.length < 4) {
                    //如果走到这一步,那么命令行必定是java -Xjre "C:\Program Files\Java\jdk1.8.0_20\jre" java.lang.Object 的形式,所以应该至少有4项;
                    isRightFmt = false;
                }
                classNameIndex = 3;
                this.xJreOption = args[2];
            } else if (args[1].startsWith("-")) {
                isRightOpt = false;
            }

            this.clazz = args[classNameIndex];
            this.args = new String[args.length - classNameIndex - 1];
            int argsIndex = classNameIndex + 1;
            for (int i = argsIndex; i < args.length; i++) {
                this.args[i - argsIndex] = args[i];
            }
        }
    }

    private void parseCmd(String cmdLine) {
        //NOTE:解析命令行参数,以单个或者多个空格分开,这种方式目前不支持,因为如果输入的 路径名 中间有空格会导致下面解析失败
        String[] args = cmdLine.trim().split("\\s+");
        parseCmd(args);
    }


    public void printUsage() {
        System.out.println("Usage: java [-options] class [args...]");
        System.out.println("Specially,we don't support the path that contains space!");
    }

    public boolean isRightFmt() {
        return isRightFmt;
    }

    public boolean isRightOpt() {
        return isRightOpt;
    }

    public boolean isHelpFlag() {
        return helpFlag;
    }

    public boolean isVersionFlag() {
        return versionFlag;
    }

    public String getCpOption() {
        return cpOption;
    }

    public String getXJreOption() {
        return xJreOption;
    }

    public String getClazz() {
        return clazz;
    }

    public String[] getArgs() {
        return args;
    }
}


================================================
FILE: Java/src/classfile/ClassFile.java
================================================
package classfile;

import Utils.ByteUtils;
import classfile.attribute.AttributeInfo;
import classfile.attribute.SourceFileAttribute;


/**
 * Author: zhangxin
 * Time: 2017/5/2 0002.
 * Desc: 由javac编译生成的class文件的bean对象
 */
public class ClassFile {

    private int minorVersion;
    private int majorVersion;
    public ConstantPool constantPool;
    private int accessFlags;

    /*
    该索引值指向常量池中一个类型为 CONSTANT_Class_info的类描述符常量,
    再通过 CONSTANT_Class_info类型的常量中的索引值,可以找到定义在CONSTANT_Utf8_info类型的常量中的全限定名字符串。
     */
    private int thisClass;
    private int superClass;         //同 thisClass 的索引值。
    private int[] interfaces;     //存放所实现的接口在常量池中的索引。同 thisClass 的索引值。
    private MemberInfo[] fields;    //存放类中所有的字段,包括静态的非静态的;不同的属性通过字段的访问修饰符来读取;
    private MemberInfo[] methods;   //存放类中所有的方法,包括静态的非静态的;不同的属性通过方法的访问修饰符来读取;
    private AttributeInfo[] attributes; //属性表,存放类的属性;


    public ClassFile(byte[] classData) {
        ClassReader reader = new ClassReader(classData);
        read(reader);
    }

    /**
     * 读取class文件,解析各个字段
     *
     * @param reader
     */
    private void read(ClassReader reader) {
        readAndCheckMagic(reader);
        readAndCheckVersion(reader);
        constantPool = new ConstantPool(reader);
        accessFlags = reader.readUint16();
        thisClass = reader.readUint16();
        superClass = reader.readUint16();
        interfaces = reader.readUint16s();
        fields = MemberInfo.readMembers(reader, constantPool);
        methods = MemberInfo.readMembers(reader, constantPool);
        attributes = AttributeInfo.readAttributes(reader, constantPool);
    }


    //文件开头前四个字节,是魔数,因为是64的无符号的,所以不能简单的使用long来表示,目前的解决方法是将4个字节的byte数组转换为字符串,对比class文件的魔数
    private void readAndCheckMagic(ClassReader reader) {
        String magic = ByteUtils.bytesToHexString(reader.readUint32());
        if (!magic.equals("CAFEBABE")) {
            throw new RuntimeException("java.lang.ClassFormatError: magic!");
        }
    }

    //版本号,16字节,分别代表主版本号和次版本号,并向前兼容
    private void readAndCheckVersion(ClassReader reader) {
        minorVersion = reader.readUint16();
        majorVersion = reader.readUint16();
        if (majorVersion == 45) {
            return;
        }
        if (minorVersion == 0 && majorVersion >= 46 && majorVersion <= 52) {
            return;
        }
        throw new RuntimeException("java.lang.UnsupportedClassVersionError!");
    }

    public int getMinorVersion() {
        return minorVersion;
    }

    public int getMajorVersion() {
        return majorVersion;
    }

    public ConstantPool getConstantPool() {
        return constantPool;
    }

    public int getAccessFlags() {
        return accessFlags;
    }

    public int getThisClass() {
        return thisClass;
    }

    public int getSuperClass() {
        return superClass;
    }

    public int[] getInterfaces() {
        return interfaces;
    }

    public MemberInfo[] getFields() {
        return fields;
    }

    public MemberInfo[] getMethods() {
        return methods;
    }

    public AttributeInfo[] getAttributes() {
        return attributes;
    }

    public String getClassName() {
        return constantPool.getClassName(thisClass);
    }

    public String getSuperClassName() {
        if (superClass > 0) {
            return constantPool.getClassName(superClass);
        } else {
            return "";
        }
    }

    public String[] getInterfaceNames() {
        String[] interfaceNames = new String[interfaces.length];
        for (int i = 0; i < interfaceNames.length; i++) {
            interfaceNames[i] = constantPool.getClassName(interfaces[i]);
        }
        return interfaceNames;

    }


    public String getSourceFile() {
        for (AttributeInfo info : attributes) {
            if (info instanceof SourceFileAttribute) {
                return ((SourceFileAttribute) info).getFileName();
            }
        }
        return "unknow";
    }
}


================================================
FILE: Java/src/classfile/ClassReader.java
================================================
package classfile;

import Utils.ByteUtils;

/**
 * Author: zhangxin
 * Time: 2017/5/2 0002.
 * Desc: 封装的读取 class 字节码文件的 reader,里面包含一个index值,表明当前要读的字节数组的索引.
 */
public class ClassReader {

    private byte[] data;
    private int index = 0;

    public ClassReader(byte[] data) {
        this.data = data;
    }

    // u1
    public byte readUint8() {
        byte res = data[index++];
        return res;
    }


    // u2 这里是读取一个无符号的16位整,java中没有,只能用int来代替吧;
    public int readUint16() {
        byte[] res = new byte[2];
        res[0] = data[index++];
        res[1] = data[index++];
        return ByteUtils.bytesToU16(res);
    }

    // u4
    public byte[] readUint32() {
        byte[] res = new byte[4];
        res[0] = data[index++];
        res[1] = data[index++];
        res[2] = data[index++];
        res[3] = data[index++];
//        return ByteUtils.bytesToU32(res);  //如果需要转换的话,自行调用ByteUtils中的方法;
        return res;
    }

    public byte[] readUint64() {
        byte[] res = new byte[8];
        res[0] = data[index++];
        res[1] = data[index++];
        res[2] = data[index++];
        res[3] = data[index++];
        res[4] = data[index++];
        res[5] = data[index++];
        res[6] = data[index++];
        res[7] = data[index++];
        return res;
    }

    /**
     * 读取连续的16bit长的数组,首先读出16bit,用来表示接下来要去读的多少个16bit
     * @return
     */
    public int[] readUint16s() {
        int n = readUint16();
        int[] data = new int[n];
        for (int i = 0; i < n; i++) {
            data[i] = readUint16();
        }
        return data;
    }

    public byte[] readBytes(int n) {
        byte[] res = new byte[n];
        for (int i = 0; i < n; i++) {
            res[i] = data[index++];
        }
        return res;
    }

}


================================================
FILE: Java/src/classfile/ConstantPool.java
================================================
package classfile;

import classfile.classconstant.*;

/**
 * Author: zhangxin
 * Time: 2017/5/2 0002.
 * Desc: 常量池实际上也是一个表,这里用数组来实现,所以常量池这个类中持有一个常量数据
 * 至于这个数组的每一项的初始化,则根据读到的字节的tag不同而创建不同的常量子类
 * 常量池有多中项目类型,这个根据读取到的tag的不同创建不同的常量类,
 */
public class ConstantPool {
    //保存类文件常量池中的所有常量,常量分为多种类型,基本类型都有对应的常量,以及字符串等;(简言之,这就是常量池的抽象)
    ConstantInfo[] infos;

    public ConstantInfo[] getInfos() {
        return infos;
    }

    //class文件中常量池中的常量数量,注意返回的这个数量是包含0的,但是0是空的;
    private int constantPoolCount;
    private int realConstantPoolCount;

    public ConstantPool(ClassReader reader) {
        /*读出常量池的大小;接下来根据这个大小,生成常量信息数组;
        注意:
        1. 表头给出的常量池大小比实际大1,所以这样的话,虽然可能生成了这么大的,但是0不使用,直接从1开始;
        2. 有效的常量池索引是1~n–1。0是无效索引,表示不指向任何常量
        3. CONSTANT_Long_info和 CONSTANT_Double_info各占两个位置。
           也就是说,如果常量池中存在这两种常量,实际的常量数量比n–1还要少,而且1~n–1的某些数也会变成无效索引。
        */
        constantPoolCount = reader.readUint16();
        infos = new ConstantInfo[constantPoolCount];
        for (int i = 1; i < constantPoolCount; i++) {
            infos[i] = ConstantInfo.readConstantInfo(reader, this);
            realConstantPoolCount++;
//            System.out.println(i+":"+infos[i].getClass());
            if ((infos[i] instanceof ConstantLongInfo) || (infos[i] instanceof ConstantDoubleInfo)) {
                i++;
            }
        }

    }

    //按索引查找常量,如果没有的话,直接抛异常;
    private ConstantInfo getConstantInfo(int index) {
        if (0 < index && index < constantPoolCount) {
            ConstantInfo info = infos[index];
            if (info != null) {
                return info;
            }
        }
        throw new NullPointerException("Invalid constant pool index!");
    }

    //常量池查找字段或方法的名字和描述符
    public String getName(int index) {
        ConstantNameAndTypeInfo info = (ConstantNameAndTypeInfo) getConstantInfo(index);
        return getUtf8(info.nameIndex);
    }

    //常量池查找字段或方法的描述符,描述符其实就是由其对应的类型名字对应而成;
    public String getType(int index) {
        ConstantNameAndTypeInfo info = (ConstantNameAndTypeInfo) getConstantInfo(index);
        return getUtf8(info.descriptorIndex);
    }

    public String[] getNameAndType(int index) {
        String[] str = new String[2];
        ConstantNameAndTypeInfo info = (ConstantNameAndTypeInfo) getConstantInfo(index);
        str[0] = getUtf8(info.nameIndex);
        str[1] = getUtf8(info.descriptorIndex);
        return str;
    }

    public String getClassName(int index) {
        ConstantClassInfo info = (ConstantClassInfo) getConstantInfo(index);
        return getUtf8(info.nameIndex);
    }

    //只要调用这个方法,一定是想去读字符串常量了,所以拿到index所对应的常量后,直接强转为ConstantUtf8Info,然后获取其val值;
    public String getUtf8(int index) {
        return ((ConstantUtf8Info) getConstantInfo(index)).val;
    }

    //测试方法,正式版本祛除
    public int getConstantPoolCount() {
        return realConstantPoolCount;
    }
}




================================================
FILE: Java/src/classfile/MemberInfo.java
================================================
package classfile;

import classfile.attribute.AttributeInfo;
import classfile.attribute.CodeAttribute;
import classfile.attribute.ConstantValueAttribute;
import classfile.attribute.ExceptionsAttribute;

/**
 * Author: zhangxin
 * Time: 2017/5/2 0002.
 * Desc: 字段表和方法表,共用该类,因为二者在虚拟机规范中的定义是相同的
 * 里面包含的是类中的所定义的成员变量/方法
 * 字段/方法中可能还包含属性
 * 静态的和非静态的都包含
 */
/*
field_info {
  u2 access_flags;
  u2 name_index;
  u2 descriptor_index;
  u2 attributes_count;
  attribute_info attributes[attributes_count];
}
 */
public class MemberInfo {
    ConstantPool constantPool;
    int accessFlags;
    int nameIndex;
    int descriptorIndex;
    AttributeInfo[] attributes;

    public MemberInfo(ClassReader reader, ConstantPool constantPool) {
        this.constantPool = constantPool;
        accessFlags = reader.readUint16();
        nameIndex = reader.readUint16();
        descriptorIndex = reader.readUint16();
        attributes = AttributeInfo.readAttributes(reader, constantPool);
    }

    public static MemberInfo[] readMembers(ClassReader reader, ConstantPool constantPool) {
        int memberCount = reader.readUint16();
        MemberInfo[] members = new MemberInfo[memberCount];
        for (int i = 0; i < memberCount; i++) {
            members[i] = new MemberInfo(reader, constantPool);
        }
        return members;
    }

    public int getAccessFlags() {
        return accessFlags;
    }

    public String getName() {
        return constantPool.getUtf8(nameIndex);
    }

    public String getDescriptor() {
        return constantPool.getUtf8(descriptorIndex);
    }

    public CodeAttribute getCodeAttribute() {
        for (AttributeInfo info : attributes) {
            if (info instanceof CodeAttribute) {
                return (CodeAttribute) info;
            }
        }
        return null;
    }

    //并非每个成员变量都有ConstantValueAttribute属性,该属性只针对于static final 基础类型变量或者String类型变量;
    public ConstantValueAttribute getConstantValueAttribute() {
        for (AttributeInfo info : attributes) {
            if (info instanceof ConstantValueAttribute) {
                return (ConstantValueAttribute) info;
            }
        }
        return null;
    }


    public ExceptionsAttribute getExceptionsAttribute() {
        for (int i = 0; i < attributes.length; i++) {
            if (attributes[i] instanceof ExceptionsAttribute) {
                return (ExceptionsAttribute) attributes[i];
            }
        }
        return null;
    }
}


================================================
FILE: Java/src/classfile/attribute/AttributeInfo.java
================================================
package classfile.attribute;

import Utils.ByteUtils;
import classfile.ClassReader;
import classfile.ConstantPool;

/**
 * Author: zhangxin
 * Time: 2017/5/3 0003.
 * Desc:
 */

/*  属性表在JVM中的定义;
虚拟机规范中,每个属性都定义了name_index,用来从常量池中拿到属性名;
attr_len,用来定义属性的的长度,便于接下来的解读
其实很多属性的长度都是已知的,
不确定长度的有:code属性,其长度需要根据len来读取;
attribute_info {
    u2 attribute_name_index;
    u4 attribute_length;
    u1 info[attribute_length];
}
*/
public abstract class AttributeInfo {

    //抽象方法,由各属性自己读取对应的属性信息
    abstract void readInfo(ClassReader reader);

    //读取单个属性
    private static AttributeInfo readAttribute(ClassReader reader, ConstantPool constantPool) {
        int attrNameIndex = reader.readUint16();
        String attrName = constantPool.getUtf8(attrNameIndex);
        int attrLen = ByteUtils.byteToInt32(reader.readUint32());
        AttributeInfo attrInfo = create(attrName, attrLen, constantPool);
        attrInfo.readInfo(reader);
        return attrInfo;
    }

    /**
     * 读取属性表;
     * 和ConstantPool中的方法类似,一般都是一下子全部读取出来,不会只读一个
     * 整个 JVM 中有三个地方用到了读取属性表
     * 1. 由 class 文件转为 ClassFile 对象时,读取 Class 的属性
     * 2. 为 class 中定义的 Field 和 Method 读取属性
     * 3. 为 Method 中的字节码读取属性(本地变量表大小,操作数大小,字节码,异常表)
     */
    public static AttributeInfo[] readAttributes(ClassReader reader, ConstantPool constantPool) {
        int attributesCount = reader.readUint16();
        AttributeInfo[] attributes = new AttributeInfo[attributesCount];
        for (int i = 0; i < attributesCount; i++) {
            attributes[i] = readAttribute(reader, constantPool);
        }
        return attributes;
    }

    //Java虚拟机规范预定义了23种属性,先解析其中的8种
    /*23种预定义属性可以分为三组。
    第一组属性是实现Java虚拟机所必需的,共有5种;
    第二组属性是Java类库所必需的,共有12种;
    第三组属性主要提供给工具使用,共有6种。第三组属性是可选的,也就是说可以不出现在class文件中。
    (如果class文件中存在第三组属性,Java虚拟机实现或者Java类库也是可以利用它们的,比如使用LineNumberTable属性在异常堆栈中显示行号。)
     */
    private static AttributeInfo create(String attrName, int attrLen, ConstantPool constantPool) {
        if ("Code".equals(attrName)) {
            return new CodeAttribute(constantPool);
        } else if ("ConstantValue".equals(attrName)) {
            return new ConstantValueAttribute();
        } else if ("Deprecated".equals(attrName)) {
            return new DeprecatedAttribute();
        } else if ("Exceptions".equals(attrName)) {
            return new ExceptionsAttribute();
        } else if ("LineNumberTable".equals(attrName)) {
            return new LineNumberTableAttribute();
        } else if ("LocalVariableTable".equals(attrName)) {
            return new LocalVariableTableAttribute();
        } else if ("SourceFile".equals(attrName)) {
            return new SourceFileAttribute(constantPool);
        } else if ("Synthetic".equals(attrName)) {
            return new SyntheticAttribute();
        } else {
            return new UnparsedAttribute(attrName, attrLen);
        }

    }
}


================================================
FILE: Java/src/classfile/attribute/CodeAttribute.java
================================================
package classfile.attribute;

import Utils.ByteUtils;
import classfile.ClassReader;
import classfile.ConstantPool;

/**
 * Author: zhangxin
 * Time: 2017/5/3 0003.
 * Desc:Code是变长属性,只存在于method_info结构中
 */

/*
JVM 中 Code 属性的定义;
Code_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 max_stack;
u2 max_locals;
u4 code_length;
u1 code[code_length];
u2 exception_table_length;
{ u2 start_pc;
u2 end_pc;
u2 handler_pc;
u2 catch_type;
} exception_table[exception_table_length];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
*/
public class CodeAttribute extends AttributeInfo {
    ConstantPool constantPool;
    int maxStack;       //操作数栈的最大深度
    int maxLocals;      //局部变量表大小
    byte[] code;        //字节码
    ExceptionTableEntry[] exceptionTable;   //
    AttributeInfo[] attributes;

    public CodeAttribute(ConstantPool constantPool) {
        this.constantPool = constantPool;
    }

    @Override
    void readInfo(ClassReader reader) {
        maxStack = reader.readUint16();
        maxLocals = reader.readUint16();
        int codeLength = ByteUtils.byteToInt32(reader.readUint32());
        code = reader.readBytes(codeLength);
        exceptionTable = readExceptionTable(reader);
        attributes = readAttributes(reader, constantPool);
    }

    private ExceptionTableEntry[] readExceptionTable(ClassReader reader) {
        int exceptionTableLength = reader.readUint16();
        ExceptionTableEntry[] exceptionTable = new ExceptionTableEntry[exceptionTableLength];
        for (int i = 0; i < exceptionTableLength; i++) {
            exceptionTable[i] = new ExceptionTableEntry(reader);
        }
        return exceptionTable;
    }

    public LineNumberTableAttribute lineNumberTableAttribute() {
        for (int i = 0; i < attributes.length; i++) {
            if (attributes[i] instanceof LineNumberTableAttribute) {
                return (LineNumberTableAttribute) attributes[i];
            }
        }
        return null;
    }


    //异常表,包含四个指针,分别为
    public static class ExceptionTableEntry {
        int startPc;        //可能排除异常的代码块的起始字节码(包括)
        int endPc;          //可能排除异常的代码块的终止字节码(不包括)
        int handlerPc;      //负责处理异常的 catch 块的其实位置
        int catchType;      //指向运行时常量池的一个索引,解析后可以得到一个异常类


        //改为传入一个reader的方法,比上面的构造方法更优雅一些;
        public ExceptionTableEntry(ClassReader reader) {
            this.startPc = reader.readUint16();
            this.endPc = reader.readUint16();
            this.handlerPc = reader.readUint16();
            this.catchType = reader.readUint16();
        }

        public int getStartPc() {
            return startPc;
        }

        public int getEndPc() {
            return endPc;
        }

        public int getHandlerPc() {
            return handlerPc;
        }

        public int getCatchType() {
            return catchType;
        }
    }

    public int getMaxStack() {
        return maxStack;
    }

    public int getMaxLocals() {
        return maxLocals;
    }

    public byte[] getCode() {
        return code;
    }

    public ExceptionTableEntry[] getExceptionTable() {
        return exceptionTable;
    }


}


================================================
FILE: Java/src/classfile/attribute/ConstantValueAttribute.java
================================================
package classfile.attribute;

import classfile.ClassReader;

/**
 * Author: zhangxin
 * Time: 2017/5/3 0003.
 * Desc:ConstantValue是定长属性,只会出现在field_info结构中。
 * 其作用是通知JVM自动为静态变量赋值。只有被static关键字修饰的变量才有这个属性。
 * 对于以下三种情况:
 * int a1 = 123;
 * static int a2 = 123;
 * final static int a3 = 123;
 *
 * a1是实例变量,其赋值是在实例构造器<init>方法中完成的。
 * 而对于a2和a3,他们都是类变量,那么其赋值有两种情况,一种是在<clinit>,一种是使用ConstantValue属性;
 * 目前Sun Javac 的选择是:a3 使用生成 ConstantValue 属性的方法来赋值
 * a2则将会在<clinit>中进行赋值。
 *
 * 表示常量表达式的值,其在JVM中定义如下:
 * ConstantValue_attribute {
 * u2 attribute_name_index;
 * u4 attribute_length;
 * u2 constantvalue_index;
 * }
 * 其中attribute_length的值必须是2。constantvalue_index是常量池索引,代表了常量池中一个字面量常量的引用。
 */
public class ConstantValueAttribute extends AttributeInfo {

    int constantValueIndex;
    @Override
    void readInfo(ClassReader reader) {
        constantValueIndex = reader.readUint16();
    }

    public int getConstantValueIndex() {
        return constantValueIndex;
    }
}


================================================
FILE: Java/src/classfile/attribute/DeprecatedAttribute.java
================================================
package classfile.attribute;

import classfile.ClassReader;

/**
 * Author: zhangxin
 * Time: 2017/5/3 0003.
 * Desc:仅起标记作用,不包含任何数据。是JDK1.1引入的,可以出现在 ClassFile、field_info和method_info结构中
 * 属于布尔属性,只有存在和不存在的区别。
 */
public class DeprecatedAttribute extends AttributeInfo {
    int attribute_name_index;
    int attribute_length;

    @Override
    void readInfo(ClassReader reader) {
        //由于没有数据,所以是空的.
    }
}


================================================
FILE: Java/src/classfile/attribute/ExceptionsAttribute.java
================================================
package classfile.attribute;

import classfile.ClassReader;

/**
 * Author: zhangxin
 * Time: 2017/5/3 0003.
 * Desc: Exceptions是变长属性,记录方法抛出的异常表
 */

/*
Exceptions_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 number_of_exceptions;
u2 exception_index_table[number_of_exceptions];
}
*/

public class ExceptionsAttribute extends AttributeInfo {

    int[] exceptionIndexTable;

    @Override
    void readInfo(ClassReader reader) {
        exceptionIndexTable = reader.readUint16s();
    }

    public int[] getExceptionIndexTable() {
        return exceptionIndexTable;
    }
}


================================================
FILE: Java/src/classfile/attribute/LineNumberTableAttribute.java
================================================
package classfile.attribute;

import classfile.ClassReader;

/**
 * Author: zhangxin
 * Time: 2017/5/3 0003.
 * Desc: LineNumberTable属性表存放方法的行号信息,和前面介绍的SourceFile属性都属于调试信息,都不是运行时必需
 * 在使用javac编译器编译Java程序时,默认会在class文件中生成这些信息。可以使用javac提供的-g:none选项来关闭这些信息的生成
 * 描述Java源码行号与字节码行号之间的对应关系。
 */
public class LineNumberTableAttribute extends AttributeInfo {
    LineNumberTableEntry[] lineNumberTable;

    @Override
    void readInfo(ClassReader reader) {
        int lineNumberTableLength = reader.readUint16();
        this.lineNumberTable = new LineNumberTableEntry[lineNumberTableLength];
        for (int i = 0; i < lineNumberTableLength; i++) {
            lineNumberTable[i] = new LineNumberTableEntry(reader.readUint16(), reader.readUint16());
        }
    }

    /* 根据字节码中的行号,寻找其在源代码中的行号;一般情况下;多个字节码的行号可能会对应一个源文件中的一行
    0 - 15
    8 - 17
    14 - 21
    17 - 18
    18 - 20
    22 - 24
    可以确保的是字节码中的行号递增的,而对应的源码中的行号并不是
    */
    public int getLineNumber(int pc) {
        for (int i = lineNumberTable.length - 1; i >= 0; i--) {
            LineNumberTableEntry entry = lineNumberTable[i];
            if (pc >= entry.startPc) {
                return entry.lineNumber;
            }
        }
        return -1;
    }

    static class LineNumberTableEntry {
        int startPc;    //字节码行号
        int lineNumber; //Java源码行号,二者执行的关联

        public LineNumberTableEntry(int startPc, int lineNumber) {
            this.startPc = startPc;
            this.lineNumber = lineNumber;
        }
    }
}


================================================
FILE: Java/src/classfile/attribute/LocalVariableTableAttribute.java
================================================
package classfile.attribute;

import classfile.ClassReader;

/**
 * Author: zhangxin
 * Time: 2017/5/3 0003.
 * Desc: 用于描述栈帧中局部变量表中的变量和Java源码中定义的变量之间的关系。
 * 这并不是运行时必须的属性,但默认会生成到Class文件中,可以在Javac 中使用 -g:none 来取消这项信息;
 * 如果不生成这项,产生的影响是:当其他人引用这个方法时,IDE将会使用诸如arg0,arg1之类的占位符代替原来的参数名,但对运行毫无影响。
 * 只是在调试期间无法根据参数名从上下文中获得参数值。
 */
public class LocalVariableTableAttribute extends AttributeInfo {
    LocalVariableTableEntry[] localVariableTable;

    @Override
    void readInfo(ClassReader reader) {
        int localVariableTableLength = reader.readUint16();
        this.localVariableTable = new LocalVariableTableEntry[localVariableTableLength];
        for (int i = 0; i < localVariableTableLength; i++) {
            localVariableTable[i] = new LocalVariableTableEntry(
                    reader.readUint16(),
                    reader.readUint16(),
                    reader.readUint16(),
                    reader.readUint16(),
                    reader.readUint16()
            );
        }
    }

    static class LocalVariableTableEntry {
        int startPc;    //代表该局部变量的生命周期开始的字节码偏移量
        int length;     //代表该局部变量的作用范围所覆盖的长度
        int nameIndex;    //指向常量池中个CONSTANT_Utf8_info型常量的索引,代表局部变量名称
        int descriptorIndex;    //指向常量池中个CONSTANT_Utf8_info型常量的索引,变量描述符
        int index;      //该局部变量在栈帧局部变量包中slot的位置

        public LocalVariableTableEntry(int startPc, int length, int nameIndex, int descriptorIndex, int index) {
            this.startPc = startPc;
            this.length = length;
            this.nameIndex = nameIndex;
            this.descriptorIndex = descriptorIndex;
            this.index = index;
        }
    }
}


================================================
FILE: Java/src/classfile/attribute/SourceFileAttribute.java
================================================
package classfile.attribute;

import classfile.ClassReader;
import classfile.ConstantPool;

/**
 * Author: zhangxin
 * Time: 2017/5/3 0003.
 * Desc:SourceFile是可选定长属性,只会出现在ClassFile结构中,用于指出源文件名 name
 * 这个属性也是可选的,使用 Javac -g:none 选项关闭该项信息。
 * 对于大多数情况,类名和文件名是一致的,但是只有在内部类中,如果抛出异常,并且没有生成该项,堆栈中将不会显示出错代码所属的文件名。
 */
public class SourceFileAttribute extends AttributeInfo {

    //sourcefile_index是常量池索引,指向CONSTANT_Utf8_info常量,其常量值是源码文件的文件名
    int sourceFileIndex;
    ConstantPool constantPool;

    public SourceFileAttribute(ConstantPool constantPool) {
        this.constantPool = constantPool;
    }

    @Override
    void readInfo(ClassReader reader) {
        sourceFileIndex = reader.readUint16();
    }

    public String getFileName() {
        return constantPool.getUtf8(sourceFileIndex);
    }
}


================================================
FILE: Java/src/classfile/attribute/SyntheticAttribute.java
================================================
package classfile.attribute;

import classfile.ClassReader;

/**
 * Author: zhangxin
 * Time: 2017/5/3 0003.
 * Desc:仅起标记作用,不包含任何数据。是JDK1.1引入的,可以出现在 ClassFile、field_info和method_info结构中
 * 代表词字段或方法并不是由Java源码生成的,而是由编译器自行添加的。
 */
public class SyntheticAttribute extends AttributeInfo {
    int attribute_name_index;
    int attribute_length;

    @Override
    void readInfo(ClassReader reader) {
        //由于没有数据,所以是空的.
    }
}


================================================
FILE: Java/src/classfile/attribute/UnparsedAttribute.java
================================================
package classfile.attribute;

import classfile.ClassReader;

/**
 * Author: zhangxin
 * Time: 2017/5/3 0003.
 * Desc: 由于精力有限,这里不可能将所有的属性都实现,只是挑重要的几个实现,其它的都直接跳过所对应的字节数即可。
 */
public class UnparsedAttribute extends AttributeInfo {
    private String attrName;
    private int attrLen;
    private byte[] info;

    public UnparsedAttribute(String attrName, int attrLen) {
        this.attrName = attrName;
        this.attrLen = attrLen;
    }

    @Override
    void readInfo(ClassReader reader) {
        info = reader.readBytes(attrLen);
    }
}


================================================
FILE: Java/src/classfile/classconstant/ConstantClassInfo.java
================================================
package classfile.classconstant;

import classfile.ClassReader;
import classfile.ConstantPool;

/**
 * Author: zhangxin
 * Time: 2017/5/2 0002.
 * Desc:表示类或者接口的符号引用
 * 类和超类索引,以及接口表中的接口索引指向的都是CONSTANT_Class_info常量
 * <p>
 * ClassFileTest的this_class索引是5,其 name_index=50,super_class(Object)的索引是6,其name_index=51, 这里其实存的还是名字
 * 5代表的是this_class,本类类名的引用,其值在50处,可以看到常量池50的地方保存的就是jvmgo/book/ch03/ClassFileTest的字符串
 * 51处保存的就是java/lang/Object的字符串
 */
public class ConstantClassInfo extends ConstantInfo {
    ConstantPool constantPool;
    public int nameIndex;

    public ConstantClassInfo(ConstantPool constantPool, int i) {
        this.constantPool = constantPool;
        type = i;
    }


    @Override
    void readInfo(ClassReader reader) {
        nameIndex = reader.readUint16();
    }

    public String getName() {
        return constantPool.getUtf8(nameIndex);
    }
}


================================================
FILE: Java/src/classfile/classconstant/ConstantDoubleInfo.java
================================================
package classfile.classconstant;

import Utils.ByteUtils;
import classfile.ClassReader;

/**
 * Author: zhangxin
 * Time: 2017/5/2 0002.
 * Desc:
 */
public class ConstantDoubleInfo extends ConstantInfo {
    double val;

    public ConstantDoubleInfo(int i) {
        type = i;
    }


    @Override
    void readInfo(ClassReader reader) {
        byte[] data = reader.readUint64();
        val = ByteUtils.byte2Double64(data);
    }

    public double getVal() {
        return val;
    }
}


================================================
FILE: Java/src/classfile/classconstant/ConstantFieldRefInfo.java
================================================
package classfile.classconstant;

import classfile.ConstantPool;

/**
 * Author: zhangxin
 * Time: 2017/5/3 0003.
 * Desc: 字段符号引用
 */
public class ConstantFieldRefInfo extends ConstantMemberRefInfo {
    public ConstantFieldRefInfo(ConstantPool constantPool,int type) {
        super(constantPool,type);
    }
}


================================================
FILE: Java/src/classfile/classconstant/ConstantFloatInfo.java
================================================
package classfile.classconstant;

import Utils.ByteUtils;
import classfile.ClassReader;

/**
 * Author: zhangxin
 * Time: 2017/5/2 0002.
 * Desc:
 */
public class ConstantFloatInfo extends ConstantInfo {
    float val;

    public ConstantFloatInfo(int i) {
        type = i;
    }

    @Override
    void readInfo(ClassReader reader) {
        byte[] data = reader.readUint32();
        val = ByteUtils.byte2Float32(data);
    }


    public float getVal() {
        return val;
    }
}


================================================
FILE: Java/src/classfile/classconstant/ConstantInfo.java
================================================
package classfile.classconstant;

import classfile.ClassReader;
import classfile.ConstantPool;

/**
 * Author: zhangxin
 * Time: 2017/5/2 0002.
 * Desc: 常量的抽象类,这里实现了常量池中所有常量的类型。
 * 由于常量池中存放的信息各不相同,所以每种常量的格式也不同。常量数据的第一字节是tag,用来区分常量类型。
 * 根据在常量池的字节码的每个tag字节,可以判断下一个常量类型是什么,每个常量占用多少个字节都是可以确定的,接着再读取下一个tag,确定下一个常量类型;
 */
public abstract class ConstantInfo {
    public static final int CONSTANT_Utf8 = 1;
    public static final int CONSTANT_Integer = 3;
    public static final int CONSTANT_Float = 4;
    public static final int CONSTANT_Long = 5;
    public static final int CONSTANT_Double = 6;
    public static final int CONSTANT_Class = 7;
    public static final int CONSTANT_String = 8;
    public static final int CONSTANT_Fieldref = 9;
    public static final int CONSTANT_Methodref = 10;
    public static final int CONSTANT_InterfaceMethodref = 11;
    public static final int CONSTANT_NameAndType = 12;
    public static final int CONSTANT_MethodHandle = 15;
    public static final int CONSTANT_MethodType = 16;
    public static final int CONSTANT_InvokeDynamic = 18;


    //抽象方法来读取信息,需要各自具体类去实现;因为每种常量所占的字节数并不相同。
    abstract void readInfo(ClassReader reader);

    //表明当前常量的类型是上述常量的哪一种;
    protected int type;

    public int getType() {
        return type;
    }

    public static ConstantInfo readConstantInfo(ClassReader reader, ConstantPool constantPool) {
        int type = (reader.readUint8() + 256) % 256;
        ConstantInfo info = create(type, constantPool);
        info.readInfo(reader);
        return info;
    }

    private static ConstantInfo create(int type, ConstantPool constantPool) {
        switch (type) {
            case CONSTANT_Utf8:
                return new ConstantUtf8Info(1);
            case CONSTANT_Integer:
                return new ConstantIntegerInfo(3);
            case CONSTANT_Float:
                return new ConstantFloatInfo(4);
            case CONSTANT_Long:
                return new ConstantLongInfo(5);
            case CONSTANT_Double:
                return new ConstantDoubleInfo(6);
            case CONSTANT_String:
                return new ConstantStringInfo(constantPool, 8);
            case CONSTANT_Class:
                return new ConstantClassInfo(constantPool, 7);
            case CONSTANT_Fieldref:
                return new ConstantFieldRefInfo(constantPool, 9);
            case CONSTANT_Methodref:
                return new ConstantMethodRefInfo(constantPool, 10);
            case CONSTANT_InterfaceMethodref:
                return new ConstantInterfaceMethodRefInfo(constantPool, 11);
            case CONSTANT_NameAndType:
                return new ConstantNameAndTypeInfo(12);
            case CONSTANT_MethodType:
                return new ConstantMethodTypeInfo(16);
            case CONSTANT_MethodHandle:
                return new ConstantMethodHandleInfo(15);
            case CONSTANT_InvokeDynamic:
                return new ConstantInvokeDynamicInfo(18);
            default:
                throw new RuntimeException("java.lang.ClassFormatError: constant pool tag!");
        }
    }
}




================================================
FILE: Java/src/classfile/classconstant/ConstantIntegerInfo.java
================================================
package classfile.classconstant;

import Utils.ByteUtils;
import classfile.ClassReader;

/**
 * Author: zhangxin
 * Time: 2017/5/2 0002.
 * Desc: 使用4字节存储整数常量
 * 实际上比int更小的boolean、byte、short和char类型的常量也放在 CONSTANT_Integer_info 中,也是存的四字节,这是为了4k对齐,可是也造成了字节的浪费;
 */
public class ConstantIntegerInfo extends ConstantInfo {
    int val;

    public ConstantIntegerInfo(int i) {
        type = i;
    }

    @Override
    void readInfo(ClassReader reader) {
        byte[] data = reader.readUint32();
        val = ByteUtils.byteToInt32(data);
    }



    public int getVal() {
        return val;
    }
}


================================================
FILE: Java/src/classfile/classconstant/ConstantInterfaceMethodRefInfo.java
================================================
package classfile.classconstant;

import classfile.ConstantPool;

/**
 * Author: zhangxin
 * Time: 2017/5/3 0003.
 * Desc: 接口方法引用消息
 */
public class ConstantInterfaceMethodRefInfo extends ConstantMemberRefInfo {
    public ConstantInterfaceMethodRefInfo(ConstantPool constantPool, int type) {
        super(constantPool, type);
    }
}


================================================
FILE: Java/src/classfile/classconstant/ConstantInvokeDynamicInfo.java
================================================
package classfile.classconstant;

import classfile.ClassReader;

/**
 * Author: zhangxin
 * Time: 2017/5/2 0002.
 * Desc:
 */
public class ConstantInvokeDynamicInfo extends ConstantInfo {
    int bootstrapMethodAttrIndex;
    int nameAndTypeIndex;

    public ConstantInvokeDynamicInfo(int i) {
        type = i;
    }

    @Override
    void readInfo(ClassReader reader) {
        bootstrapMethodAttrIndex = reader.readUint16();
        nameAndTypeIndex = reader.readUint16();
    }
}


================================================
FILE: Java/src/classfile/classconstant/ConstantLongInfo.java
================================================
package classfile.classconstant;

import Utils.ByteUtils;
import classfile.ClassReader;

/**
 * Author: zhangxin
 * Time: 2017/5/2 0002.
 * Desc:
 */
public class ConstantLongInfo extends ConstantInfo {
    long val;

    public ConstantLongInfo(int i) {
       type = i;
    }


    @Override
    void readInfo(ClassReader reader) {
        byte[] data = reader.readUint64();
       /* String hexData = ByteUtils.bytesToHexString(data);
        val = Long.parseLong(hexData, 16);*/
        val = ByteUtils.byteToLong64(data);
    }

    public long getVal() {
        return val;
    }


}


================================================
FILE: Java/src/classfile/classconstant/ConstantMemberRefInfo.java
================================================
package classfile.classconstant;

import classfile.ClassReader;
import classfile.ConstantPool;

/**
 * Author: zhangxin
 * Time: 2017/5/2 0002.
 * Desc:
 * CONSTANT_Fieldref_info表示字段符号引用
 * CONSTANT_Methodref_info表示普通(非接口)方法符号引用
 * CONSTANT_InterfaceMethodref_info表示接口方法符号引用
 * 这三种类型结构一样,所以给出统一的类结构;
 * 然后定义三个类继承这个超类;
 * class_index和name_and_type_index都是常量池索引,分别指向CONSTANT_Class_info和CONSTANT_NameAndType_info常量。
 */
/*
CONSTANT_Fieldref_info {
    u1 tag;
    u2 class_index;
    u2 name_and_type_index;
}
 */
public class ConstantMemberRefInfo extends ConstantInfo {
    ConstantPool constantPool;
    int classIndex;
    int nameAndTypeIndex;

    //    该构造方法是供子类调用的,虽然有三个子类,但是并没有使用过该子类,因为当前类(父类)已经满足需求了;
//    public ConstantMemberRefInfo(ConstantPool constantPool) {
//        this.constantPool = constantPool;
//    }

    //    该构造方法是供外部调用的;
    public ConstantMemberRefInfo(ConstantPool constantPool, int type) {
        this.constantPool = constantPool;
        this.type = type; //因为接口,方法,字段通用这一个类,所以在构造方法中传入 i 来区分不同的类型;
    }


    @Override
    void readInfo(ClassReader reader) {
        classIndex = reader.readUint16();
        nameAndTypeIndex = reader.readUint16();
    }

    public String getClassName() {
        return constantPool.getClassName(classIndex);
    }

    public String[] getNameAndDescriptor() {
        return constantPool.getNameAndType(nameAndTypeIndex);
    }


    //下面两个方法是将上面的单独分开拿出来的,
    public String getName() {
        return constantPool.getName(nameAndTypeIndex);
    }

    public String getDescriptor() {
        return constantPool.getType(nameAndTypeIndex);
    }


}


================================================
FILE: Java/src/classfile/classconstant/ConstantMethodHandleInfo.java
================================================
package classfile.classconstant;

import classfile.ClassReader;

/**
 * Author: zhangxin
 * Time: 2017/5/2 0002.
 * Desc: ava7 中的属性,在本 JVM 中未实现
 */
public class ConstantMethodHandleInfo extends ConstantInfo {
    //关于byte上界,自行处理;
    private byte referenceKind;
    private int referenceIndex;

    public ConstantMethodHandleInfo(int i) {
        type = i;
    }


    @Override
    void readInfo(ClassReader reader) {
        referenceKind = reader.readUint8();
        referenceIndex = reader.readUint16();
    }

    public int getReferenceKind() {
        return (referenceKind + 256) % 256;
    }

    public int getReferenceIndex() {
        return referenceIndex;
    }
}


================================================
FILE: Java/src/classfile/classconstant/ConstantMethodRefInfo.java
================================================
package classfile.classconstant;

import classfile.ConstantPool;

/**
 * Author: zhangxin
 * Time: 2017/5/3 0003.
 * Desc: 方法引用消息
 */
public class ConstantMethodRefInfo extends ConstantMemberRefInfo {
    public ConstantMethodRefInfo(ConstantPool constantPool, int type) {
        super(constantPool, type);
    }
}


================================================
FILE: Java/src/classfile/classconstant/ConstantMethodTypeInfo.java
================================================
package classfile.classconstant;

import classfile.ClassReader;

/**
 * Author: zhangxin
 * Time: 2017/5/2 0002.
 * Desc: Java7 中的属性,在本 JVM 中未实现
 */
public class ConstantMethodTypeInfo extends ConstantInfo {
    //关于byte上界,自行处理;
    private int descriptorIndex;

    public ConstantMethodTypeInfo(int i) {
        type = i;
    }


    @Override
    void readInfo(ClassReader reader) {
        descriptorIndex = reader.readUint16();
    }

    public int getDescriptorIndex() {
        return descriptorIndex;
    }
}


================================================
FILE: Java/src/classfile/classconstant/ConstantNameAndTypeInfo.java
================================================
package classfile.classconstant;

import classfile.ClassReader;

/**
 * Author: zhangxin
 * Time: 2017/5/2 0002.
 * Desc:
 * name_index和descriptor_index都是常量池索引,指向CONSTANT_Utf8_info常量。
 * 字段(成员变量)和方法名就是代码中出现的(或者编译器生成的)字段或方法的名字。
 * 字段或方法名由name_index给出,对应的就是代码中真实的成员变量名或者方法名
 * 字段或方法的描述符由descriptor_index给出
 * 描述符:描述字段的类型,描述方法的参数类型;
 * <p>
 * (1)
 * a:基本类型byte、short、char、int、long、float和double的描述符是单个字母,分别对应B、S、C、I、J、F和D。注意,long的描述符是J而不是L。
 * b:引用类型的描述符是 L + 类的完全限定名 + 分号 eg: Ljava.lang.String;
 * c:数组类型的描述符是[+数组元素类型描述符。eg: [I  代表int[]
 * <p>
 * (2)字段描述符就是字段类型的描述符。
 * (3)方法描述符是(分号分隔的参数类型描述符)+返回值类型描述符,其中void返回值由单个字母V表示。eg:(Ljava.lang.String;I)Ljava.lang.String
 * 代表的就是 String (String int),方法名由name_index给出;
 */

/*
CONSTANT_NameAndType_info {
    u1 tag;
    u2 name_index;
    u2 descriptor_index;
}
 */
public class ConstantNameAndTypeInfo extends ConstantInfo {
    public int nameIndex;
    public int descriptorIndex;

    public ConstantNameAndTypeInfo(int i) {
        type = i;
    }


    @Override
    void readInfo(ClassReader reader) {
        nameIndex = reader.readUint16();
        descriptorIndex = reader.readUint16();
    }
}


================================================
FILE: Java/src/classfile/classconstant/ConstantStringInfo.java
================================================
package classfile.classconstant;

import classfile.ClassReader;
import classfile.ConstantPool;

/**
 * Author: zhangxin
 * Time: 2017/5/2 0002.
 * Desc:本身并不存放字符串数据,只存了常量池索引,这个索引指向一个CONSTANT_Utf8_info常量
 * 所以在readInfo中首先读出索引,然后在去对应的CONSTANT_Utf8_info常量中读取具体的字符串
 */
public class ConstantStringInfo extends ConstantInfo {
    ConstantPool constantPool;
    int stringIndex;

    public ConstantStringInfo(ConstantPool constantPool,int i) {
        this.constantPool = constantPool;
        type = i;
    }


    //读取常量池索引
    @Override
    void readInfo(ClassReader reader) {
        stringIndex = reader.readUint16();
    }

    public String getString() {
        return constantPool.getUtf8(stringIndex);
    }
}


================================================
FILE: Java/src/classfile/classconstant/ConstantUtf8Info.java
================================================
package classfile.classconstant;

import classfile.ClassReader;

import java.io.IOException;
import java.io.UTFDataFormatException;

/**
 * Author: zhangxin
 * Time: 2017/5/2 0002.
 * Desc:放的是MUTF-8编码的字符串,
 * 注意,字符串在class文件中是以MUTF-8(Modified UTF-8)方式编码的。
 * <p>
 * MUTF-8编码方式和UTF-8大致相同,但并不兼容。
 * 差别有两点:
 * 一是null字符(代码点U+0000)会被编码成2字节:0xC0、0x80;
 * 二是补充字符(Supplementary Characters,代码点大于U+FFFF的Unicode字符)是按UTF-16拆分为代理对(Surrogate Pair)分别编码的
 * <p>
 * 字段名(变量名)、字段描述符等就是以字符串的形式存储在class文件中的
 */
public class ConstantUtf8Info extends ConstantInfo {
    public String val;

    public ConstantUtf8Info(int i) {
        type = i;
    }


    @Override
    void readInfo(ClassReader reader) {
        int len = reader.readUint16();
        byte[] data = reader.readBytes(len);
        try {
            val = decodeMUTF8(data);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //将MUTF8转为UTF8编码, 根据java.io.DataInputStream.readUTF()方法改写。
    private static String decodeMUTF8(byte[] bytearr) throws IOException {
        int utflen = bytearr.length;
        char[] chararr = new char[utflen];
        int c, char2, char3;
        int count = 0;
        int chararr_count = 0;

        while (count < utflen) {
            c = (int) bytearr[count] & 0xff;
            if (c > 127) {
                break;
            }
            count++;
            chararr[chararr_count++] = (char) c;
        }

        while (count < utflen) {
            c = (int) bytearr[count] & 0xff;
            switch (c >> 4) {
                case 0:
                case 1:
                case 2:
                case 3:
                case 4:
                case 5:
                case 6:
                case 7:
                    /* 0xxxxxxx*/
                    count++;
                    chararr[chararr_count++] = (char) c;
                    break;
                case 12:
                case 13:
                    /* 110x xxxx   10xx xxxx*/
                    count += 2;
                    if (count > utflen) {
                        throw new UTFDataFormatException("malformed input: partial character at end");
                    }
                    char2 = (int) bytearr[count - 1];
                    if ((char2 & 0xC0) != 0x80) {
                        throw new UTFDataFormatException("malformed input around byte " + count);
                    }
                    chararr[chararr_count++] = (char) (((c & 0x1F) << 6) |
                            (char2 & 0x3F));
                    break;
                case 14:
                    /* 1110 xxxx  10xx xxxx  10xx xxxx */
                    count += 3;
                    if (count > utflen) {
                        throw new UTFDataFormatException(
                                "malformed input: partial character at end");
                    }
                    char2 = (int) bytearr[count - 2];
                    char3 = (int) bytearr[count - 1];
                    if (((char2 & 0xC0) != 0x80) || ((char3 & 0xC0) != 0x80)) {
                        throw new UTFDataFormatException(
                                "malformed input around byte " + (count - 1));
                    }
                    chararr[chararr_count++] = (char) (((c & 0x0F) << 12) |
                            ((char2 & 0x3F) << 6) |
                            ((char3 & 0x3F) << 0));
                    break;
                default:
                    /* 10xx xxxx,  1111 xxxx */
                    throw new UTFDataFormatException(
                            "malformed input around byte " + count);
            }
        }
        // The number of chars produced may be less than utflen
        return new String(chararr, 0, chararr_count);
    }
    /*private static String decodeMUTF8(byte[] bytearr) {
        int utfLen = bytearr.length;
        char[] chararr = new char[utfLen];
        char c, char2, char3;
        int count = 0;
        int chararr_count = 0;

        while (count < utfLen) {
            c = (char) ((bytearr[count] + 256) % 256);
            if (c > 127) {
                break;
            }
            count++;
            chararr[chararr_count] = c;
            chararr_count++;
        }

        while (count < utfLen) {
            c = (char) ((bytearr[count] + 256) % 256);
            switch (c >> 4) {
                *//* 0xxxxxxx*//*
                case 0:
                case 1:
                case 2:
                case 3:
                case 4:
                case 5:
                case 6:
                case 7:
                    count++;
                    chararr[chararr_count] = c;
                    chararr_count++;
                    break;
                case 12:
                case 13:
                    *//* 110x xxxx   10xx xxxx*//*
                    count += 2;
                    if (count > utfLen) {
                        throw new RuntimeException("malformed input: partial character at end");
                    }
                    char2 = (char) ((bytearr[count - 1] + 256) % 256);
                    if ((char2 & 0xC0) != 0x80) {
                        throw new RuntimeException("malformed input around byte " + count);
                    }
                    chararr[chararr_count] = (char) (c & 0x1F << 6 | char2 & 0x3F);
                    chararr_count++;
                    break;
                case 14:
                    *//* 1110 xxxx  10xx xxxx  10xx xxxx*//*
                    count += 3;
                    if (count > utfLen) {
                        throw new RuntimeException("malformed input: partial character at end");
                    }
                    char2 = (char) ((bytearr[count - 2] + 256) % 256);
                    char3 = (char) ((bytearr[count - 1] + 256) % 256);
                    if ((char2 & 0xC0) != 0x80 || (char3 & 0xC0) != 0x80) {
                        throw new RuntimeException("malformed input around byte " + (count - 1));
                    }
                    chararr[chararr_count] = (char) (c & 0x0F << 12 | char2 & 0x3F << 6 | char3 & 0x3F << 0);
                    chararr_count++;
                    break;
                default:
                  *//* 10xx xxxx,  1111 xxxx *//*
                    throw new RuntimeException("malformed input around byte " + count);
            }
        }
        char[] res = new char[chararr_count];
        for (int i = 0; i < chararr_count; i++) {
            res[i] = chararr[i];
        }
        return new String(res);
    }*/

    public String getVal() {
        return val;
    }
}


================================================
FILE: Java/src/classpath/ClassPath.java
================================================
package classpath;

import java.io.File;
import java.io.IOException;

import static classpath.Entry.createEntry;

/**
 * Author: zhangxin
 * Time: 2017/5/1 0001.
 * Desc:
 */
public class ClassPath {
    // jre路径
    private String jreDir;
    //分别存放三种类路径
    private Entry bootClasspath;
    private Entry extClasspath;
    private Entry userClasspath;

    //parse()函数使用 -Xjre 选项解析启动类路径和扩展类路径
    // 使用-classpath/-cp选项解析用户类路径
    //以此来初始化成员变量的三种路径
    public ClassPath(String jreOption, String cpOption) {
        jreDir = getJreDir(jreOption);
        bootClasspath = parseBootClasspath();
        extClasspath = parseExtClasspath();
        userClasspath = parseUserClasspath(cpOption);
    }


    private Entry parseBootClasspath() {
        //可能出现的情况是: jre/lib/*
        String jreLibPath = jreDir + File.separator + "lib" + File.separator + "*";
        return new WildcardEntry(jreLibPath);
    }

    private Entry parseExtClasspath() {
        //可能出现的情况是: jre/lib/ext/*
        String jreExtPath = jreDir + File.separator + "lib" + File.separator + "ext" + File.separator + "*";
        return new WildcardEntry(jreExtPath);
    }

    //确定传进来的jre的路径是否有效;
    private String getJreDir(String jreOption) {
        File jreFile;
        if (jreOption != null && !"".equals(jreOption)) {
            jreFile = new File(jreOption);
            if (jreFile.exists()) {
                return jreOption;
            }
        }

        //jreOption选项为空,那么在当前路径找
        jreFile = new File("jre");
        if (jreFile.exists()) {
            return jreFile.getAbsolutePath();
        }

        //在JAVA_HOME中找
        String java_home = System.getenv("JAVA_HOME");
        if (java_home != null) {
            return java_home + File.separator + "jre";
        }

        throw new RuntimeException("Can not find jre folder!");
    }

    private Entry parseUserClasspath(String cpOption) {
        return Entry.createEntry(cpOption);
    }

    /***
     * ClassPath 对外的统一接口,实例化ClassPath时传入 userPath 路径和类名就可以读取字节码文件
     * 读取className 对应的字节码,注意顺序,我们的查找次序是:
     * bootClasspath => extClasspath => userClasspath;
     * @param className
     * @return
     */
    public byte[] readClass(String className) {
        //注意,用命令行加载java文件时,只写文件名,所有这里统一为文件名后补上“.class”的后缀;
        if (className.endsWith(".class")) {
            throw new RuntimeException("can't find or can't load the class: " + className);
        }
        className = className.replace(".", "/");
        className = className + ".class";
        byte[] data;
        try {
            data = bootClasspath.readClass(className);
            if (data != null) {
                return data;
            }

            data = extClasspath.readClass(className);
            if (data != null) {
                return data;
            }

            data = userClasspath.readClass(className);
            if (data != null) {
                return data;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        throw new RuntimeException("can't find class!");
    }

    @Override
    public String toString() {
        return userClasspath.printClassName();
    }
}


================================================
FILE: Java/src/classpath/CompositeEntry.java
================================================
package classpath;

import java.io.IOException;
import java.util.ArrayList;

/**
 * Author: zhangxin
 * Time: 2017/4/30 0030.
 * Desc: CompositeEntry由众多的Entry组成,正好可以表示成 Entry list;
 * 构造函数把参数(路径列表)按分隔符分成小路径,然后把每个小路径都转换成具体的 Entry实例
 */
public class CompositeEntry extends Entry {
    //不用担心,list中的entry是按照父类来转入的,在真正执行的时候,是按照各自的实际类型执行readClass()方法
    ArrayList<Entry> compositeEntries;
    private String pathList;

    public CompositeEntry() {
    }

    public CompositeEntry(String pathList, String pathListSeparator) {
        this.pathList = pathList;
        String[] paths = pathList.split(pathListSeparator);
        compositeEntries = new ArrayList<Entry>(paths.length);
        for (int i = 0; i < paths.length; i++) {
            compositeEntries.add(new DirEntry(paths[i]));
        }
    }

    @Override
    byte[] readClass(String className) {
        byte[] data;
        for (int i = 0; i < compositeEntries.size(); i++) {
            try {
                data = compositeEntries.get(i).readClass(className);
                if (data != null) {
                    return data;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        return null;
    }

    @Override
    String printClassName() {
        return pathList;
    }
}


================================================
FILE: Java/src/classpath/DirEntry.java
================================================
package classpath;

import java.io.*;

/**
 * Author: zhangxin
 * Time: 2017/4/30 0030.
 * Desc: 表示目录形式的类路径,这是相对来说最简单的一种了,拿到的直接就是指定的路径
 */
public class DirEntry extends Entry {
    private String absDir;

    public DirEntry(String path) {
        File dir = new File(path);
        if (dir.exists()) {
            absDir = dir.getAbsolutePath();
        }
    }


 /*   @Override
    byte[] readClass(String className) {
        File file = new File(absDir, className);
        byte[] temp = new byte[1024];
        BufferedInputStream in = null;
        ByteArrayOutputStream out = null;
        try {
            in = new BufferedInputStream(new FileInputStream(file));
            out = new ByteArrayOutputStream(1024);
            int size = 0;
            while ((size = in.read(temp)) != -1) {
                out.write(temp, 0, size);
            }
            return out.toByteArray();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                    if (out != null) {
                        out.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }*/

    @Override
    byte[] readClass(String className) throws IOException {
        File file = new File(absDir, className);
        if (!file.exists()) {
            return null;
        }
        byte[] temp = new byte[1024];
        BufferedInputStream in = null;
        ByteArrayOutputStream out = null;

        in = new BufferedInputStream(new FileInputStream(file));
        out = new ByteArrayOutputStream(1024);
        int size = 0;
        while ((size = in.read(temp)) != -1) {
            out.write(temp, 0, size);
        }
        if (in != null) {
            in.close();
        }
        if (out != null) {
            out.close();
        }
        return out.toByteArray();
    }


    @Override
    String printClassName() {
        return absDir;
    }
}


================================================
FILE: Java/src/classpath/Entry.java
================================================
package classpath;

import java.io.File;
import java.io.IOException;

/**
 * Author: zhangxin
 * Time: 2017/4/30 0030.
 * Desc:
 */
public abstract class Entry {
    //路径分隔符,在window下,使用 ; 分割开的  在Unix/Linux下使用: 分割开的
    public static final String pathListSeparator = System.getProperty("os.name").contains("Windows") ? ";" : ":";

    /**
     * 负责寻找和加载class文件
     *
     * @param className class文件的相对路径,路径之间用斜线 / 分隔,文件名有.class后缀
     */
    abstract byte[] readClass(String className) throws IOException;

    /**
     * @return 返回className的字符串表示形式;
     */
    abstract String printClassName();


    /**
     * 工厂方法,根据传入的path的形式不同,
     *
     * @param path 命令行得到的路径字符串
     * @return 创建具体的Entry
     */
    static Entry createEntry(String path) {
        if (path != null) {
            if (path.contains(pathListSeparator)) {
                return new CompositeEntry(path, pathListSeparator);
            } else if (path.contains("*")) {
                return new WildcardEntry("");
            } else if (path.contains(".jar") || path.contains(".JAR") || path.contains(".zip")
                    || path.contains("" + ".ZIP")) {
                return new ZipJarEntry(path);
            }
            return new DirEntry(path);
        } else {
            //如果命令行中没有显式的指定-cp选项,那么默认要找的class就在当前路径下
            File file = new File("");
            try {
                path = file.getCanonicalPath();
                return new DirEntry(path);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        throw new RuntimeException("illegal classpath format,or you should point out the classpath explicitly");
    }

}


================================================
FILE: Java/src/classpath/WildcardEntry.java
================================================
package classpath;

import java.io.File;
import java.util.ArrayList;

/**
 * Author: zhangxin
 * Time: 2017/4/30 0030.
 * Desc:处理的是路径匹配的 xxx.* 的情况
 * 首先把路径末尾的星号去掉,得到baseDir,然后遍历该baseDir路径下的文件,只取以 .jar 结尾的文件;
 *
 * 这个类其实是CompositeEntry的一个包装类;
 */
public class WildcardEntry extends Entry {

    public CompositeEntry compositeEntry;

    public WildcardEntry(String jreLibPath) {

        String baseDir = jreLibPath.substring(0, jreLibPath.length() - 1);  //去掉最后的一个字符 *
        File dir = new File(baseDir);
        File[] files = dir.listFiles();
        compositeEntry = new CompositeEntry();
        compositeEntry.compositeEntries = new ArrayList<Entry>();
        for (File file : files) {
            if (file.isFile() && file.getName().endsWith(".jar")) {
               compositeEntry.compositeEntries.add(new ZipJarEntry(baseDir,file.getName()));
            }
        }
//        System.out.println(compositeEntry.compositeEntries.size());
    }

    @Override
    byte[] readClass(String className) {
        return compositeEntry.readClass(className);
    }

    @Override
    String printClassName() {
        return null;
    }
}


================================================
FILE: Java/src/classpath/ZipJarEntry.java
================================================
package classpath;

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;

/**
 * Author: zhangxin
 * Time: 2017/4/30 0030.
 * Desc: ZipJarEntry表示ZIP或JAR文件形式的类路径,避免和Java中的ZipEntry冲突,起名为ZipJarEntry;
 */
public class ZipJarEntry extends Entry {
    String absPath;    // E:\JavaSrc\JVMByHand\tmp\test.zip  全路径
    String zipName;     // test     压缩包名,不带 .zip 或者 jar

    public ZipJarEntry(String path) {
        File dir = new File(path);
        if (dir.exists()) {
            absPath = dir.getParentFile().getAbsolutePath();
            zipName = dir.getName();
            //去掉结尾的.zip或者.jar 千万别碰上其它情况,要不直接异常了;
            zipName = zipName.substring(0, zipName.length() - 4);
        }
    }

    public ZipJarEntry(String path, String zipName) {
        File dir = new File(path, zipName);
        if (dir.exists()) {
            absPath = dir.getAbsolutePath();
            //去掉结尾的.zip或者.jar 千万别碰上其它情况,要不直接异常了;
            this.zipName = zipName.substring(0, zipName.length() - 4);
        }
    }

    /**
     * 从zip或者jar文件中提取class文件;
     *
     * @param className class文件的相对路径,路径之间用斜线 / 分隔,文件名有.class后缀
     */
    @Override
    byte[] readClass(String className) throws IOException {
        File file = new File(absPath);

        ZipInputStream zin = null;
        BufferedInputStream in = null;
        ByteArrayOutputStream out = null;

        ZipFile zf = new ZipFile(file);
//        ZipEntry ze = zf.getEntry(zipName + "/" + className); //如果是zip文件,获取ZipEntry的时候,直接用zipName+"/"+className
        ZipEntry ze = zf.getEntry(className); //如果是jar包,获取ZipEntry的时候,直接用className,
        if (ze == null) {
            return null;
        }
        in = new BufferedInputStream(zf.getInputStream(ze));
        out = new ByteArrayOutputStream(1024);
        int size = 0;
        byte[] temp = new byte[1024];
        while ((size = in.read(temp)) != -1) {
            out.write(temp, 0, size);
        }

        if (zin != null) {
            zin.closeEntry();
        }

        if (in != null) {
            in.close();
        }

        if (out != null) {
            out.close();
        }

        return out.toByteArray();
    }

    @Override
    String printClassName() {
        return absPath;
    }
}


================================================
FILE: Java/src/instructions/InstructionFactory.java
================================================
package instructions;

import instructions.base.Instruction;
import instructions.comparisons.dcmp.DCMPG;
import instructions.comparisons.dcmp.DCMPL;
import instructions.comparisons.fcmp.FCMPG;
import instructions.comparisons.fcmp.FCMPL;
import instructions.comparisons.ifacmp.IF_ACMPEQ;
import instructions.comparisons.ifacmp.IF_ACMPNE;
import instructions.comparisons.ifcond.*;
import instructions.comparisons.ificmp.*;
import instructions.comparisons.lcmp.LCMP;
import instructions.constants.*;
import instructions.control.*;
import instructions.conversions.d2x.D2F;
import instructions.conversions.d2x.D2I;
import instructions.conversions.d2x.D2L;
import instructions.conversions.f2x.F2D;
import instructions.conversions.f2x.F2I;
import instructions.conversions.f2x.F2L;
import instructions.conversions.i2x.*;
import instructions.conversions.l2x.L2D;
import instructions.conversions.l2x.L2F;
import instructions.conversions.l2x.L2I;
import instructions.extended.GOTO_W;
import instructions.extended.IFNONNULL;
import instructions.extended.IFNULL;
import instructions.extended.WIDE;
import instructions.loads.loaddouble.*;
import instructions.loads.loadfloat.*;
import instructions.loads.loadint.*;
import instructions.loads.loadlong.*;
import instructions.loads.loadref.*;
import instructions.loads.loadxarr.*;
import instructions.math.add.DADD;
import instructions.math.add.FADD;
import instructions.math.add.IADD;
import instructions.math.add.LADD;
import instructions.math.and.IAND;
import instructions.math.and.LAND;
import instructions.math.div.DDIV;
import instructions.math.div.FDIV;
import instructions.math.div.IDIV;
import instructions.math.div.LDIV;
import instructions.math.iinc.IINC;
import instructions.math.mul.DMUL;
import instructions.math.mul.FMUL;
import instructions.math.mul.IMUL;
import instructions.math.mul.LMUL;
import instructions.math.neg.DNEG;
import instructions.math.neg.FNEG;
import instructions.math.neg.INEG;
import instructions.math.neg.LNEG;
import instructions.math.or.IOR;
import instructions.math.or.LOR;
import instructions.math.rem.DREM;
import instructions.math.rem.FREM;
import instructions.math.rem.IREM;
import instructions.math.rem.LREM;
import instructions.math.sh.*;
import instructions.math.sub.DSUB;
import instructions.math.sub.FSUB;
import instructions.math.sub.ISUB;
import instructions.math.sub.LSUB;
import instructions.math.xor.IXOR;
import instructions.math.xor.LXOR;
import instructions.references.*;
import instructions.stack.dup.*;
import instructions.stack.pop.POP;
import instructions.stack.pop.POP2;
import instructions.stack.swap.SWAP;
import instructions.stores.storedouble.*;
import instructions.stores.storefloat.*;
import instructions.stores.storeint.*;
import instructions.stores.storelong.*;
import instructions.stores.storeref.*;
import instructions.stores.storexarr.*;


/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class InstructionFactory {
    static NOP nop = new NOP();
    static ACONST_NULL aconst_null = new ACONST_NULL();
    static ICONST_M1 iconst_m1 = new ICONST_M1();
    static ICONST_0 iconst_0 = new ICONST_0();
    static ICONST_1 iconst_1 = new ICONST_1();
    static ICONST_2 iconst_2 = new ICONST_2();
    static ICONST_3 iconst_3 = new ICONST_3();
    static ICONST_4 iconst_4 = new ICONST_4();
    static ICONST_5 iconst_5 = new ICONST_5();
    static LCONST_0 lconst_0 = new LCONST_0();
    static LCONST_1 lconst_1 = new LCONST_1();
    static FCONST_0 fconst_0 = new FCONST_0();
    static FCONST_1 fconst_1 = new FCONST_1();
    static FCONST_2 fconst_2 = new FCONST_2();
    static DCONST_0 dconst_0 = new DCONST_0();
    static DCONST_1 dconst_1 = new DCONST_1();
    static ILOAD_0 iload_0 = new ILOAD_0();
    static ILOAD_1 iload_1 = new ILOAD_1();
    static ILOAD_2 iload_2 = new ILOAD_2();
    static ILOAD_3 iload_3 = new ILOAD_3();
    static LLOAD_0 lload_0 = new LLOAD_0();
    static LLOAD_1 lload_1 = new LLOAD_1();
    static LLOAD_2 lload_2 = new LLOAD_2();
    static LLOAD_3 lload_3 = new LLOAD_3();
    static FLOAD_0 fload_0 = new FLOAD_0();
    static FLOAD_1 fload_1 = new FLOAD_1();
    static FLOAD_2 fload_2 = new FLOAD_2();
    static FLOAD_3 fload_3 = new FLOAD_3();
    static DLOAD_0 dload_0 = new DLOAD_0();
    static DLOAD_1 dload_1 = new DLOAD_1();
    static DLOAD_2 dload_2 = new DLOAD_2();
    static DLOAD_3 dload_3 = new DLOAD_3();
    static ALOAD_0 aload_0 = new ALOAD_0();
    static ALOAD_1 aload_1 = new ALOAD_1();
    static ALOAD_2 aload_2 = new ALOAD_2();
    static ALOAD_3 aload_3 = new ALOAD_3();
    static IALOAD iaload = new IALOAD();
    static LALOAD laload = new LALOAD();
    static FALOAD faload = new FALOAD();
    static DALOAD daload = new DALOAD();
    static AALOAD aaload = new AALOAD();
    static BALOAD baload = new BALOAD();
    static CALOAD caload = new CALOAD();
    static SALOAD saload = new SALOAD();
    static ISTORE_0 istore_0 = new ISTORE_0();
    static ISTORE_1 istore_1 = new ISTORE_1();
    static ISTORE_2 istore_2 = new ISTORE_2();
    static ISTORE_3 istore_3 = new ISTORE_3();
    static LSTORE_0 lstore_0 = new LSTORE_0();
    static LSTORE_1 lstore_1 = new LSTORE_1();
    static LSTORE_2 lstore_2 = new LSTORE_2();
    static LSTORE_3 lstore_3 = new LSTORE_3();
    static FSTORE_0 fstore_0 = new FSTORE_0();
    static FSTORE_1 fstore_1 = new FSTORE_1();
    static FSTORE_2 fstore_2 = new FSTORE_2();
    static FSTORE_3 fstore_3 = new FSTORE_3();
    static DSTORE_0 dstore_0 = new DSTORE_0();
    static DSTORE_1 dstore_1 = new DSTORE_1();
    static DSTORE_2 dstore_2 = new DSTORE_2();
    static DSTORE_3 dstore_3 = new DSTORE_3();
    static ASTORE_0 astore_0 = new ASTORE_0();
    static ASTORE_1 astore_1 = new ASTORE_1();
    static ASTORE_2 astore_2 = new ASTORE_2();
    static ASTORE_3 astore_3 = new ASTORE_3();
    static IASTORE iastore = new IASTORE();
    static LASTORE lastore = new LASTORE();
    static FASTORE fastore = new FASTORE();
    static DASTORE dastore = new DASTORE();
    static AASTORE aastore = new AASTORE();
    static BASTORE bastore = new BASTORE();
    static CASTORE castore = new CASTORE();
    static SASTORE sastore = new SASTORE();
    static POP pop = new POP();
    static POP2 pop2 = new POP2();
    static DUP dup = new DUP();
    static DUP_X1 dup_x1 = new DUP_X1();
    static DUP_X2 dup_x2 = new DUP_X2();
    static DUP2 dup2 = new DUP2();
    static DUP2_X1 dup2_x1 = new DUP2_X1();
    static DUP2_X2 dup2_x2 = new DUP2_X2();
    static SWAP swap = new SWAP();
    static IADD iadd = new IADD();
    static LADD ladd = new LADD();
    static FADD fadd = new FADD();
    static DADD dadd = new DADD();
    static ISUB isub = new ISUB();
    static LSUB lsub = new LSUB();
    static FSUB fsub = new FSUB();
    static DSUB dsub = new DSUB();
    static IMUL imul = new IMUL();
    static LMUL lmul = new LMUL();
    static FMUL fmul = new FMUL();
    static DMUL dmul = new DMUL();
    static IDIV idiv = new IDIV();
    static LDIV ldiv = new LDIV();
    static FDIV fdiv = new FDIV();
    static DDIV ddiv = new DDIV();
    static IREM irem = new IREM();
    static LREM lrem = new LREM();
    static FREM frem = new FREM();
    static DREM drem = new DREM();
    static INEG ineg = new INEG();
    static LNEG lneg = new LNEG();
    static FNEG fneg = new FNEG();
    static DNEG dneg = new DNEG();
    static ISHL ishl = new ISHL();
    static LSHL lshl = new LSHL();
    static ISHR ishr = new ISHR();
    static LSHR lshr = new LSHR();
    static IUSHR iushr = new IUSHR();
    static LUSHR lushr = new LUSHR();
    static IAND iand = new IAND();
    static LAND land = new LAND();
    static IOR ior = new IOR();
    static LOR lor = new LOR();
    static IXOR ixor = new IXOR();
    static LXOR lxor = new LXOR();
    static I2L i2l = new I2L();
    static I2F i2f = new I2F();
    static I2D i2d = new I2D();
    static L2I l2i = new L2I();
    static L2F l2f = new L2F();
    static L2D l2d = new L2D();
    static F2I f2i = new F2I();
    static F2L f2l = new F2L();
    static F2D f2d = new F2D();
    static D2I d2i = new D2I();
    static D2L d2l = new D2L();
    static D2F d2f = new D2F();
    static I2B i2b = new I2B();
    static I2C i2c = new I2C();
    static I2S i2s = new I2S();
    static LCMP lcmp = new LCMP();
    static FCMPL fcmpl = new FCMPL();
    static FCMPG fcmpg = new FCMPG();
    static DCMPL dcmpl = new DCMPL();
    static DCMPG dcmpg = new DCMPG();
    static IRETURN ireturn = new IRETURN();
    static LRETURN lreturn = new LRETURN();
    static FRETURN freturn = new FRETURN();
    static DRETURN dreturn = new DRETURN();
    static ARETURN areturn = new ARETURN();
    static RETURN _return = new RETURN();
    static ARRAY_LENGTH arraylength = new ARRAY_LENGTH();
    static ATHROW athrow = new ATHROW();
    /* static MONITOR_ENTER monitorenter  = new MONITOR_ENTER();
   static MONITOR_EXIT monitorexit   = new MONITOR_EXIT(); */
    static INVOKE_NATIVE invoke_native = new INVOKE_NATIVE();


    public static Instruction createInstruction(int opCode) {
        switch (opCode) {
            case 0x00:
                return nop;
            case 0x01:
                return aconst_null;
            case 0x02:
                return iconst_m1;
            case 0x03:
                return iconst_0;
            case 0x04:
                return iconst_1;
            case 0x05:
                return iconst_2;
            case 0x06:
                return iconst_3;
            case 0x07:
                return iconst_4;
            case 0x08:
                return iconst_5;
            case 0x09:
                return lconst_0;
            case 0x0a:
                return lconst_1;
            case 0x0b:
                return fconst_0;
            case 0x0c:
                return fconst_1;
            case 0x0d:
                return fconst_2;
            case 0x0e:
                return dconst_0;
            case 0x0f:
                return dconst_1;
            case 0x10:
                return new BIPUSH();
            case 0x11:
                return new SIPUSH();
            case 0x12:
                return new LDC();
            case 0x13:
                return new LDC_W();
            case 0x14:
                return new LDC2_W();
            case 0x15:
                return new ILOAD();
            case 0x16:
                return new LLOAD();
            case 0x17:
                return new FLOAD();
            case 0x18:
                return new DLOAD();
            case 0x19:
                return new ALOAD();
            case 0x1a:
                return iload_0;
            case 0x1b:
                return iload_1;
            case 0x1c:
                return iload_2;
            case 0x1d:
                return iload_3;
            case 0x1e:
                return lload_0;
            case 0x1f:
                return lload_1;
            case 0x20:
                return lload_2;
            case 0x21:
                return lload_3;
            case 0x22:
                return fload_0;
            case 0x23:
                return fload_1;
            case 0x24:
                return fload_2;
            case 0x25:
                return fload_3;
            case 0x26:
                return dload_0;
            case 0x27:
                return dload_1;
            case 0x28:
                return dload_2;
            case 0x29:
                return dload_3;
            case 0x2a:
                return aload_0;
            case 0x2b:
                return aload_1;
            case 0x2c:
                return aload_2;
            case 0x2d:
                return aload_3;
            case 0x2e:
                return iaload;
            case 0x2f:
                return laload;
            case 0x30:
                return faload;
            case 0x31:
                return daload;
            case 0x32:
                return aaload;
            case 0x33:
                return baload;
            case 0x34:
                return caload;
            case 0x35:
                return saload;
            case 0x36:
                return new ISTORE();
            case 0x37:
                return new LSTORE();
            case 0x38:
                return new FSTORE();
            case 0x39:
                return new DSTORE();
            case 0x3a:
                return new ASTORE();
            case 0x3b:
                return istore_0;
            case 0x3c:
                return istore_1;
            case 0x3d:
                return istore_2;
            case 0x3e:
                return istore_3;
            case 0x3f:
                return lstore_0;
            case 0x40:
                return lstore_1;
            case 0x41:
                return lstore_2;
            case 0x42:
                return lstore_3;
            case 0x43:
                return fstore_0;
            case 0x44:
                return fstore_1;
            case 0x45:
                return fstore_2;
            case 0x46:
                return fstore_3;
            case 0x47:
                return dstore_0;
            case 0x48:
                return dstore_1;
            case 0x49:
                return dstore_2;
            case 0x4a:
                return dstore_3;
            case 0x4b:
                return astore_0;
            case 0x4c:
                return astore_1;
            case 0x4d:
                return astore_2;
            case 0x4e:
                return astore_3;
            case 0x4f:
                return iastore;
            case 0x50:
                return lastore;
            case 0x51:
                return fastore;
            case 0x52:
                return dastore;
            case 0x53:
                return aastore;
            case 0x54:
                return bastore;
            case 0x55:
                return castore;
            case 0x56:
                return sastore;
            case 0x57:
                return pop;
            case 0x58:
                return pop2;
            case 0x59:
                return dup;
            case 0x5a:
                return dup_x1;
            case 0x5b:
                return dup_x2;
            case 0x5c:
                return dup2;
            case 0x5d:
                return dup2_x1;
            case 0x5e:
                return dup2_x2;
            case 0x5f:
                return swap;
            case 0x60:
                return iadd;
            case 0x61:
                return ladd;
            case 0x62:
                return fadd;
            case 0x63:
                return dadd;
            case 0x64:
                return isub;
            case 0x65:
                return lsub;
            case 0x66:
                return fsub;
            case 0x67:
                return dsub;
            case 0x68:
                return imul;
            case 0x69:
                return lmul;
            case 0x6a:
                return fmul;
            case 0x6b:
                return dmul;
            case 0x6c:
                return idiv;
            case 0x6d:
                return ldiv;
            case 0x6e:
                return fdiv;
            case 0x6f:
                return ddiv;
            case 0x70:
                return irem;
            case 0x71:
                return lrem;
            case 0x72:
                return frem;
            case 0x73:
                return drem;
            case 0x74:
                return ineg;
            case 0x75:
                return lneg;
            case 0x76:
                return fneg;
            case 0x77:
                return dneg;
            case 0x78:
                return ishl;
            case 0x79:
                return lshl;
            case 0x7a:
                return ishr;
            case 0x7b:
                return lshr;
            case 0x7c:
                return iushr;
            case 0x7d:
                return lushr;
            case 0x7e:
                return iand;
            case 0x7f:
                return land;
            case 0x80:
                return ior;
            case 0x81:
                return lor;
            case 0x82:
                return ixor;
            case 0x83:
                return lxor;
            case 0x84:
                return new IINC();
            case 0x85:
                return i2l;
            case 0x86:
                return i2f;
            case 0x87:
                return i2d;
            case 0x88:
                return l2i;
            case 0x89:
                return l2f;
            case 0x8a:
                return l2d;
            case 0x8b:
                return f2i;
            case 0x8c:
                return f2l;
            case 0x8d:
                return f2d;
            case 0x8e:
                return d2i;
            case 0x8f:
                return d2l;
            case 0x90:
                return d2f;
            case 0x91:
                return i2b;
            case 0x92:
                return i2c;
            case 0x93:
                return i2s;
            case 0x94:
                return lcmp;
            case 0x95:
                return fcmpl;
            case 0x96:
                return fcmpg;
            case 0x97:
                return dcmpl;
            case 0x98:
                return dcmpg;
            case 0x99:
                return new IFEQ();
            case 0x9a:
                return new IFNE();
            case 0x9b:
                return new IFLT();
            case 0x9c:
                return new IFGE();
            case 0x9d:
                return new IFGT();
            case 0x9e:
                return new IFLE();
            case 0x9f:
                return new IF_ICMPEQ();
            case 0xa0:
                return new IF_ICMPNE();
            case 0xa1:
                return new IF_ICMPLT();
            case 0xa2:
                return new IF_ICMPGE();
            case 0xa3:
                return new IF_ICMPGT();
            case 0xa4:
                return new IF_ICMPLE();
            case 0xa5:
                return new IF_ACMPEQ();
            case 0xa6:
                return new IF_ACMPNE();
            case 0xa7:
                return new GOTO();
            // case 0xa8:
            // 	return new JSR();
            // case 0xa9:
            // 	return new RET();
            case 0xaa:
                return new TABLE_SWITCH();
            case 0xab:
                return new LOOKUP_SWITCH();
            case 0xac:
                return ireturn;
            case 0xad:
                return lreturn;
            case 0xae:
                return freturn;
            case 0xaf:
                return dreturn;
            case 0xb0:
                return areturn;
            case 0xb1:
                return _return;
            case 0xb2:
                return new GET_STATIC();
            case 0xb3:
                return new PUT_STATIC();
            case 0xb4:
                return new GET_FIELD();
            case 0xb5:
                return new PUT_FIELD();
            case 0xb6:
                return new INVOKE_VIRTUAL();
            case 0xb7:
                return new INVOKE_SPECIAL();
            case 0xb8:
                return new INVOKE_STATIC();
            case 0xb9:
                return new INVOKE_INTERFACE();
            // case 0xba:
            // 	return new INVOKE_DYNAMIC();
            case 0xbb:
                return new NEW();
            case 0xbc:
                return new NEW_ARRAY();
            case 0xbd:
                return new ANEW_ARRAY();
            case 0xbe:
                return arraylength;
            case 0xbf:
                return athrow;
            case 0xc0:
                return new CHECK_CAST();
            case 0xc1:
                return new INSTANCE_OF();
            // case 0xc2:
            // 	return monitorenter;
            // case 0xc3:
            // 	return monitorexit;
            case 0xc4:
                return new WIDE();
            case 0xc5:
                return new MULTI_ANEW_ARRAY();
            case 0xc6:
                return new IFNULL();
            case 0xc7:
                return new IFNONNULL();
            case 0xc8:
                return new GOTO_W();
            // case 0xc9:
            // 	return new JSR_W();
            // case 0xca: breakpoint
            case 0xfe:
                return invoke_native;
            // case 0xff: impdep2
            default:
                throw new RuntimeException("Unsupported opcode: " + opCode);
        }
    }
}


================================================
FILE: Java/src/instructions/base/BranchInstruction.java
================================================
package instructions.base;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:表示跳转指令,Offset字段存放跳转偏移量。
 * 这个类是指令的子类,只负责读取offset,和BranchLogic类区别是:
 * BranchLogic负责将BranchInstruction拿到的offset值,从新计算pc,并赋值给Frame.pc;
 */
public abstract class BranchInstruction implements Instruction {
    public int offset;

    @Override
    public void fetchOperands(BytecodeReader reader) {
        offset = reader.readInt16();
    }
}


================================================
FILE: Java/src/instructions/base/BranchLogic.java
================================================
package instructions.base;

import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: 真正的跳转逻辑,因为这个函数在很多指令中都会用到,所以把它定义base中
 */
public class BranchLogic {
    public static void branch(Zframe frame, int offset) {
        int pc = frame.getThread().getPc();
        int nextPC = pc + offset;
        frame.setNextPC(nextPC);
    }
}


================================================
FILE: Java/src/instructions/base/BytecodeReader.java
================================================
package instructions.base;

import Utils.ByteUtils;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class BytecodeReader {
    private byte[] code;  //byte的范围四-128~127,和go中的byte:0~255不同,所以在取数据的时候需要注意;
    private int pc;

    /**
     * @param code
     * @param pc
     */
    public void reset(byte[] code, int pc) {
        this.code = code;
        this.pc = pc;
    }

    public int getPc() {
        return pc;
    }

    public byte readInt8() {
        byte res = code[pc];
        pc++;
        return res;
    }

    public int readUint8() {
        int res = code[pc];
        res = (res + 256) % 256;
        pc++;
        return res;
    }


    public int readInt16() {
        return (short) readUint16();
    }

    public int readUint16() {
        int a1 = readUint8();
        int a2 = readUint8();
        return (a1 << 8 | a2);
    }

    public int readInt32() {
        byte[] data = new byte[4];
        data[0] = readInt8();
        data[1] = readInt8();
        data[2] = readInt8();
        data[3] = readInt8();

        return ByteUtils.byteToInt32(data);
    }

    public int[] readInt32s(int n) {
        int[] data = new int[n];
        for (int i = 0; i < n; i++) {
            data[i] = readInt32();
        }
        return data;
    }


    //4k对齐,没有对齐的会有填充数据,这些数据要忽略掉;
    public void skipPadding() {
        while (pc % 4 != 0) {
            readInt8();
        }
    }
}


================================================
FILE: Java/src/instructions/base/ClassInitLogic.java
================================================
package instructions.base;

import runtimedata.Zframe;
import runtimedata.Zthread;
import runtimedata.heap.Zclass;
import runtimedata.heap.Zmethod;

/**
 * @author zachaxy
 * @date 17/12/28
 * desc:执行类的初始化
 */
public class ClassInitLogic {
    public static void initClass(Zthread thread, Zclass clazz) {
        clazz.startInit();
        scheduleClinit(thread, clazz);
        initSuperClass(thread, clazz);
    }

    private static void scheduleClinit(Zthread thread, Zclass clazz) {
        Zmethod clinit = clazz.getMethod("<clinit>", "()V");
        if (clinit != null && clinit.getClazz() == clazz) {
            // exec <clinit>
            Zframe newFrame = thread.createFrame(clinit);
            thread.pushFrame(newFrame);
        }
    }

    private static void initSuperClass(Zthread thread, Zclass clazz) {
        if (!clazz.isInterface()) {
            Zclass superClass = clazz.getSuperClass();
            if (superClass != null && !superClass.isInitStarted()) {
                initClass(thread, superClass);
            }
        }
    }
}




================================================
FILE: Java/src/instructions/base/Index16Instruction.java
================================================
package instructions.base;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:有一些指令需要访问运行时常量池,常量池索引由两字节操作数给出。
 */
public abstract class Index16Instruction implements Instruction {
    public int index;

    @Override
    public void fetchOperands(BytecodeReader reader) {
        index = reader.readUint16();
    }
}


================================================
FILE: Java/src/instructions/base/Index8Instruction.java
================================================
package instructions.base;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:存储和加载类指令需要根据索引存取局部变量表,索引由单字节操作数给出
 * 部分存储和加载指令是自带操作数的,所以不需要index;
 * 然后其余部分的指令,只有加载/存储的语义,并不知道将数据存储/加载到局部变量表的哪一位,所以需要index
 */
public abstract class Index8Instruction implements Instruction {

    public Index8Instruction(){}

    public int index;

    @Override
    public void fetchOperands(BytecodeReader reader) {
        index = reader.readUint8();
    }
}


================================================
FILE: Java/src/instructions/base/Instruction.java
================================================
package instructions.base;

import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: 每个指令都会实现该接口,所有的指令逻辑都是先从字节码数组中取数据,然后执行各自的逻辑
 */
public interface Instruction {
    //从字节码中提取操作数
    void fetchOperands(BytecodeReader reader);

    //执行指令逻辑
    void execute(Zframe frame);
}


================================================
FILE: Java/src/instructions/base/MethodInvokeLogic.java
================================================
package instructions.base;

import runtimedata.Slot;
import runtimedata.Zframe;
import runtimedata.Zthread;
import runtimedata.heap.Zmethod;

/**
 * @author zachaxy
 * @date 17/12/27
 */
public class MethodInvokeLogic {

    public static void invokeMethod(Zframe invokerFrame, Zmethod method) {
        Zthread thread = invokerFrame.getThread();
        Zframe newFrame = thread.createFrame(method);
        thread.pushFrame(newFrame);

        int argSlotCount = method.getArgSlotCount();
        if (argSlotCount > 0) {
            for (int i = argSlotCount - 1; i >= 0; i--) {
                Slot slot = invokerFrame.getOperandStack().popSlot();
                newFrame.getLocalVars().setSlot(i, slot);
            }
        }
    }
}


================================================
FILE: Java/src/instructions/base/NoOperandsInstruction.java
================================================
package instructions.base;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:表示没有操作数的指令,所以没有定义 任何字段。FetchOperands方法也是空实现,什么也不用读
 */
public abstract class NoOperandsInstruction implements Instruction{

    @Override
    public void fetchOperands(BytecodeReader reader) {

    }
}


================================================
FILE: Java/src/instructions/comparisons/dcmp/DCMP.java
================================================
package instructions.comparisons.dcmp;

import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: 由于浮点数计算有可能产生NaN(Not a Number)值,所以比较两个浮点数时,除了大于、等于、小于之外, 还有第4种结果:无法比较
 * fcmpg和fcmpl指令的区别就在于对第4种结果的定义;
 * 当两个float变量中至少有一个是NaN时,用fcmpg指令比较的结果是1,而用fcmpl指令比较的结果是-1。
 */
public class DCMP {
    static void _dcmp(Zframe frame, boolean flag) {
        OperandStack stack = frame.getOperandStack();
        double val2 = stack.popDouble();
        double val1 = stack.popDouble();

        if (val1 > val2) {
            stack.pushInt(1);
        } else if (val1 == val2) {
            stack.pushInt(0);
        } else if (val1 > val2) {
            stack.pushInt(-1);
        } else if (flag) {
            stack.pushInt(1);
        } else {
            stack.pushInt(-1);
        }

    }
}


================================================
FILE: Java/src/instructions/comparisons/dcmp/DCMPG.java
================================================
package instructions.comparisons.dcmp;

import instructions.base.NoOperandsInstruction;
import instructions.comparisons.fcmp.FCMP;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class DCMPG extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        DCMP._dcmp(frame, true);
    }
}


================================================
FILE: Java/src/instructions/comparisons/dcmp/DCMPL.java
================================================
package instructions.comparisons.dcmp;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class DCMPL extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        DCMP._dcmp(frame, false);
    }
}


================================================
FILE: Java/src/instructions/comparisons/fcmp/FCMP.java
================================================
package instructions.comparisons.fcmp;

import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: 由于浮点数计算有可能产生NaN(Not a Number)值,所以比较两个浮点数时,除了大于、等于、小于之外, 还有第4种结果:无法比较
 * fcmpg和fcmpl指令的区别就在于对第4种结果的定义;
 * 当两个float变量中至少有一个是NaN时,用fcmpg指令比较的结果是1,而用fcmpl指令比较的结果是-1。
 */
public class FCMP {
    static void _fcmp(Zframe frame, boolean flag) {
        OperandStack stack = frame.getOperandStack();
        float val2 = stack.popFloat();
        float val1 = stack.popFloat();

        if (val1 > val2) {
            stack.pushInt(1);
        } else if (val1 == val2) {
            stack.pushInt(0);
        } else if (val1 > val2) {
            stack.pushInt(-1);
        } else if (flag) {
            stack.pushInt(1);
        } else {
            stack.pushInt(-1);
        }

    }
}


================================================
FILE: Java/src/instructions/comparisons/fcmp/FCMPG.java
================================================
package instructions.comparisons.fcmp;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class FCMPG extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        FCMP._fcmp(frame, true);
    }
}


================================================
FILE: Java/src/instructions/comparisons/fcmp/FCMPL.java
================================================
package instructions.comparisons.fcmp;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class FCMPL extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        FCMP._fcmp(frame, false);
    }
}


================================================
FILE: Java/src/instructions/comparisons/ifacmp/IF_ACMPEQ.java
================================================
package instructions.comparisons.ifacmp;

import instructions.base.BranchInstruction;
import instructions.base.BranchLogic;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class IF_ACMPEQ extends BranchInstruction {
    @Override
    public void execute(Zframe frame) {
        if (IfAcmp._acmp(frame)) {
            BranchLogic.branch(frame, offset);
        }
    }
}


================================================
FILE: Java/src/instructions/comparisons/ifacmp/IF_ACMPNE.java
================================================
package instructions.comparisons.ifacmp;

import instructions.base.BranchInstruction;
import instructions.base.BranchLogic;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class IF_ACMPNE extends BranchInstruction {
    @Override
    public void execute(Zframe frame) {
        if (!IfAcmp._acmp(frame)) {
            BranchLogic.branch(frame, offset);
        }
    }
}


================================================
FILE: Java/src/instructions/comparisons/ifacmp/IfAcmp.java
================================================
package instructions.comparisons.ifacmp;

import runtimedata.OperandStack;
import runtimedata.Zframe;
import runtimedata.heap.Zobject;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class IfAcmp {
    public static boolean _acmp(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        Zobject ref2 = stack.popRef();
        Zobject ref1 = stack.popRef();
        return ref1 == ref2;
    }
}


================================================
FILE: Java/src/instructions/comparisons/ifcond/IFEQ.java
================================================
package instructions.comparisons.ifcond;

import instructions.base.BranchInstruction;
import instructions.base.BranchLogic;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class IFEQ extends BranchInstruction {
    @Override
    public void execute(Zframe frame) {
        int val = frame.getOperandStack().popInt();
        if (val == 0) {
            BranchLogic.branch(frame, offset);
        }
    }
}


================================================
FILE: Java/src/instructions/comparisons/ifcond/IFGE.java
================================================
package instructions.comparisons.ifcond;

import instructions.base.BranchInstruction;
import instructions.base.BranchLogic;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class IFGE extends BranchInstruction {
    @Override
    public void execute(Zframe frame) {
        int val = frame.getOperandStack().popInt();
        if (val >= 0) {
            BranchLogic.branch(frame, offset);
        }
    }
}


================================================
FILE: Java/src/instructions/comparisons/ifcond/IFGT.java
================================================
package instructions.comparisons.ifcond;

import instructions.base.BranchInstruction;
import instructions.base.BranchLogic;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class IFGT extends BranchInstruction {
    @Override
    public void execute(Zframe frame) {
        int val = frame.getOperandStack().popInt();
        if (val > 0) {
            BranchLogic.branch(frame, offset);
        }
    }
}


================================================
FILE: Java/src/instructions/comparisons/ifcond/IFLE.java
================================================
package instructions.comparisons.ifcond;

import instructions.base.BranchInstruction;
import instructions.base.BranchLogic;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class IFLE extends BranchInstruction {
    @Override
    public void execute(Zframe frame) {
        int val = frame.getOperandStack().popInt();
        if (val <= 0) {
            BranchLogic.branch(frame, offset);
        }
    }
}


================================================
FILE: Java/src/instructions/comparisons/ifcond/IFLT.java
================================================
package instructions.comparisons.ifcond;

import instructions.base.BranchInstruction;
import instructions.base.BranchLogic;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class IFLT extends BranchInstruction {
    @Override
    public void execute(Zframe frame) {
        int val = frame.getOperandStack().popInt();
        if (val < 0) {
            BranchLogic.branch(frame, offset);
        }
    }
}


================================================
FILE: Java/src/instructions/comparisons/ifcond/IFNE.java
================================================
package instructions.comparisons.ifcond;

import instructions.base.BranchInstruction;
import instructions.base.BranchLogic;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class IFNE extends BranchInstruction {
    @Override
    public void execute(Zframe frame) {
        int val = frame.getOperandStack().popInt();
        if (val != 0) {
            BranchLogic.branch(frame, offset);
        }
    }
}


================================================
FILE: Java/src/instructions/comparisons/ificmp/IF_ICMPEQ.java
================================================
package instructions.comparisons.ificmp;

import instructions.base.BranchInstruction;
import instructions.base.BranchLogic;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/6 0006.
 * Desc:
 */
public class IF_ICMPEQ extends BranchInstruction {
    @Override
    public void execute(Zframe frame) {
        int[] res = IfIcmp._icmpPop(frame);
        int val1 = res[0];
        int val2 = res[1];
        if (val1 == val2) {
            BranchLogic.branch(frame, offset);
        }
    }
}


================================================
FILE: Java/src/instructions/comparisons/ificmp/IF_ICMPGE.java
================================================
package instructions.comparisons.ificmp;

import instructions.base.BranchInstruction;
import instructions.base.BranchLogic;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/6 0006.
 * Desc:
 */
public class IF_ICMPGE extends BranchInstruction {
    @Override
    public void execute(Zframe frame) {
        int[] res = IfIcmp._icmpPop(frame);
        int val1 = res[0];
        int val2 = res[1];
        if (val1 >= val2) {
            BranchLogic.branch(frame, offset);
        }
    }
}

================================================
FILE: Java/src/instructions/comparisons/ificmp/IF_ICMPGT.java
================================================
package instructions.comparisons.ificmp;

import instructions.base.BranchInstruction;
import instructions.base.BranchLogic;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/6 0006.
 * Desc:
 */
public class IF_ICMPGT extends BranchInstruction {
    @Override
    public void execute(Zframe frame) {
        int[] res = IfIcmp._icmpPop(frame);
        int val1 = res[0];
        int val2 = res[1];
        if (val1 > val2) {
            BranchLogic.branch(frame, offset);
        }
    }
}


================================================
FILE: Java/src/instructions/comparisons/ificmp/IF_ICMPLE.java
================================================
package instructions.comparisons.ificmp;

import instructions.base.BranchInstruction;
import instructions.base.BranchLogic;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/6 0006.
 * Desc:
 */
public class IF_ICMPLE extends BranchInstruction {
    @Override
    public void execute(Zframe frame) {
        int[] res = IfIcmp._icmpPop(frame);
        int val1 = res[0];
        int val2 = res[1];
        if (val1 <= val2) {
            BranchLogic.branch(frame, offset);
        }
    }
}


================================================
FILE: Java/src/instructions/comparisons/ificmp/IF_ICMPLT.java
================================================
package instructions.comparisons.ificmp;

import instructions.base.BranchInstruction;
import instructions.base.BranchLogic;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/6 0006.
 * Desc:
 */
public class IF_ICMPLT extends BranchInstruction {
    @Override
    public void execute(Zframe frame) {
        int[] res = IfIcmp._icmpPop(frame);
        int val1 = res[0];
        int val2 = res[1];
        if (val1 < val2) {
            BranchLogic.branch(frame, offset);
        }

    }
}


================================================
FILE: Java/src/instructions/comparisons/ificmp/IF_ICMPNE.java
================================================
package instructions.comparisons.ificmp;

import instructions.base.BranchInstruction;
import instructions.base.BranchLogic;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/6 0006.
 * Desc:
 */
public class IF_ICMPNE extends BranchInstruction {
    @Override
    public void execute(Zframe frame) {
        int[] res = IfIcmp._icmpPop(frame);
        int val1 = res[0];
        int val2 = res[1];
        if (val1 != val2) {
            BranchLogic.branch(frame, offset);
        }
    }
}

================================================
FILE: Java/src/instructions/comparisons/ificmp/IfIcmp.java
================================================
package instructions.comparisons.ificmp;

import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/6 0006.
 * Desc:
 */
public class IfIcmp {
    static int[] _icmpPop(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        int[] res = new int[2];
        res[1] = stack.popInt();
        res[0] = stack.popInt();
        return res;
    }
}


================================================
FILE: Java/src/instructions/comparisons/lcmp/LCMP.java
================================================
package instructions.comparisons.lcmp;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class LCMP extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        long val2 = stack.popLong();
        long val1 = stack.popLong();
        if (val1 > val2) {
            stack.pushInt(1);
        } else if (val1 == val2) {
            stack.pushInt(0);
        } else {
            stack.pushInt(-1);
        }
    }
}


================================================
FILE: Java/src/instructions/constants/ACONST_NULL.java
================================================
package instructions.constants;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: push null
 */
public class ACONST_NULL extends NoOperandsInstruction {

    @Override
    public void execute(Zframe frame) {
        frame.getOperandStack().pushRef(null);
    }
}


================================================
FILE: Java/src/instructions/constants/BIPUSH.java
================================================
package instructions.constants;

import instructions.base.BytecodeReader;
import instructions.base.Instruction;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:bipush指令从操作数中获取一个byte型整数,扩展成int型,然后推入栈顶
 */
public class BIPUSH implements Instruction {
    int val;

    @Override
    public void fetchOperands(BytecodeReader reader) {
        val = reader.readInt8();
    }

    @Override
    public void execute(Zframe frame) {
        // 源码是独到一个int8,然后再用int32将其扩展,那么就变成了实际值。但是在Java中直接扩展还是原值,所以要进行修正在push;
        frame.getOperandStack().pushInt((val + 256) % 256);
    }
}


================================================
FILE: Java/src/instructions/constants/DCONST_0.java
================================================
package instructions.constants;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:Push double
 */
public class DCONST_0 extends NoOperandsInstruction {

    @Override
    public void execute(Zframe frame) {
        frame.getOperandStack().pushDouble(0.0);
    }
}


================================================
FILE: Java/src/instructions/constants/DCONST_1.java
================================================
package instructions.constants;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class DCONST_1 extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        frame.getOperandStack().pushDouble(1.0);
    }
}


================================================
FILE: Java/src/instructions/constants/FCONST_0.java
================================================
package instructions.constants;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: Push float
 */
public class FCONST_0 extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        frame.getOperandStack().pushFloat(0.0f);
    }
}


================================================
FILE: Java/src/instructions/constants/FCONST_1.java
================================================
package instructions.constants;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: Push float
 */
public class FCONST_1 extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        frame.getOperandStack().pushFloat(1.0f);
    }
}


================================================
FILE: Java/src/instructions/constants/FCONST_2.java
================================================
package instructions.constants;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: Push float
 */
public class FCONST_2 extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        frame.getOperandStack().pushFloat(2.0f);
    }
}


================================================
FILE: Java/src/instructions/constants/ICONST_0.java
================================================
package instructions.constants;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: Push int constant
 */
public class ICONST_0 extends NoOperandsInstruction {

    @Override
    public void execute(Zframe frame) {
        frame.getOperandStack().pushInt(0);
    }
}


================================================
FILE: Java/src/instructions/constants/ICONST_1.java
================================================
package instructions.constants;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: Push int constant
 */
public class ICONST_1 extends NoOperandsInstruction {

    @Override
    public void execute(Zframe frame) {
        frame.getOperandStack().pushInt(1);
    }
}


================================================
FILE: Java/src/instructions/constants/ICONST_2.java
================================================
package instructions.constants;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: Push int constant
 */
public class ICONST_2 extends NoOperandsInstruction {

    @Override
    public void execute(Zframe frame) {
        frame.getOperandStack().pushInt(2);
    }
}


================================================
FILE: Java/src/instructions/constants/ICONST_3.java
================================================
package instructions.constants;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: Push int constant
 */
public class ICONST_3 extends NoOperandsInstruction {

    @Override
    public void execute(Zframe frame) {
        frame.getOperandStack().pushInt(3);
    }
}


================================================
FILE: Java/src/instructions/constants/ICONST_4.java
================================================
package instructions.constants;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: Push int constant
 */
public class ICONST_4 extends NoOperandsInstruction {

    @Override
    public void execute(Zframe frame) {
        frame.getOperandStack().pushInt(4);
    }
}


================================================
FILE: Java/src/instructions/constants/ICONST_5.java
================================================
package instructions.constants;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: Push int constant
 */
public class ICONST_5 extends NoOperandsInstruction {

    @Override
    public void execute(Zframe frame) {
        frame.getOperandStack().pushInt(5);
    }
}


================================================
FILE: Java/src/instructions/constants/ICONST_M1.java
================================================
package instructions.constants;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: Push int constant
 */
public class ICONST_M1 extends NoOperandsInstruction {

    @Override
    public void execute(Zframe frame) {
        frame.getOperandStack().pushInt(-1);
    }
}


================================================
FILE: Java/src/instructions/constants/LCONST_0.java
================================================
package instructions.constants;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: Push int constant
 */
public class LCONST_0 extends NoOperandsInstruction {

    @Override
    public void execute(Zframe frame) {
        frame.getOperandStack().pushLong(0);
    }
}


================================================
FILE: Java/src/instructions/constants/LCONST_1.java
================================================
package instructions.constants;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: Push int constant
 */
public class LCONST_1 extends NoOperandsInstruction {

    @Override
    public void execute(Zframe frame) {
        frame.getOperandStack().pushLong(1);
    }
}


================================================
FILE: Java/src/instructions/constants/LDC.java
================================================
package instructions.constants;

import classfile.classconstant.ConstantInfo;
import instructions.base.Index8Instruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;
import runtimedata.heap.*;

/**
 * @author zachaxy
 * @date 17/12/26
 * desc:获取操作数index,通过 index 来获取运行时常量池中的常量,并将其压入操作数栈
 */
public class LDC extends Index8Instruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack operandStack = frame.getOperandStack();
        Zclass clazz = frame.getMethod().getClazz();
        RuntimeConstantInfo runtimeConstant = clazz.getRuntimeConstantPool().getRuntimeConstant(index);
        switch (runtimeConstant.getType()) {
            case ConstantInfo.CONSTANT_Integer:
                operandStack.pushInt((Integer) runtimeConstant.getValue());
                break;
            case ConstantInfo.CONSTANT_Float:
                operandStack.pushFloat((Float) runtimeConstant.getValue());
                break;
            case ConstantInfo.CONSTANT_String:
                Zobject internedStr = StringPool.jString(clazz.getLoader(), (String) runtimeConstant.getValue());
                operandStack.pushRef(internedStr);
                break;
            case ConstantInfo.CONSTANT_Class:
                ClassRef classRef = (ClassRef) runtimeConstant.getValue();
                Zobject jObject = classRef.resolvedClass().getjObject();
                operandStack.pushRef(jObject);
                break;
            // case MethodType, MethodHandle //Java7中的特性,不在本虚拟机范围内
            default:
                break;
        }
    }
}


================================================
FILE: Java/src/instructions/constants/LDC2_W.java
================================================
package instructions.constants;

import classfile.classconstant.ConstantInfo;
import instructions.base.Index16Instruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;
import runtimedata.heap.RuntimeConstantInfo;
import runtimedata.heap.Zclass;

/**
 * @author zachaxy
 * @date 17/12/26
 * desc:LDC2_W 和 LDC 的区别是,其获取常量池的常量类型为 Long 和 Double,都是 16bit 宽的
 */
public class LDC2_W extends Index16Instruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack operandStack = frame.getOperandStack();
        Zclass clazz = frame.getMethod().getClazz();
        RuntimeConstantInfo runtimeConstant = clazz.getRuntimeConstantPool().getRuntimeConstant(index);
        switch (runtimeConstant.getType()){
            case ConstantInfo.CONSTANT_Long:
                operandStack.pushLong((Long) runtimeConstant.getValue());
                break;
            case ConstantInfo.CONSTANT_Double:
                operandStack.pushDouble((Double) runtimeConstant.getValue());
                break;
            default:
                throw new ClassFormatError();
        }
    }
}


================================================
FILE: Java/src/instructions/constants/LDC_W.java
================================================
package instructions.constants;

import instructions.base.BytecodeReader;

/**
 * @author zachaxy
 * @date 17/12/26
 * desc:LDC_W和 LDC 的 execute 是完全一样的,唯一的区别就是去操作数的位宽,w 取16位,非 w 取8位
 * 所以 LDC_W 复用了 LDC 的 execute 过程,但是重写了其 fetch 方法,改为取16位宽
 */
public class LDC_W extends LDC {
    @Override
    public void fetchOperands(BytecodeReader reader) {
        index = reader.readUint16();
    }
}


================================================
FILE: Java/src/instructions/constants/NOP.java
================================================
package instructions.constants;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: nop指令是最简单的一条指令,因为它什么也不做
 */
public class NOP extends NoOperandsInstruction{
    @Override
    public void execute(Zframe frame) {

    }
}


================================================
FILE: Java/src/instructions/constants/SIPUSH.java
================================================
package instructions.constants;

import instructions.base.BytecodeReader;
import instructions.base.Instruction;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:sipush指令从操作数中获取一个short型整数,扩展成int型,然后推入栈顶
 */
public class SIPUSH implements Instruction {
    int val;

    @Override
    public void fetchOperands(BytecodeReader reader) {
        val = reader.readInt16();
    }

    @Override
    public void execute(Zframe frame) {
        frame.getOperandStack().pushInt((val + 65536) % 65536);
    }
}


================================================
FILE: Java/src/instructions/control/ARETURN.java
================================================
package instructions.control;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;
import runtimedata.Zthread;
import runtimedata.heap.Zobject;

/**
 * @author zachaxy
 * @date 17/12/27
 * desc:返回值为 实例对象 的 return 指令
 */
public class ARETURN extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        Zthread thread = frame.getThread();
        Zframe currentFrame = thread.popFrame();
        Zframe invokerFrame = thread.getCurrentFrame();
        Zobject val = currentFrame.getOperandStack().popRef();
        invokerFrame.getOperandStack().pushRef(val);
    }
}


================================================
FILE: Java/src/instructions/control/DRETURN.java
================================================
package instructions.control;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;
import runtimedata.Zthread;

/**
 * @author zachaxy
 * @date 17/12/27
 * desc:返回值为 double 的 return 指令
 */
public class DRETURN extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        Zthread thread = frame.getThread();
        Zframe currentFrame = thread.popFrame();
        Zframe invokerFrame = thread.getCurrentFrame();
        double val = currentFrame.getOperandStack().popDouble();
        invokerFrame.getOperandStack().pushDouble(val);
    }
}


================================================
FILE: Java/src/instructions/control/FRETURN.java
================================================
package instructions.control;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;
import runtimedata.Zthread;

/**
 * @author zachaxy
 * @date 17/12/27
 * desc:返回值为 float 的 return 指令
 */
public class FRETURN extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        Zthread thread = frame.getThread();
        Zframe currentFrame = thread.popFrame();
        Zframe invokerFrame = thread.getCurrentFrame();
        float val = currentFrame.getOperandStack().popFloat();
        invokerFrame.getOperandStack().pushFloat(val);
    }
}


================================================
FILE: Java/src/instructions/control/GOTO.java
================================================
package instructions.control;

import instructions.base.BranchInstruction;
import instructions.base.BranchLogic;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class GOTO extends BranchInstruction {
    @Override
    public void execute(Zframe frame) {
        BranchLogic.branch(frame,offset);
    }
}


================================================
FILE: Java/src/instructions/control/IRETURN.java
================================================
package instructions.control;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;
import runtimedata.Zthread;

/**
 * @author zachaxy
 * @date 17/12/27
 * desc:返回值为 int 的 return 指令
 * 执行方法在执行结束后,如果有返回值,其返回值会放在该方法的操作数栈
 * 执行方法的外部——调用方法,需要将执行方法的返回值,压入调用方法的操作数栈
 */
public class IRETURN extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        Zthread thread = frame.getThread();
        Zframe currentFrame = thread.popFrame();
        Zframe invokerFrame = thread.getCurrentFrame();
        int val = currentFrame.getOperandStack().popInt();
        invokerFrame.getOperandStack().pushInt(val);
    }
}


================================================
FILE: Java/src/instructions/control/LOOKUP_SWITCH.java
================================================
package instructions.control;

import instructions.base.BranchLogic;
import instructions.base.BytecodeReader;
import instructions.base.Instruction;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:如果case值不可以编码成一个索引表(case中的数值不是连续的),则实现成lookupswitch指令
 */
public class LOOKUP_SWITCH implements Instruction {
    int defaultOffset;
    int npairs;
    //matchOffsets有点像Map,它的key是case值,value是跳转偏移,但是并没有实现成map,而是用数组代替,两个连续的数位key-value;
    int[] matchOffsets;

    @Override
    public void fetchOperands(BytecodeReader reader) {
        reader.skipPadding();
        defaultOffset = reader.readInt32();
        npairs = reader.readInt32();
        matchOffsets = reader.readInt32s(npairs * 2);
    }

    @Override
    public void execute(Zframe frame) {
        int key = frame.getOperandStack().popInt();
        for (int i = 0; i < npairs * 2; i += 2) {
            if (matchOffsets[i] == key) {
                int offset = matchOffsets[i + 1];
                BranchLogic.branch(frame, defaultOffset);
                return;
            }
        }
        BranchLogic.branch(frame, defaultOffset);
    }
}


================================================
FILE: Java/src/instructions/control/LRETURN.java
================================================
package instructions.control;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;
import runtimedata.Zthread;

/**
 * @author zachaxy
 * @date 17/12/27
 * desc:返回值为 long 的 return 指令
 */
public class LRETURN extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        Zthread thread = frame.getThread();
        Zframe currentFrame = thread.popFrame();
        Zframe invokerFrame = thread.getCurrentFrame();
        long val = currentFrame.getOperandStack().popLong();
        invokerFrame.getOperandStack().pushLong(val);
    }
}


================================================
FILE: Java/src/instructions/control/RETURN.java
================================================
package instructions.control;

import instructions.base.NoOperandsInstruction;
import runtimedata.Zframe;

/**
 * @author zachaxy
 * @date 17/12/27
 * return 指令;没有具体的返回值,用在 void 类型的方法中,这种方法即使不在 Java 代码中写 return 语句
 * 编译器也会自动在方法的结尾添加一条 return 指令;
 */
public class RETURN extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        frame.getThread().popFrame();
    }
}


================================================
FILE: Java/src/instructions/control/TABLE_SWITCH.java
================================================
package instructions.control;

import instructions.base.BranchLogic;
import instructions.base.BytecodeReader;
import instructions.base.Instruction;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: 如果case值可以编码成一个索引表(case中的数值是连续的),则实现成tableswitch指令
 */
public class TABLE_SWITCH implements Instruction {
    int defaultOffset;
    //low和high记录case的取值范围
    int low;
    int high;
    //jumpOffsets是一个索引表,里面存放high-low+1个int值,,对应各种case情况下,执行跳转所需的字节码偏移量
    int[] jumpOffsets;

    @Override
    public void fetchOperands(BytecodeReader reader) {
        //tableswitch指令操作码的后面有0~3字节的padding,以保证 defaultOffset在字节码中的地址是4的倍数
        reader.skipPadding();
        defaultOffset = reader.readInt32();
        low = reader.readInt32();
        high = reader.readInt32();
        int jumpOffsetsCount = high - low + 1;
        jumpOffsets = reader.readInt32s(jumpOffsetsCount);
    }

    @Override
    public void execute(Zframe frame) {
        int index = frame.getOperandStack().popInt();
        int offset;
        if ((index >= low) && (index <= high)) {
            offset = jumpOffsets[index - low];
        } else {
            offset = defaultOffset;
        }

        BranchLogic.branch(frame, offset);
    }
}


================================================
FILE: Java/src/instructions/conversions/d2x/D2F.java
================================================
package instructions.conversions.d2x;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class D2F extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        double val1 = stack.popDouble();
        float val2 = (float) val1;
        stack.pushFloat(val2);
    }
}


================================================
FILE: Java/src/instructions/conversions/d2x/D2I.java
================================================
package instructions.conversions.d2x;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class D2I extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        double val1 = stack.popDouble();
        int val2 = (int) val1;
        stack.pushInt(val2);
    }
}


================================================
FILE: Java/src/instructions/conversions/d2x/D2L.java
================================================
package instructions.conversions.d2x;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class D2L extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        double val1 = stack.popDouble();
        long val2 = (long) val1;
        stack.pushLong(val2);
    }
}


================================================
FILE: Java/src/instructions/conversions/f2x/F2D.java
================================================
package instructions.conversions.f2x;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class F2D extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        float val1 = stack.popFloat();
        double val2 = val1;
        stack.pushDouble(val2);
    }
}


================================================
FILE: Java/src/instructions/conversions/f2x/F2I.java
================================================
package instructions.conversions.f2x;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class F2I extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        float val1 = stack.popFloat();
        int val2 = (int) val1;
        stack.pushInt(val2);
    }
}


================================================
FILE: Java/src/instructions/conversions/f2x/F2L.java
================================================
package instructions.conversions.f2x;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class F2L extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        float val1 = stack.popFloat();
        long val2 = (long) val1;
        stack.pushLong(val2);
    }
}


================================================
FILE: Java/src/instructions/conversions/i2x/I2B.java
================================================
package instructions.conversions.i2x;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class I2B extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        int val1 = stack.popInt();
        byte val2 = (byte) val1;
        stack.pushInt(val2);
    }
}


================================================
FILE: Java/src/instructions/conversions/i2x/I2C.java
================================================
package instructions.conversions.i2x;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class I2C extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        int val1 = stack.popInt();
        char val2 = (char) val1;
        stack.pushInt(val2);
    }
}


================================================
FILE: Java/src/instructions/conversions/i2x/I2D.java
================================================
package instructions.conversions.i2x;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class I2D extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        int val1 = stack.popInt();
        double val2 = (double) val1;
        stack.pushDouble(val2);
    }
}


================================================
FILE: Java/src/instructions/conversions/i2x/I2F.java
================================================
package instructions.conversions.i2x;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class I2F extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        int val1 = stack.popInt();
        float val2 = (float) val1;
        stack.pushFloat(val2);
    }
}


================================================
FILE: Java/src/instructions/conversions/i2x/I2L.java
================================================
package instructions.conversions.i2x;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class I2L extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        int val1 = stack.popInt();
        long val2 = (long) val1;
        stack.pushLong(val2);
    }
}


================================================
FILE: Java/src/instructions/conversions/i2x/I2S.java
================================================
package instructions.conversions.i2x;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class I2S extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        int val1 = stack.popInt();
        short val2 = (short) val1;
        stack.pushInt(val2);
    }
}


================================================
FILE: Java/src/instructions/conversions/l2x/L2D.java
================================================
package instructions.conversions.l2x;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class L2D extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        long val1 = stack.popLong();
        double val2 = (double) val1;
        stack.pushDouble(val2);
    }
}


================================================
FILE: Java/src/instructions/conversions/l2x/L2F.java
================================================
package instructions.conversions.l2x;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class L2F extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        long val1 = stack.popLong();
        float val2 = (float) val1;
        stack.pushFloat(val2);
    }
}


================================================
FILE: Java/src/instructions/conversions/l2x/L2I.java
================================================
package instructions.conversions.l2x;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class L2I extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        long val1 = stack.popLong();
        int val2 = (int) val1;
        stack.pushInt(val2);
    }
}


================================================
FILE: Java/src/instructions/extended/GOTO_W.java
================================================
package instructions.extended;

import instructions.base.BranchLogic;
import instructions.base.BytecodeReader;
import instructions.base.Instruction;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/6 0006.
 * Desc: goto_w指令和goto指令的唯一区别就是索引从2字节变成了4字节
 */
public class GOTO_W implements Instruction {
    int offset;

    @Override
    public void fetchOperands(BytecodeReader reader) {
        offset = reader.readInt32();
    }

    @Override
    public void execute(Zframe frame) {
        BranchLogic.branch(frame, offset);
    }
}


================================================
FILE: Java/src/instructions/extended/IFNONNULL.java
================================================
package instructions.extended;

import instructions.base.BranchInstruction;
import instructions.base.BranchLogic;
import runtimedata.Zframe;
import runtimedata.heap.Zobject;

/**
 * Author: zhangxin
 * Time: 2017/5/6 0006.
 * Desc:
 */
public class IFNONNULL extends BranchInstruction {
    @Override
    public void execute(Zframe frame) {
        Zobject ref = frame.getOperandStack().popRef();
        if (ref != null) {
            BranchLogic.branch(frame, offset);
        }
    }
}


================================================
FILE: Java/src/instructions/extended/IFNULL.java
================================================
package instructions.extended;

import instructions.base.BranchInstruction;
import instructions.base.BranchLogic;
import runtimedata.Zframe;
import runtimedata.heap.Zobject;

/**
 * Author: zhangxin
 * Time: 2017/5/6 0006.
 * Desc:
 */
public class IFNULL extends BranchInstruction {
    @Override
    public void execute(Zframe frame) {
        Zobject ref = frame.getOperandStack().popRef();
        if (ref == null) {
            BranchLogic.branch(frame, offset);
        }
    }
}


================================================
FILE: Java/src/instructions/extended/WIDE.java
================================================
package instructions.extended;

import instructions.base.BytecodeReader;
import instructions.base.Instruction;
import instructions.loads.loaddouble.DLOAD;
import instructions.loads.loadfloat.FLOAD;
import instructions.loads.loadint.ILOAD;
import instructions.loads.loadlong.LLOAD;
import instructions.loads.loadref.ALOAD;
import instructions.math.iinc.IINC;
import instructions.stores.storedouble.DSTORE;
import instructions.stores.storefloat.FSTORE;
import instructions.stores.storeint.ISTORE;
import instructions.stores.storelong.LSTORE;
import instructions.stores.storeref.ASTORE;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/6 0006.
 * Desc:
 */
public class WIDE implements Instruction {

    Instruction modifiedInstruction;

    /*
    先从字节码中读取一字节的操作码,然后创建子指令实例,最后读取子指令的操作数。因为没有实现ret指令,所以暂时调用 RuntimeException 函数终止程序执行。
    */
    @Override
    public void fetchOperands(BytecodeReader reader) {
        int opCode = reader.readUint8();
        switch (opCode) {
            case 0x15:
                ILOAD iload = new ILOAD();
                iload.index = reader.readUint16();
                modifiedInstruction = iload;
                break;
            case 0x16:
                LLOAD lload = new LLOAD();
                lload.index = reader.readUint16();
                modifiedInstruction = lload;
                break;
            case 0x17:
                FLOAD fload = new FLOAD();
                fload.index = reader.readUint16();
                modifiedInstruction = fload;
                break;
            case 0x18:
                DLOAD dload = new DLOAD();
                dload.index = reader.readUint16();
                modifiedInstruction = dload;
                break;
            case 0x19:
                ALOAD aload = new ALOAD();
                aload.index = reader.readUint16();
                modifiedInstruction = aload;
                break;
            case 0x36:
                ISTORE istore = new ISTORE();
                istore.index = reader.readUint16();
                modifiedInstruction = istore;
                break;
            case 0x37:
                LSTORE lstore = new LSTORE();
                lstore.index = reader.readUint16();
                modifiedInstruction = lstore;
                break;
            case 0x38:
                FSTORE fstore = new FSTORE();
                fstore.index = reader.readUint16();
                modifiedInstruction = fstore;
                break;
            case 0x39:
                DSTORE dstore = new DSTORE();
                dstore.index = reader.readUint16();
                modifiedInstruction = dstore;
                break;
            case 0x3a:
                ASTORE astore = new ASTORE();
                astore.index = reader.readUint16();
                modifiedInstruction = astore;
                break;
            case 0x84:
                IINC iinc = new IINC();
                iinc.index = reader.readUint16();
                iinc.offset = reader.readInt16();
                modifiedInstruction = iinc;
                break;
            case 0xa9: // ret
                throw new RuntimeException("Unsupported opcode: 0xa9!");

        }
    }

    //wide指令只是增加了索引宽度,并不改变子指令操作,所以其Execute() 方法只要调用子指令的Execute()方法即可
    @Override
    public void execute(Zframe frame) {
        modifiedInstruction.execute(frame);
    }
}


================================================
FILE: Java/src/instructions/loads/Load.java
================================================
package instructions.loads;

import runtimedata.Zframe;
import runtimedata.heap.Zobject;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: 工具类,为不同的数据类型提供不同的加载机制;
 * 总体原则是:先从本地变量表中取出变量,然后将该变量压入到操作数栈中;
 */
public class Load {
    public static void aload(Zframe frame, int index) {
        Zobject ref = frame.getLocalVars().getRef(index);
        frame.getOperandStack().pushRef(ref);
    }

    public static void dload(Zframe frame, int index) {
        double val = frame.getLocalVars().getDouble(index);
        frame.getOperandStack().pushDouble(val);
    }

    public static void fload(Zframe frame, int index) {
        float val = frame.getLocalVars().getFloat(index);
        frame.getOperandStack().pushFloat(val);
    }

    public static void iload(Zframe frame, int index) {
        int val = frame.getLocalVars().getInt(index);
        frame.getOperandStack().pushInt(val);
    }

    public static void lload(Zframe frame, int index) {
        long val = frame.getLocalVars().getLong(index);
        frame.getOperandStack().pushLong(val);
    }

    //用在 load 数组元素时,检测数组是否为 null
    public static void checkNotNull(Zobject arrRef) {
        if (arrRef == null) {
            throw new NullPointerException();
        }
    }

    public static void checkIndex(int count, int index) {
        if (index < 0 || index >= count) {
            throw new ArrayIndexOutOfBoundsException("index: " + index + " array's count: " + count);
        }
    }
}


================================================
FILE: Java/src/instructions/loads/loaddouble/DLOAD.java
================================================
package instructions.loads.loaddouble;

import instructions.base.Index8Instruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class DLOAD extends Index8Instruction {
    @Override
    public void execute(Zframe frame) {
        Load.dload(frame,index);
    }
}


================================================
FILE: Java/src/instructions/loads/loaddouble/DLOAD_0.java
================================================
package instructions.loads.loaddouble;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class DLOAD_0 extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        Load.dload(frame,0);
    }
}


================================================
FILE: Java/src/instructions/loads/loaddouble/DLOAD_1.java
================================================
package instructions.loads.loaddouble;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class DLOAD_1 extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        Load.dload(frame,1);
    }
}


================================================
FILE: Java/src/instructions/loads/loaddouble/DLOAD_2.java
================================================
package instructions.loads.loaddouble;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class DLOAD_2 extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        Load.dload(frame,2);
    }
}


================================================
FILE: Java/src/instructions/loads/loaddouble/DLOAD_3.java
================================================
package instructions.loads.loaddouble;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class DLOAD_3 extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        Load.dload(frame, 3);
    }
}


================================================
FILE: Java/src/instructions/loads/loadfloat/FLOAD.java
================================================
package instructions.loads.loadfloat;

import instructions.base.Index8Instruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class FLOAD extends Index8Instruction {
    @Override
    public void execute(Zframe frame) {
        Load.fload(frame,index);
    }
}


================================================
FILE: Java/src/instructions/loads/loadfloat/FLOAD_0.java
================================================
package instructions.loads.loadfloat;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class FLOAD_0 extends NoOperandsInstruction{

    @Override
    public void execute(Zframe frame) {
        Load.fload(frame,0);
    }
}


================================================
FILE: Java/src/instructions/loads/loadfloat/FLOAD_1.java
================================================
package instructions.loads.loadfloat;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class FLOAD_1 extends NoOperandsInstruction{

    @Override
    public void execute(Zframe frame) {
        Load.fload(frame,1);
    }
}


================================================
FILE: Java/src/instructions/loads/loadfloat/FLOAD_2.java
================================================
package instructions.loads.loadfloat;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class FLOAD_2 extends NoOperandsInstruction{

    @Override
    public void execute(Zframe frame) {
        Load.fload(frame,2);
    }
}


================================================
FILE: Java/src/instructions/loads/loadfloat/FLOAD_3.java
================================================
package instructions.loads.loadfloat;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class FLOAD_3 extends NoOperandsInstruction {

    @Override
    public void execute(Zframe frame) {
        Load.fload(frame, 3);
    }
}


================================================
FILE: Java/src/instructions/loads/loadint/ILOAD.java
================================================
package instructions.loads.loadint;

import instructions.base.Index8Instruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class ILOAD extends Index8Instruction {
    @Override
    public void execute(Zframe frame) {
        Load.iload(frame,index);
    }
}


================================================
FILE: Java/src/instructions/loads/loadint/ILOAD_0.java
================================================
package instructions.loads.loadint;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class ILOAD_0 extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        Load.iload(frame,0);
    }
}


================================================
FILE: Java/src/instructions/loads/loadint/ILOAD_1.java
================================================
package instructions.loads.loadint;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class ILOAD_1 extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        Load.iload(frame,1);
    }
}


================================================
FILE: Java/src/instructions/loads/loadint/ILOAD_2.java
================================================
package instructions.loads.loadint;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class ILOAD_2 extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        Load.iload(frame,2);
    }
}


================================================
FILE: Java/src/instructions/loads/loadint/ILOAD_3.java
================================================
package instructions.loads.loadint;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class ILOAD_3 extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        Load.iload(frame, 3);
    }
}


================================================
FILE: Java/src/instructions/loads/loadlong/LLOAD.java
================================================
package instructions.loads.loadlong;

import instructions.base.Index8Instruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class LLOAD extends Index8Instruction {
    @Override
    public void execute(Zframe frame) {
        Load.lload(frame,index);
    }
}


================================================
FILE: Java/src/instructions/loads/loadlong/LLOAD_0.java
================================================
package instructions.loads.loadlong;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class LLOAD_0 extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        Load.lload(frame,0);
    }
}


================================================
FILE: Java/src/instructions/loads/loadlong/LLOAD_1.java
================================================
package instructions.loads.loadlong;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class LLOAD_1 extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        Load.lload(frame,1);
    }
}


================================================
FILE: Java/src/instructions/loads/loadlong/LLOAD_2.java
================================================
package instructions.loads.loadlong;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class LLOAD_2 extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        Load.lload(frame,2);
    }
}


================================================
FILE: Java/src/instructions/loads/loadlong/LLOAD_3.java
================================================
package instructions.loads.loadlong;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class LLOAD_3 extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        Load.lload(frame, 3);
    }
}


================================================
FILE: Java/src/instructions/loads/loadref/ALOAD.java
================================================
package instructions.loads.loadref;

import instructions.base.Index8Instruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class ALOAD extends Index8Instruction{
    @Override
    public void execute(Zframe frame) {
        Load.aload(frame,index);
    }
}


================================================
FILE: Java/src/instructions/loads/loadref/ALOAD_0.java
================================================
package instructions.loads.loadref;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class ALOAD_0 extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        Load.aload(frame,0);
    }
}


================================================
FILE: Java/src/instructions/loads/loadref/ALOAD_1.java
================================================
package instructions.loads.loadref;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class ALOAD_1 extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        Load.aload(frame,1);
    }
}


================================================
FILE: Java/src/instructions/loads/loadref/ALOAD_2.java
================================================
package instructions.loads.loadref;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class ALOAD_2 extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        Load.aload(frame,2);
    }
}


================================================
FILE: Java/src/instructions/loads/loadref/ALOAD_3.java
================================================
package instructions.loads.loadref;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class ALOAD_3 extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        Load.aload(frame,3);
    }
}


================================================
FILE: Java/src/instructions/loads/loadxarr/AALOAD.java
================================================
package instructions.loads.loadxarr;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.OperandStack;
import runtimedata.Zframe;
import runtimedata.heap.Zobject;

/**
 * @author zachaxy
 * @date 17/12/29
 * 获取数组指定索引值(非基本类型):eg String s = str[2];
 */
public class AALOAD extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack operandStack = frame.getOperandStack();
        //数组元素的索引值
        int index = operandStack.popInt();
        //数组对象的引用
        Zobject arrRef = operandStack.popRef();

        Load.checkNotNull(arrRef);
        //得到数组对象
        Zobject[] refs = arrRef.getRefs();
        Load.checkIndex(arrRef.getArrayLen(), index);
        //将数组的 index 的值压栈
        operandStack.pushRef(refs[index]);
    }
}


================================================
FILE: Java/src/instructions/loads/loadxarr/BALOAD.java
================================================
package instructions.loads.loadxarr;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.OperandStack;
import runtimedata.Zframe;
import runtimedata.heap.Zobject;

/**
 * @author zachaxy
 * @date 17/12/29
 * 获取数组指定索引值:eg byte b = bytes[2];
 */
public class BALOAD extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack operandStack = frame.getOperandStack();
        //数组元素的索引值
        int index = operandStack.popInt();
        //数组对象的引用
        Zobject arrRef = operandStack.popRef();

        Load.checkNotNull(arrRef);
        //得到数组对象
        byte[] refs = arrRef.getBytes();
        Load.checkIndex(arrRef.getArrayLen(), index);
        //将数组的 index 的值压栈
        operandStack.pushInt(refs[index]);
    }
}


================================================
FILE: Java/src/instructions/loads/loadxarr/CALOAD.java
================================================
package instructions.loads.loadxarr;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.OperandStack;
import runtimedata.Zframe;
import runtimedata.heap.Zobject;

/**
 * @author zachaxy
 * @date 17/12/29
 * 获取数组指定索引值:eg char c = chars[2];
 */
public class CALOAD extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack operandStack = frame.getOperandStack();
        //数组元素的索引值
        int index = operandStack.popInt();
        //数组对象的引用
        Zobject arrRef = operandStack.popRef();

        Load.checkNotNull(arrRef);
        //得到数组对象
        char[] refs = arrRef.getChars();
        Load.checkIndex(arrRef.getArrayLen(), index);
        //将数组的 index 的值压栈
        operandStack.pushInt(refs[index]);
    }
}


================================================
FILE: Java/src/instructions/loads/loadxarr/DALOAD.java
================================================
package instructions.loads.loadxarr;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.OperandStack;
import runtimedata.Zframe;
import runtimedata.heap.Zobject;

/**
 * @author zachaxy
 * @date 17/12/29
 * 获取数组指定索引值:eg double d = doubles[2];
 */
public class DALOAD extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack operandStack = frame.getOperandStack();
        //数组元素的索引值
        int index = operandStack.popInt();
        //数组对象的引用
        Zobject arrRef = operandStack.popRef();

        Load.checkNotNull(arrRef);
        //得到数组对象
        double[] refs = arrRef.getDoubles();
        Load.checkIndex(arrRef.getArrayLen(), index);
        //将数组的 index 的值压栈
        operandStack.pushDouble(refs[index]);
    }
}


================================================
FILE: Java/src/instructions/loads/loadxarr/FALOAD.java
================================================
package instructions.loads.loadxarr;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.OperandStack;
import runtimedata.Zframe;
import runtimedata.heap.Zobject;

/**
 * @author zachaxy
 * @date 17/12/29
 * 获取数组指定索引值:eg float b = floats[2];
 */
public class FALOAD extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack operandStack = frame.getOperandStack();
        //数组元素的索引值
        int index = operandStack.popInt();
        //数组对象的引用
        Zobject arrRef = operandStack.popRef();

        Load.checkNotNull(arrRef);
        //得到数组对象
        float[] refs = arrRef.getFloats();
        Load.checkIndex(arrRef.getArrayLen(), index);
        //将数组的 index 的值压栈
        operandStack.pushFloat(refs[index]);
    }
}


================================================
FILE: Java/src/instructions/loads/loadxarr/IALOAD.java
================================================
package instructions.loads.loadxarr;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.OperandStack;
import runtimedata.Zframe;
import runtimedata.heap.Zobject;

/**
 * @author zachaxy
 * @date 17/12/29
 * 获取数组指定索引值:eg int i = ints[2];
 */
public class IALOAD extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack operandStack = frame.getOperandStack();
        //数组元素的索引值
        int index = operandStack.popInt();
        //数组对象的引用
        Zobject arrRef = operandStack.popRef();

        Load.checkNotNull(arrRef);
        //得到数组对象
        int[] refs = arrRef.getInts();
        Load.checkIndex(arrRef.getArrayLen(), index);
        //将数组的 index 的值压栈
        operandStack.pushInt(refs[index]);
    }
}


================================================
FILE: Java/src/instructions/loads/loadxarr/LALOAD.java
================================================
package instructions.loads.loadxarr;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.OperandStack;
import runtimedata.Zframe;
import runtimedata.heap.Zobject;

/**
 * @author zachaxy
 * @date 17/12/29
 * 获取数组指定索引值:eg long l = longs[2];
 */
public class LALOAD extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack operandStack = frame.getOperandStack();
        //数组元素的索引值
        int index = operandStack.popInt();
        //数组对象的引用
        Zobject arrRef = operandStack.popRef();

        Load.checkNotNull(arrRef);
        //得到数组对象
        long[] refs = arrRef.getLongs();
        Load.checkIndex(arrRef.getArrayLen(), index);
        //将数组的 index 的值压栈
        operandStack.pushLong(refs[index]);
    }
}


================================================
FILE: Java/src/instructions/loads/loadxarr/SALOAD.java
================================================
package instructions.loads.loadxarr;

import instructions.base.NoOperandsInstruction;
import instructions.loads.Load;
import runtimedata.OperandStack;
import runtimedata.Zframe;
import runtimedata.heap.Zobject;

/**
 * @author zachaxy
 * @date 17/12/29
 * 获取数组指定索引值:eg short s = shorts[2];
 */
public class SALOAD extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack operandStack = frame.getOperandStack();
        //数组元素的索引值
        int index = operandStack.popInt();
        //数组对象的引用
        Zobject arrRef = operandStack.popRef();

        Load.checkNotNull(arrRef);
        //得到数组对象
        short[] refs = arrRef.getShorts();
        Load.checkIndex(arrRef.getArrayLen(), index);
        //将数组的 index 的值压栈
        operandStack.pushInt(refs[index]);
    }
}


================================================
FILE: Java/src/instructions/math/add/DADD.java
================================================
package instructions.math.add;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class DADD extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        double val1 = stack.popDouble();
        double val2 = stack.popDouble();
        double res = val1 + val2;
        stack.pushDouble(res);
    }
}


================================================
FILE: Java/src/instructions/math/add/FADD.java
================================================
package instructions.math.add;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class FADD extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        float val1 = stack.popFloat();
        float val2 = stack.popFloat();
        float res = val1 + val2;
        stack.pushFloat(res);
    }
}

================================================
FILE: Java/src/instructions/math/add/IADD.java
================================================
package instructions.math.add;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class IADD extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        int val1 = stack.popInt();
        int val2 = stack.popInt();
        int res = val1 + val2;
        stack.pushInt(res);
    }
}


================================================
FILE: Java/src/instructions/math/add/LADD.java
================================================
package instructions.math.add;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class LADD extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        long val1 = stack.popLong();
        long val2 = stack.popLong();
        long res = val1 + val2;
        stack.pushLong(res);
    }
}



================================================
FILE: Java/src/instructions/math/and/IAND.java
================================================
package instructions.math.and;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class IAND extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        int val2 = stack.popInt();
        int val1 = stack.popInt();
        int res = val1 & val2;
        stack.pushInt(res);
    }
}


================================================
FILE: Java/src/instructions/math/and/LAND.java
================================================
package instructions.math.and;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class LAND extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        long val2 = stack.popLong();
        long val1 = stack.popLong();
        long res = val1 & val2;
        stack.pushLong(res);
    }
}


================================================
FILE: Java/src/instructions/math/div/DDIV.java
================================================
package instructions.math.div;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class DDIV extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        double val2 = stack.popDouble();
        double val1 = stack.popDouble();
        double res = val1 / val2;
        stack.pushDouble(res);
    }
}


================================================
FILE: Java/src/instructions/math/div/FDIV.java
================================================
package instructions.math.div;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class FDIV extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        float val2 = stack.popFloat();
        float val1 = stack.popFloat();
        float res = val1 / val2;
        stack.pushFloat(res);
    }
}


================================================
FILE: Java/src/instructions/math/div/IDIV.java
================================================
package instructions.math.div;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class IDIV extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        int val2 = stack.popInt();
        int val1 = stack.popInt();
        int res = val1 / val2;
        stack.pushInt(res);
    }
}

================================================
FILE: Java/src/instructions/math/div/LDIV.java
================================================
package instructions.math.div;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class LDIV extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        long val2 = stack.popLong();
        long val1 = stack.popLong();
        long res = val1 / val2;
        stack.pushLong(res);
    }
}


================================================
FILE: Java/src/instructions/math/iinc/IINC.java
================================================
package instructions.math.iinc;

import instructions.base.BytecodeReader;
import instructions.base.Instruction;
import runtimedata.LocalVars;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: iinc指令给局部变量表中的int变量增加常量值,局部变量表索引和常量值都由指令的操作数提供。
 */
public class IINC implements Instruction {
    public int index;
    public int offset;

    @Override
    public void fetchOperands(BytecodeReader reader) {
        index = reader.readUint8();
        offset = reader.readInt8();
    }

    @Override
    public void execute(Zframe frame) {
        LocalVars localVars = frame.getLocalVars();
        int val = localVars.getInt(index);
        val += offset;
        localVars.setInt(index, val);
    }
}


================================================
FILE: Java/src/instructions/math/mul/DMUL.java
================================================
package instructions.math.mul;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class DMUL extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        double val1 = stack.popDouble();
        double val2 = stack.popDouble();
        double res = val1 * val2;
        stack.pushDouble(res);
    }
}


================================================
FILE: Java/src/instructions/math/mul/FMUL.java
================================================
package instructions.math.mul;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class FMUL extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        float val1 = stack.popFloat();
        float val2 = stack.popFloat();
        float res = val1 * val2;
        stack.pushFloat(res);
    }
}


================================================
FILE: Java/src/instructions/math/mul/IMUL.java
================================================
package instructions.math.mul;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class IMUL extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        int val1 = stack.popInt();
        int val2 = stack.popInt();
        int res = val1 * val2;
        stack.pushInt(res);
    }
}


================================================
FILE: Java/src/instructions/math/mul/LMUL.java
================================================
package instructions.math.mul;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class LMUL extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        long val1 = stack.popLong();
        long val2 = stack.popLong();
        long res = val1 * val2;
        stack.pushLong(res);
    }
}

================================================
FILE: Java/src/instructions/math/neg/DNEG.java
================================================
package instructions.math.neg;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class DNEG extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        double val = stack.popDouble();
        stack.pushDouble(-val);
    }
}


================================================
FILE: Java/src/instructions/math/neg/FNEG.java
================================================
package instructions.math.neg;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class FNEG extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        float val = stack.popFloat();
        stack.pushFloat(-val);
    }
}

================================================
FILE: Java/src/instructions/math/neg/INEG.java
================================================
package instructions.math.neg;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class INEG extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        int val = stack.popInt();
        stack.pushInt(-val);
    }
}


================================================
FILE: Java/src/instructions/math/neg/LNEG.java
================================================
package instructions.math.neg;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class LNEG extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        long val = stack.popLong();
        stack.pushLong(-val);
    }
}



================================================
FILE: Java/src/instructions/math/or/IOR.java
================================================
package instructions.math.or;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class IOR extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        int val2 = stack.popInt();
        int val1 = stack.popInt();
        int res = val1 | val2;
        stack.pushInt(res);
    }
}


================================================
FILE: Java/src/instructions/math/or/LOR.java
================================================
package instructions.math.or;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class LOR extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        long val2 = stack.popLong();
        long val1 = stack.popLong();
        long res = val1 | val2;
        stack.pushLong(res);
    }
}


================================================
FILE: Java/src/instructions/math/rem/DREM.java
================================================
package instructions.math.rem;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class DREM extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        double val2 = stack.popDouble();
        double val1 = stack.popDouble();
        double res = val1 % val2;
        stack.pushDouble(res);
    }
}



================================================
FILE: Java/src/instructions/math/rem/FREM.java
================================================
package instructions.math.rem;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class FREM extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        float val2 = stack.popFloat();
        float val1 = stack.popFloat();
        float res = val1 % val2;
        stack.pushFloat(res);
    }
}


================================================
FILE: Java/src/instructions/math/rem/IREM.java
================================================
package instructions.math.rem;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class IREM extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        int val2 = stack.popInt();
        int val1 = stack.popInt();
        if (val2 == 0) {
            throw new ArithmeticException("java.lang.ArithmeticException: / by zero");
        }
        int res = val1 % val2;
        stack.pushInt(res);
    }
}


================================================
FILE: Java/src/instructions/math/rem/LREM.java
================================================
package instructions.math.rem;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class LREM extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        long val2 = stack.popLong();
        if (val2 == 0) {
            throw new ArithmeticException("java.lang.ArithmeticException: / by zero");
        }
        long val1 = stack.popLong();
        long res = val1 % val2;
        stack.pushLong(res);
    }
}



================================================
FILE: Java/src/instructions/math/sh/ISHL.java
================================================
package instructions.math.sh;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: int 左位移
 * 先从操作数栈中弹出两个int变量v2和v1。v1是要进行位移操作的变量,v2指出要移位多少比特。
 */
public class ISHL extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        int val2 = stack.popInt();  //要移动多少bit
        int val1 = stack.popInt();  //要进行位移操作的变量
        int s = val2 & 0x1f; //int变量只有32位,所以只取val2的后5个比特就足够表示位移位数了,位移操作符右侧必须是无符号整数,所以需要对val2进行类型转换

        //但是Java中对于大数左移超出后,也会变成负数,所以这里不做额外处理了
        int res = val1 << s;

        stack.pushInt(res);

    }
}


================================================
FILE: Java/src/instructions/math/sh/ISHR.java
================================================
package instructions.math.sh;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: 算术右移,需要扩展符号位,使用最高位填充移位后左侧的空位。
 */
public class ISHR extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        int val2 = stack.popInt();  //要移动多少bit
        int val1 = stack.popInt();  //要进行位移操作的变量
        int s = val2 & 0x1f;
        int res = val1 >> s;
        stack.pushInt(res);
    }
}


================================================
FILE: Java/src/instructions/math/sh/IUSHR.java
================================================
package instructions.math.sh;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: 逻辑右移,或叫无符号右移运算符“>>>“只对位进行操作,没有算术含义,它用0填充左侧的空位。
 */
public class IUSHR extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        int val2 = stack.popInt();  //要移动多少bit
        int val1 = stack.popInt();  //要进行位移操作的变量
        int s = val2 & 0x1f;
        int res = val1 >>> s;
        stack.pushInt(res);
    }
}


================================================
FILE: Java/src/instructions/math/sh/LSHL.java
================================================
package instructions.math.sh;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: int 左位移
 * 先从操作数栈中弹出两个int变量v2和v1。v1是要进行位移操作的变量,v2指出要移位多少比特。
 */
public class LSHL extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        int val2 = stack.popInt();  //要移动多少bit
        long val1 = stack.popLong();  //要进行位移操作的变量
        int s = val2 & 0x3f; //int变量只有32位,所以只取val2的后5个比特就足够表示位移位数了,位移操作符右侧必须是无符号整数,所以需要对val2进行类型转换

        //但是Java中对于大数左移超出后,也会变成负数,所以这里不做额外处理了
        long res = val1 << s;

        stack.pushLong(res);

    }
}


================================================
FILE: Java/src/instructions/math/sh/LSHR.java
================================================
package instructions.math.sh;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: int 左位移
 * 先从操作数栈中弹出两个int变量v2和v1。v1是要进行位移操作的变量,v2指出要移位多少比特。
 */
public class LSHR extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        int val2 = stack.popInt();  //要移动多少bit
        long val1 = stack.popLong();  //要进行位移操作的变量
        int s = val2 & 0x3f; //int变量只有32位,所以只取val2的后5个比特就足够表示位移位数了,位移操作符右侧必须是无符号整数,所以需要对val2进行类型转换

        //但是Java中对于大数左移超出后,也会变成负数,所以这里不做额外处理了
        long res = val1 >> s;

        stack.pushLong(res);

    }
}


================================================
FILE: Java/src/instructions/math/sh/LUSHR.java
================================================
package instructions.math.sh;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc: 逻辑右移,或叫无符号右移运算符“>>>“只对位进行操作,没有算术含义,它用0填充左侧的空位。
 */
public class LUSHR extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        int val2 = stack.popInt();  //要移动多少bit
        long val1 = stack.popLong();  //要进行位移操作的变量
        int s = val2 & 0x3f; //int变量只有32位,所以只取val2的后5个比特就足够表示位移位数了,位移操作符右侧必须是无符号整数,所以需要对val2进行类型转换

        //但是Java中对于大数左移超出后,也会变成负数,所以这里不做额外处理了
        long res = val1 >>> s;

        stack.pushLong(res);
    }
}


================================================
FILE: Java/src/instructions/math/sub/DSUB.java
================================================
package instructions.math.sub;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class DSUB extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        double val2 = stack.popDouble();
        double val1 = stack.popDouble();
        double res = val1 - val2;
        stack.pushDouble(res);
    }
}


================================================
FILE: Java/src/instructions/math/sub/FSUB.java
================================================
package instructions.math.sub;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class FSUB extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        float val2 = stack.popFloat();
        float val1 = stack.popFloat();
        float res = val1 - val2;
        stack.pushFloat(res);
    }
}


================================================
FILE: Java/src/instructions/math/sub/ISUB.java
================================================
package instructions.math.sub;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class ISUB extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        int val2 = stack.popInt();
        int val1 = stack.popInt();
        int res = val1 - val2;
        stack.pushInt(res);
    }
}

================================================
FILE: Java/src/instructions/math/sub/LSUB.java
================================================
package instructions.math.sub;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class LSUB extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        long val2 = stack.popLong();
        long val1 = stack.popLong();
        long res = val1 - val2;
        stack.pushLong(res);
    }
}

================================================
FILE: Java/src/instructions/math/xor/IXOR.java
================================================
package instructions.math.xor;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class IXOR extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        int val2 = stack.popInt();
        int val1 = stack.popInt();
        int res = val1 ^ val2;
        stack.pushInt(res);
    }
}


================================================
FILE: Java/src/instructions/math/xor/LXOR.java
================================================
package instructions.math.xor;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;

/**
 * Author: zhangxin
 * Time: 2017/5/5 0005.
 * Desc:
 */
public class LXOR extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        long val2 = stack.popLong();
        long val1 = stack.popLong();
        long res = val1 ^ val2;
        stack.pushLong(res);
    }
}


================================================
FILE: Java/src/instructions/references/ANEW_ARRAY.java
================================================
package instructions.references;

import instructions.base.Index16Instruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;
import runtimedata.heap.ClassRef;
import runtimedata.heap.RuntimeConstantPool;
import runtimedata.heap.Zclass;
import runtimedata.heap.Zobject;

/**
 * @author zachaxy
 * @date 17/12/29
 * desc:创建引用类型数组,注意这里是一维的!!!
 * 如果创建的是 String[],那么从运行时常量池拿到 String 的符号引用,通过符号引用将 String 类加载进来
 * 接下来再将 String[] 类加载进来!
 * 最后通过 String[] 类创建 字符串数组对象,并压入操作数栈
 */
public class ANEW_ARRAY extends Index16Instruction {
    @Override
    public void execute(Zframe frame) {
        RuntimeConstantPool runtimeConstantPool = frame.getMethod().getClazz().getRuntimeConstantPool();
        //首先获取到该数组的引用类型;eg:String [] arr = new String[2];  那么获取到的类是:java.lang.String
        ClassRef classRef = (ClassRef) runtimeConstantPool.getRuntimeConstant(this.index).getValue();

        //该引用类型若没加载过,那么先将该引用类型加载进来;
        Zclass componentClass = classRef.resolvedClass();

        OperandStack operandStack = frame.getOperandStack();
        int count = operandStack.popInt();
        if (count < 0) {
            throw new NegativeArraySizeException("" + count);
        }
        //根据基础类型:java/lang/String,得到数组类[Ljava/lang/String;
        Zclass arrClazz = componentClass.arrayClass();
        //根据数组类去创建具体的数组对象;
        Zobject arr = arrClazz.newArray(count);
        operandStack.pushRef(arr);
    }
}


================================================
FILE: Java/src/instructions/references/ARRAY_LENGTH.java
================================================
package instructions.references;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;
import runtimedata.heap.Zobject;

/**
 * @author zachaxy
 * @date 17/12/29
 * desc:获取数组长度的指令
 */
public class ARRAY_LENGTH extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack operandStack = frame.getOperandStack();
        Zobject arrRef = operandStack.popRef();
        if (arrRef == null) {
            throw new NullPointerException("called length on a null Object");
        }
        int arrLen = arrRef.getArrayLen();
        operandStack.pushInt(arrLen);
    }
}


================================================
FILE: Java/src/instructions/references/ATHROW.java
================================================
package instructions.references;

import instructions.base.NoOperandsInstruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;
import runtimedata.Zthread;
import runtimedata.heap.Zobject;
import znative.java.lang.NStackTraceElement;

/**
 * @author zachaxy
 * @date 18/1/2
 */
public class ATHROW extends NoOperandsInstruction {
    @Override
    public void execute(Zframe frame) {
        //异常引用对象;throw new Exception();
        Zobject ex = frame.getOperandStack().popRef();
        if (ex == null) {
            throw new NullPointerException();
        }

        //获取当前thread,是想从thread中获取所有的frame(一个frame就是一个方法调用过程的抽象)
        Zthread thread = frame.getThread();
        if (!findAndGotoExceptionHandler(thread, ex)) {
            //所有的方法调用栈均不能处理该异常了,那么交由JVM来处理;
            handleUncaughtException(thread, ex);
        }
    }


    //从当前帧开始,遍历Java虚拟机栈,查找方法的异常处理表
    private boolean findAndGotoExceptionHandler(Zthread thread, Zobject ex) {
        while (true) {
            Zframe frame = thread.getCurrentFrame();
            //正常情况下,获取一条指令后,bytereader中的pc是要+1,指向下一条指令的地址
            // 但是athrow指令比较特殊,因为现在已经抛出异常了,不能继续向下执行了,所以要回退;
            int pc = frame.getNextPC() - 1;

            //此时pc指向的是throw异常的那一行;因为接下来就要在当前方法的异常处理表中寻找可以处理当前pc指向的指令所抛出的一场了
            int handlerPC = frame.getMethod().findExceptionHandler(ex.getClazz(), pc);

            //当前方法能处理自己抛出的异常
            if (handlerPC > 0) {
                OperandStack operandStack = frame.getOperandStack();
                operandStack.clear();//清空操作数栈
                operandStack.pushRef(ex);//将抛出的异常放进去
                frame.setNextPC(handlerPC);//指令跳转到对应的catch块中
                return true;
            }

            //能走到这一步,说明当前方法不能处理当前方法抛出的异常,需要回到调用该方法的帧frame
            thread.popFrame();

            //整个调用栈都无法处理异常,交由 JVM 来处理吧;JVM 处理的方法就是下面的 handleUncaughtException
            if (thread.isStackEmpty()) {
                break;
            }
        }
        return false;
    }


    //打印异常信息,包括调用栈的链;同时,此时虚拟机栈都已经清空了,所以整个JVM也就终止了;
    private void handleUncaughtException(Zthread thread, Zobject ex) {
        //其实能执行到这一步表明方法栈已经被清空了;
        thread.clearStack();
        NStackTraceElement[] stet = (NStackTraceElement[]) ex.extra;
        for (int i = 0; i < stet.length; i++) {
            System.out.println(stet[i]);
        }
    }
}


================================================
FILE: Java/src/instructions/references/CHECK_CAST.java
================================================
package instructions.references;

import instructions.base.Index16Instruction;
import runtimedata.OperandStack;
import runtimedata.Zframe;
import runtimedata.heap.ClassRef;
import runtimedata.heap.RuntimeConstantPool;
import runtimedata.heap.Zclass;
import runtimedata.heap.Zobject;

/**
 * @author zachaxy
 * @date 17/12/26
 * desc:类型转换,该指令和instanceof指令的区别在于,instanceof判断后将结果压入操作数栈,而cast直接抛出异常
 * String str = (String)obj
 * NOTE:checkcast 指令,在pop到引用 obj 之后,又将 obj push 到栈中!!!
 */
public class CHECK_CAST extends Index16Instruction {
    @Override
    public void execute(Zframe frame) {
        OperandStack stack = frame.getOperandStack();
        Zobject obj = stack.popRef();
        stack.pushRef(obj);
        //如果 obj 为 null,则可以转换为任意类型
        if (obj == null) {
            return;
        }

        RuntimeConstantPool runtimeConstantPool = frame.getMethod().getClazz().getRuntimeConstantPool();
        ClassRef classRef = (ClassRef) runtimeConstantPool.getRuntimeConstant(index).getValue();
        Zclass clazz = classRef.resolvedClass();
        if (!obj.isInstanceOf(clazz)) {
            throw new ClassCastException(obj.getClazz().thisClassName + " can't cast to " + clazz.thisClassName);
        }
    }
}


================================================
FILE: Java/src/instructions/references/GET_FIELD.java
================================================
package instructions.references;

import instructions.base.Index16Instruction;
import runtimedata.OperandStack;
import runtimedata.Slots;
import runtimedata.Zframe;
import runtimedata.heap.*;

/**
 * Author: zhangxin
 * Time: 2017/7/27.
 * Desc: 从实例变量中获取值,并将之放在当前操作数栈
 */
public class GET_FIELD extends Index16Instruction {
    @Override
    public void execute(Zframe frame) {
        Zmethod currentMethod = frame.getMethod();
        Zclass currentClass = currentMethod.getClazz();
        RuntimeConstantPool runtimeConstantPool = currentClass.getRuntimeConstantPool();

        //获取到字段的符号引用
        FieldRef fieldRef = (FieldRef) runtimeConstantPool.getRuntimeConstant(index).getValue();
        //将字段符号引用转换为直接引用
        Zfield field = fieldRef.resolvedField();

        if (field.isStatic()) {
            throw new IncompatibleClassChangeError("should not call a static field by an instance");
        }

        String descriptor = field.getDescriptor();
        int slotId = field.getSlotId();
        OperandStack stack = frame.getOperandStack();
        //获取字段所在的实例
        Zobject instance = stack.popRef();
        if (instance == null) {
            throw new NullPointerException("call " + field.getName() + " on a null object");
        }
        Slots slots = instance.getFields();
        switch (descriptor.charAt(0)) {
            case 'Z':
            case 'B':
            case 'C':
            case 'S':
            case 'I':
                stack.pushInt(slots.getInt(slotId));
                break;
            case 'F':
                stack.pushFloat(slots.getFloat(slotId));
                break;
            case 'J':
                stack.pushLong(slots.getLong(slotId));
                break;
            case 'D':
                stack.pushDouble(slots.getDouble(slotId));
                break;
            case 'L':
      
Download .txt
gitextract_uyxsbubc/

├── .gitignore
├── Java/
│   └── src/
│       ├── Main.java
│       ├── Utils/
│       │   ├── ByteUtils.java
│       │   └── Cmd.java
│       ├── classfile/
│       │   ├── ClassFile.java
│       │   ├── ClassReader.java
│       │   ├── ConstantPool.java
│       │   ├── MemberInfo.java
│       │   ├── attribute/
│       │   │   ├── AttributeInfo.java
│       │   │   ├── CodeAttribute.java
│       │   │   ├── ConstantValueAttribute.java
│       │   │   ├── DeprecatedAttribute.java
│       │   │   ├── ExceptionsAttribute.java
│       │   │   ├── LineNumberTableAttribute.java
│       │   │   ├── LocalVariableTableAttribute.java
│       │   │   ├── SourceFileAttribute.java
│       │   │   ├── SyntheticAttribute.java
│       │   │   └── UnparsedAttribute.java
│       │   └── classconstant/
│       │       ├── ConstantClassInfo.java
│       │       ├── ConstantDoubleInfo.java
│       │       ├── ConstantFieldRefInfo.java
│       │       ├── ConstantFloatInfo.java
│       │       ├── ConstantInfo.java
│       │       ├── ConstantIntegerInfo.java
│       │       ├── ConstantInterfaceMethodRefInfo.java
│       │       ├── ConstantInvokeDynamicInfo.java
│       │       ├── ConstantLongInfo.java
│       │       ├── ConstantMemberRefInfo.java
│       │       ├── ConstantMethodHandleInfo.java
│       │       ├── ConstantMethodRefInfo.java
│       │       ├── ConstantMethodTypeInfo.java
│       │       ├── ConstantNameAndTypeInfo.java
│       │       ├── ConstantStringInfo.java
│       │       └── ConstantUtf8Info.java
│       ├── classpath/
│       │   ├── ClassPath.java
│       │   ├── CompositeEntry.java
│       │   ├── DirEntry.java
│       │   ├── Entry.java
│       │   ├── WildcardEntry.java
│       │   └── ZipJarEntry.java
│       ├── instructions/
│       │   ├── InstructionFactory.java
│       │   ├── base/
│       │   │   ├── BranchInstruction.java
│       │   │   ├── BranchLogic.java
│       │   │   ├── BytecodeReader.java
│       │   │   ├── ClassInitLogic.java
│       │   │   ├── Index16Instruction.java
│       │   │   ├── Index8Instruction.java
│       │   │   ├── Instruction.java
│       │   │   ├── MethodInvokeLogic.java
│       │   │   └── NoOperandsInstruction.java
│       │   ├── comparisons/
│       │   │   ├── dcmp/
│       │   │   │   ├── DCMP.java
│       │   │   │   ├── DCMPG.java
│       │   │   │   └── DCMPL.java
│       │   │   ├── fcmp/
│       │   │   │   ├── FCMP.java
│       │   │   │   ├── FCMPG.java
│       │   │   │   └── FCMPL.java
│       │   │   ├── ifacmp/
│       │   │   │   ├── IF_ACMPEQ.java
│       │   │   │   ├── IF_ACMPNE.java
│       │   │   │   └── IfAcmp.java
│       │   │   ├── ifcond/
│       │   │   │   ├── IFEQ.java
│       │   │   │   ├── IFGE.java
│       │   │   │   ├── IFGT.java
│       │   │   │   ├── IFLE.java
│       │   │   │   ├── IFLT.java
│       │   │   │   └── IFNE.java
│       │   │   ├── ificmp/
│       │   │   │   ├── IF_ICMPEQ.java
│       │   │   │   ├── IF_ICMPGE.java
│       │   │   │   ├── IF_ICMPGT.java
│       │   │   │   ├── IF_ICMPLE.java
│       │   │   │   ├── IF_ICMPLT.java
│       │   │   │   ├── IF_ICMPNE.java
│       │   │   │   └── IfIcmp.java
│       │   │   └── lcmp/
│       │   │       └── LCMP.java
│       │   ├── constants/
│       │   │   ├── ACONST_NULL.java
│       │   │   ├── BIPUSH.java
│       │   │   ├── DCONST_0.java
│       │   │   ├── DCONST_1.java
│       │   │   ├── FCONST_0.java
│       │   │   ├── FCONST_1.java
│       │   │   ├── FCONST_2.java
│       │   │   ├── ICONST_0.java
│       │   │   ├── ICONST_1.java
│       │   │   ├── ICONST_2.java
│       │   │   ├── ICONST_3.java
│       │   │   ├── ICONST_4.java
│       │   │   ├── ICONST_5.java
│       │   │   ├── ICONST_M1.java
│       │   │   ├── LCONST_0.java
│       │   │   ├── LCONST_1.java
│       │   │   ├── LDC.java
│       │   │   ├── LDC2_W.java
│       │   │   ├── LDC_W.java
│       │   │   ├── NOP.java
│       │   │   └── SIPUSH.java
│       │   ├── control/
│       │   │   ├── ARETURN.java
│       │   │   ├── DRETURN.java
│       │   │   ├── FRETURN.java
│       │   │   ├── GOTO.java
│       │   │   ├── IRETURN.java
│       │   │   ├── LOOKUP_SWITCH.java
│       │   │   ├── LRETURN.java
│       │   │   ├── RETURN.java
│       │   │   └── TABLE_SWITCH.java
│       │   ├── conversions/
│       │   │   ├── d2x/
│       │   │   │   ├── D2F.java
│       │   │   │   ├── D2I.java
│       │   │   │   └── D2L.java
│       │   │   ├── f2x/
│       │   │   │   ├── F2D.java
│       │   │   │   ├── F2I.java
│       │   │   │   └── F2L.java
│       │   │   ├── i2x/
│       │   │   │   ├── I2B.java
│       │   │   │   ├── I2C.java
│       │   │   │   ├── I2D.java
│       │   │   │   ├── I2F.java
│       │   │   │   ├── I2L.java
│       │   │   │   └── I2S.java
│       │   │   └── l2x/
│       │   │       ├── L2D.java
│       │   │       ├── L2F.java
│       │   │       └── L2I.java
│       │   ├── extended/
│       │   │   ├── GOTO_W.java
│       │   │   ├── IFNONNULL.java
│       │   │   ├── IFNULL.java
│       │   │   └── WIDE.java
│       │   ├── loads/
│       │   │   ├── Load.java
│       │   │   ├── loaddouble/
│       │   │   │   ├── DLOAD.java
│       │   │   │   ├── DLOAD_0.java
│       │   │   │   ├── DLOAD_1.java
│       │   │   │   ├── DLOAD_2.java
│       │   │   │   └── DLOAD_3.java
│       │   │   ├── loadfloat/
│       │   │   │   ├── FLOAD.java
│       │   │   │   ├── FLOAD_0.java
│       │   │   │   ├── FLOAD_1.java
│       │   │   │   ├── FLOAD_2.java
│       │   │   │   └── FLOAD_3.java
│       │   │   ├── loadint/
│       │   │   │   ├── ILOAD.java
│       │   │   │   ├── ILOAD_0.java
│       │   │   │   ├── ILOAD_1.java
│       │   │   │   ├── ILOAD_2.java
│       │   │   │   └── ILOAD_3.java
│       │   │   ├── loadlong/
│       │   │   │   ├── LLOAD.java
│       │   │   │   ├── LLOAD_0.java
│       │   │   │   ├── LLOAD_1.java
│       │   │   │   ├── LLOAD_2.java
│       │   │   │   └── LLOAD_3.java
│       │   │   ├── loadref/
│       │   │   │   ├── ALOAD.java
│       │   │   │   ├── ALOAD_0.java
│       │   │   │   ├── ALOAD_1.java
│       │   │   │   ├── ALOAD_2.java
│       │   │   │   └── ALOAD_3.java
│       │   │   └── loadxarr/
│       │   │       ├── AALOAD.java
│       │   │       ├── BALOAD.java
│       │   │       ├── CALOAD.java
│       │   │       ├── DALOAD.java
│       │   │       ├── FALOAD.java
│       │   │       ├── IALOAD.java
│       │   │       ├── LALOAD.java
│       │   │       └── SALOAD.java
│       │   ├── math/
│       │   │   ├── add/
│       │   │   │   ├── DADD.java
│       │   │   │   ├── FADD.java
│       │   │   │   ├── IADD.java
│       │   │   │   └── LADD.java
│       │   │   ├── and/
│       │   │   │   ├── IAND.java
│       │   │   │   └── LAND.java
│       │   │   ├── div/
│       │   │   │   ├── DDIV.java
│       │   │   │   ├── FDIV.java
│       │   │   │   ├── IDIV.java
│       │   │   │   └── LDIV.java
│       │   │   ├── iinc/
│       │   │   │   └── IINC.java
│       │   │   ├── mul/
│       │   │   │   ├── DMUL.java
│       │   │   │   ├── FMUL.java
│       │   │   │   ├── IMUL.java
│       │   │   │   └── LMUL.java
│       │   │   ├── neg/
│       │   │   │   ├── DNEG.java
│       │   │   │   ├── FNEG.java
│       │   │   │   ├── INEG.java
│       │   │   │   └── LNEG.java
│       │   │   ├── or/
│       │   │   │   ├── IOR.java
│       │   │   │   └── LOR.java
│       │   │   ├── rem/
│       │   │   │   ├── DREM.java
│       │   │   │   ├── FREM.java
│       │   │   │   ├── IREM.java
│       │   │   │   └── LREM.java
│       │   │   ├── sh/
│       │   │   │   ├── ISHL.java
│       │   │   │   ├── ISHR.java
│       │   │   │   ├── IUSHR.java
│       │   │   │   ├── LSHL.java
│       │   │   │   ├── LSHR.java
│       │   │   │   └── LUSHR.java
│       │   │   ├── sub/
│       │   │   │   ├── DSUB.java
│       │   │   │   ├── FSUB.java
│       │   │   │   ├── ISUB.java
│       │   │   │   └── LSUB.java
│       │   │   └── xor/
│       │   │       ├── IXOR.java
│       │   │       └── LXOR.java
│       │   ├── references/
│       │   │   ├── ANEW_ARRAY.java
│       │   │   ├── ARRAY_LENGTH.java
│       │   │   ├── ATHROW.java
│       │   │   ├── CHECK_CAST.java
│       │   │   ├── GET_FIELD.java
│       │   │   ├── GET_STATIC.java
│       │   │   ├── INSTANCE_OF.java
│       │   │   ├── INVOKE_INTERFACE.java
│       │   │   ├── INVOKE_NATIVE.java
│       │   │   ├── INVOKE_SPECIAL.java
│       │   │   ├── INVOKE_STATIC.java
│       │   │   ├── INVOKE_VIRTUAL.java
│       │   │   ├── MULTI_ANEW_ARRAY.java
│       │   │   ├── NEW.java
│       │   │   ├── NEW_ARRAY.java
│       │   │   ├── PUT_FIELD.java
│       │   │   └── PUT_STATIC.java
│       │   ├── stack/
│       │   │   ├── dup/
│       │   │   │   ├── DUP.java
│       │   │   │   ├── DUP2.java
│       │   │   │   ├── DUP2_X1.java
│       │   │   │   ├── DUP2_X2.java
│       │   │   │   ├── DUP_X1.java
│       │   │   │   └── DUP_X2.java
│       │   │   ├── pop/
│       │   │   │   ├── POP.java
│       │   │   │   └── POP2.java
│       │   │   └── swap/
│       │   │       └── SWAP.java
│       │   └── stores/
│       │       ├── Store.java
│       │       ├── storedouble/
│       │       │   ├── DSTORE.java
│       │       │   ├── DSTORE_0.java
│       │       │   ├── DSTORE_1.java
│       │       │   ├── DSTORE_2.java
│       │       │   └── DSTORE_3.java
│       │       ├── storefloat/
│       │       │   ├── FSTORE.java
│       │       │   ├── FSTORE_0.java
│       │       │   ├── FSTORE_1.java
│       │       │   ├── FSTORE_2.java
│       │       │   └── FSTORE_3.java
│       │       ├── storeint/
│       │       │   ├── ISTORE.java
│       │       │   ├── ISTORE_0.java
│       │       │   ├── ISTORE_1.java
│       │       │   ├── ISTORE_2.java
│       │       │   └── ISTORE_3.java
│       │       ├── storelong/
│       │       │   ├── LSTORE.java
│       │       │   ├── LSTORE_0.java
│       │       │   ├── LSTORE_1.java
│       │       │   ├── LSTORE_2.java
│       │       │   └── LSTORE_3.java
│       │       ├── storeref/
│       │       │   ├── ASTORE.java
│       │       │   ├── ASTORE_0.java
│       │       │   ├── ASTORE_1.java
│       │       │   ├── ASTORE_2.java
│       │       │   └── ASTORE_3.java
│       │       └── storexarr/
│       │           ├── AASTORE.java
│       │           ├── BASTORE.java
│       │           ├── CASTORE.java
│       │           ├── DASTORE.java
│       │           ├── FASTORE.java
│       │           ├── IASTORE.java
│       │           ├── LASTORE.java
│       │           └── SASTORE.java
│       ├── runtimedata/
│       │   ├── LocalVars.java
│       │   ├── OperandStack.java
│       │   ├── Slot.java
│       │   ├── Slots.java
│       │   ├── Zframe.java
│       │   ├── Zstack.java
│       │   ├── Zthread.java
│       │   └── heap/
│       │       ├── AccessFlag.java
│       │       ├── ClassMember.java
│       │       ├── ClassNameHelper.java
│       │       ├── ClassRef.java
│       │       ├── ExceptionTable.java
│       │       ├── FieldRef.java
│       │       ├── InterfaceMethodRef.java
│       │       ├── MemberRef.java
│       │       ├── MethodDescriptor.java
│       │       ├── MethodLookup.java
│       │       ├── MethodRef.java
│       │       ├── RuntimeConstantInfo.java
│       │       ├── RuntimeConstantPool.java
│       │       ├── StringPool.java
│       │       ├── SymRef.java
│       │       ├── Zclass.java
│       │       ├── ZclassLoader.java
│       │       ├── Zfield.java
│       │       ├── Zmethod.java
│       │       └── Zobject.java
│       ├── test/
│       │   ├── TestClassFile03.java
│       │   ├── TestClassLoader07.java
│       │   ├── TestClassPath02.java
│       │   ├── TestCmd01.java
│       │   ├── TestException12.java
│       │   ├── TestGetClass11.java
│       │   ├── TestInterpreter06.java
│       │   ├── TestInvokeMethod08.java
│       │   ├── TestLocalVars04.java
│       │   ├── TestNewArray09.java
│       │   ├── TestOperandStack05.java
│       │   └── TestStringPool10.java
│       └── znative/
│           ├── NativeMethod.java
│           ├── RegisterCenter.java
│           └── java/
│               └── lang/
│                   ├── NStackTraceElement.java
│                   ├── Nclass.java
│                   ├── Nobject.java
│                   └── Nthrowable.java
└── README.md
Download .txt
SYMBOL INDEX (994 symbols across 297 files)

FILE: Java/src/Main.java
  class Main (line 6) | public class Main {
    method main (line 7) | public static void main(String[] args) {

FILE: Java/src/Utils/ByteUtils.java
  class ByteUtils (line 8) | public class ByteUtils {
    method bytesToHexString (line 11) | public static String bytesToHexString(byte[] src) {
    method bytesToHexString (line 20) | public static String bytesToHexString(byte[] src, int len) {
    method bytesToU16 (line 37) | public static int bytesToU16(byte[] data) {
    method byteToInt32 (line 52) | public static int byteToInt32(byte[] data) {
    method byteToLong64 (line 61) | public static long byteToLong64(byte[] data) {
    method byte2Float32 (line 71) | public static float byte2Float32(byte[] b) {
    method byte2Double64 (line 77) | public static double byte2Double64(byte[] b) {

FILE: Java/src/Utils/Cmd.java
  class Cmd (line 8) | public class Cmd {
    method Cmd (line 24) | public Cmd(String cmdLine) {
    method Cmd (line 28) | public Cmd(String[] strs) {
    method parseCmd (line 32) | public void parseCmd(String[] args) {
    method parseCmd (line 74) | private void parseCmd(String cmdLine) {
    method printUsage (line 81) | public void printUsage() {
    method isRightFmt (line 86) | public boolean isRightFmt() {
    method isRightOpt (line 90) | public boolean isRightOpt() {
    method isHelpFlag (line 94) | public boolean isHelpFlag() {
    method isVersionFlag (line 98) | public boolean isVersionFlag() {
    method getCpOption (line 102) | public String getCpOption() {
    method getXJreOption (line 106) | public String getXJreOption() {
    method getClazz (line 110) | public String getClazz() {
    method getArgs (line 114) | public String[] getArgs() {

FILE: Java/src/classfile/ClassFile.java
  class ClassFile (line 13) | public class ClassFile {
    method ClassFile (line 32) | public ClassFile(byte[] classData) {
    method read (line 42) | private void read(ClassReader reader) {
    method readAndCheckMagic (line 57) | private void readAndCheckMagic(ClassReader reader) {
    method readAndCheckVersion (line 65) | private void readAndCheckVersion(ClassReader reader) {
    method getMinorVersion (line 77) | public int getMinorVersion() {
    method getMajorVersion (line 81) | public int getMajorVersion() {
    method getConstantPool (line 85) | public ConstantPool getConstantPool() {
    method getAccessFlags (line 89) | public int getAccessFlags() {
    method getThisClass (line 93) | public int getThisClass() {
    method getSuperClass (line 97) | public int getSuperClass() {
    method getInterfaces (line 101) | public int[] getInterfaces() {
    method getFields (line 105) | public MemberInfo[] getFields() {
    method getMethods (line 109) | public MemberInfo[] getMethods() {
    method getAttributes (line 113) | public AttributeInfo[] getAttributes() {
    method getClassName (line 117) | public String getClassName() {
    method getSuperClassName (line 121) | public String getSuperClassName() {
    method getInterfaceNames (line 129) | public String[] getInterfaceNames() {
    method getSourceFile (line 139) | public String getSourceFile() {

FILE: Java/src/classfile/ClassReader.java
  class ClassReader (line 10) | public class ClassReader {
    method ClassReader (line 15) | public ClassReader(byte[] data) {
    method readUint8 (line 20) | public byte readUint8() {
    method readUint16 (line 27) | public int readUint16() {
    method readUint32 (line 35) | public byte[] readUint32() {
    method readUint64 (line 45) | public byte[] readUint64() {
    method readUint16s (line 62) | public int[] readUint16s() {
    method readBytes (line 71) | public byte[] readBytes(int n) {

FILE: Java/src/classfile/ConstantPool.java
  class ConstantPool (line 12) | public class ConstantPool {
    method getInfos (line 16) | public ConstantInfo[] getInfos() {
    method ConstantPool (line 24) | public ConstantPool(ClassReader reader) {
    method getConstantInfo (line 46) | private ConstantInfo getConstantInfo(int index) {
    method getName (line 57) | public String getName(int index) {
    method getType (line 63) | public String getType(int index) {
    method getNameAndType (line 68) | public String[] getNameAndType(int index) {
    method getClassName (line 76) | public String getClassName(int index) {
    method getUtf8 (line 82) | public String getUtf8(int index) {
    method getConstantPoolCount (line 87) | public int getConstantPoolCount() {

FILE: Java/src/classfile/MemberInfo.java
  class MemberInfo (line 25) | public class MemberInfo {
    method MemberInfo (line 32) | public MemberInfo(ClassReader reader, ConstantPool constantPool) {
    method readMembers (line 40) | public static MemberInfo[] readMembers(ClassReader reader, ConstantPoo...
    method getAccessFlags (line 49) | public int getAccessFlags() {
    method getName (line 53) | public String getName() {
    method getDescriptor (line 57) | public String getDescriptor() {
    method getCodeAttribute (line 61) | public CodeAttribute getCodeAttribute() {
    method getConstantValueAttribute (line 71) | public ConstantValueAttribute getConstantValueAttribute() {
    method getExceptionsAttribute (line 81) | public ExceptionsAttribute getExceptionsAttribute() {

FILE: Java/src/classfile/attribute/AttributeInfo.java
  class AttributeInfo (line 24) | public abstract class AttributeInfo {
    method readInfo (line 27) | abstract void readInfo(ClassReader reader);
    method readAttribute (line 30) | private static AttributeInfo readAttribute(ClassReader reader, Constan...
    method readAttributes (line 47) | public static AttributeInfo[] readAttributes(ClassReader reader, Const...
    method create (line 63) | private static AttributeInfo create(String attrName, int attrLen, Cons...

FILE: Java/src/classfile/attribute/CodeAttribute.java
  class CodeAttribute (line 32) | public class CodeAttribute extends AttributeInfo {
    method CodeAttribute (line 40) | public CodeAttribute(ConstantPool constantPool) {
    method readInfo (line 44) | @Override
    method readExceptionTable (line 54) | private ExceptionTableEntry[] readExceptionTable(ClassReader reader) {
    method lineNumberTableAttribute (line 63) | public LineNumberTableAttribute lineNumberTableAttribute() {
    class ExceptionTableEntry (line 74) | public static class ExceptionTableEntry {
      method ExceptionTableEntry (line 82) | public ExceptionTableEntry(ClassReader reader) {
      method getStartPc (line 89) | public int getStartPc() {
      method getEndPc (line 93) | public int getEndPc() {
      method getHandlerPc (line 97) | public int getHandlerPc() {
      method getCatchType (line 101) | public int getCatchType() {
    method getMaxStack (line 106) | public int getMaxStack() {
    method getMaxLocals (line 110) | public int getMaxLocals() {
    method getCode (line 114) | public byte[] getCode() {
    method getExceptionTable (line 118) | public ExceptionTableEntry[] getExceptionTable() {

FILE: Java/src/classfile/attribute/ConstantValueAttribute.java
  class ConstantValueAttribute (line 28) | public class ConstantValueAttribute extends AttributeInfo {
    method readInfo (line 31) | @Override
    method getConstantValueIndex (line 36) | public int getConstantValueIndex() {

FILE: Java/src/classfile/attribute/DeprecatedAttribute.java
  class DeprecatedAttribute (line 11) | public class DeprecatedAttribute extends AttributeInfo {
    method readInfo (line 15) | @Override

FILE: Java/src/classfile/attribute/ExceptionsAttribute.java
  class ExceptionsAttribute (line 20) | public class ExceptionsAttribute extends AttributeInfo {
    method readInfo (line 24) | @Override
    method getExceptionIndexTable (line 29) | public int[] getExceptionIndexTable() {

FILE: Java/src/classfile/attribute/LineNumberTableAttribute.java
  class LineNumberTableAttribute (line 12) | public class LineNumberTableAttribute extends AttributeInfo {
    method readInfo (line 15) | @Override
    method getLineNumber (line 33) | public int getLineNumber(int pc) {
    class LineNumberTableEntry (line 43) | static class LineNumberTableEntry {
      method LineNumberTableEntry (line 47) | public LineNumberTableEntry(int startPc, int lineNumber) {

FILE: Java/src/classfile/attribute/LocalVariableTableAttribute.java
  class LocalVariableTableAttribute (line 13) | public class LocalVariableTableAttribute extends AttributeInfo {
    method readInfo (line 16) | @Override
    class LocalVariableTableEntry (line 31) | static class LocalVariableTableEntry {
      method LocalVariableTableEntry (line 38) | public LocalVariableTableEntry(int startPc, int length, int nameInde...

FILE: Java/src/classfile/attribute/SourceFileAttribute.java
  class SourceFileAttribute (line 13) | public class SourceFileAttribute extends AttributeInfo {
    method SourceFileAttribute (line 19) | public SourceFileAttribute(ConstantPool constantPool) {
    method readInfo (line 23) | @Override
    method getFileName (line 28) | public String getFileName() {

FILE: Java/src/classfile/attribute/SyntheticAttribute.java
  class SyntheticAttribute (line 11) | public class SyntheticAttribute extends AttributeInfo {
    method readInfo (line 15) | @Override

FILE: Java/src/classfile/attribute/UnparsedAttribute.java
  class UnparsedAttribute (line 10) | public class UnparsedAttribute extends AttributeInfo {
    method UnparsedAttribute (line 15) | public UnparsedAttribute(String attrName, int attrLen) {
    method readInfo (line 20) | @Override

FILE: Java/src/classfile/classconstant/ConstantClassInfo.java
  class ConstantClassInfo (line 16) | public class ConstantClassInfo extends ConstantInfo {
    method ConstantClassInfo (line 20) | public ConstantClassInfo(ConstantPool constantPool, int i) {
    method readInfo (line 26) | @Override
    method getName (line 31) | public String getName() {

FILE: Java/src/classfile/classconstant/ConstantDoubleInfo.java
  class ConstantDoubleInfo (line 11) | public class ConstantDoubleInfo extends ConstantInfo {
    method ConstantDoubleInfo (line 14) | public ConstantDoubleInfo(int i) {
    method readInfo (line 19) | @Override
    method getVal (line 25) | public double getVal() {

FILE: Java/src/classfile/classconstant/ConstantFieldRefInfo.java
  class ConstantFieldRefInfo (line 10) | public class ConstantFieldRefInfo extends ConstantMemberRefInfo {
    method ConstantFieldRefInfo (line 11) | public ConstantFieldRefInfo(ConstantPool constantPool,int type) {

FILE: Java/src/classfile/classconstant/ConstantFloatInfo.java
  class ConstantFloatInfo (line 11) | public class ConstantFloatInfo extends ConstantInfo {
    method ConstantFloatInfo (line 14) | public ConstantFloatInfo(int i) {
    method readInfo (line 18) | @Override
    method getVal (line 25) | public float getVal() {

FILE: Java/src/classfile/classconstant/ConstantInfo.java
  class ConstantInfo (line 13) | public abstract class ConstantInfo {
    method readInfo (line 31) | abstract void readInfo(ClassReader reader);
    method getType (line 36) | public int getType() {
    method readConstantInfo (line 40) | public static ConstantInfo readConstantInfo(ClassReader reader, Consta...
    method create (line 47) | private static ConstantInfo create(int type, ConstantPool constantPool) {

FILE: Java/src/classfile/classconstant/ConstantIntegerInfo.java
  class ConstantIntegerInfo (line 12) | public class ConstantIntegerInfo extends ConstantInfo {
    method ConstantIntegerInfo (line 15) | public ConstantIntegerInfo(int i) {
    method readInfo (line 19) | @Override
    method getVal (line 27) | public int getVal() {

FILE: Java/src/classfile/classconstant/ConstantInterfaceMethodRefInfo.java
  class ConstantInterfaceMethodRefInfo (line 10) | public class ConstantInterfaceMethodRefInfo extends ConstantMemberRefInfo {
    method ConstantInterfaceMethodRefInfo (line 11) | public ConstantInterfaceMethodRefInfo(ConstantPool constantPool, int t...

FILE: Java/src/classfile/classconstant/ConstantInvokeDynamicInfo.java
  class ConstantInvokeDynamicInfo (line 10) | public class ConstantInvokeDynamicInfo extends ConstantInfo {
    method ConstantInvokeDynamicInfo (line 14) | public ConstantInvokeDynamicInfo(int i) {
    method readInfo (line 18) | @Override

FILE: Java/src/classfile/classconstant/ConstantLongInfo.java
  class ConstantLongInfo (line 11) | public class ConstantLongInfo extends ConstantInfo {
    method ConstantLongInfo (line 14) | public ConstantLongInfo(int i) {
    method readInfo (line 19) | @Override
    method getVal (line 27) | public long getVal() {

FILE: Java/src/classfile/classconstant/ConstantMemberRefInfo.java
  class ConstantMemberRefInfo (line 24) | public class ConstantMemberRefInfo extends ConstantInfo {
    method ConstantMemberRefInfo (line 35) | public ConstantMemberRefInfo(ConstantPool constantPool, int type) {
    method readInfo (line 41) | @Override
    method getClassName (line 47) | public String getClassName() {
    method getNameAndDescriptor (line 51) | public String[] getNameAndDescriptor() {
    method getName (line 57) | public String getName() {
    method getDescriptor (line 61) | public String getDescriptor() {

FILE: Java/src/classfile/classconstant/ConstantMethodHandleInfo.java
  class ConstantMethodHandleInfo (line 10) | public class ConstantMethodHandleInfo extends ConstantInfo {
    method ConstantMethodHandleInfo (line 15) | public ConstantMethodHandleInfo(int i) {
    method readInfo (line 20) | @Override
    method getReferenceKind (line 26) | public int getReferenceKind() {
    method getReferenceIndex (line 30) | public int getReferenceIndex() {

FILE: Java/src/classfile/classconstant/ConstantMethodRefInfo.java
  class ConstantMethodRefInfo (line 10) | public class ConstantMethodRefInfo extends ConstantMemberRefInfo {
    method ConstantMethodRefInfo (line 11) | public ConstantMethodRefInfo(ConstantPool constantPool, int type) {

FILE: Java/src/classfile/classconstant/ConstantMethodTypeInfo.java
  class ConstantMethodTypeInfo (line 10) | public class ConstantMethodTypeInfo extends ConstantInfo {
    method ConstantMethodTypeInfo (line 14) | public ConstantMethodTypeInfo(int i) {
    method readInfo (line 19) | @Override
    method getDescriptorIndex (line 24) | public int getDescriptorIndex() {

FILE: Java/src/classfile/classconstant/ConstantNameAndTypeInfo.java
  class ConstantNameAndTypeInfo (line 32) | public class ConstantNameAndTypeInfo extends ConstantInfo {
    method ConstantNameAndTypeInfo (line 36) | public ConstantNameAndTypeInfo(int i) {
    method readInfo (line 41) | @Override

FILE: Java/src/classfile/classconstant/ConstantStringInfo.java
  class ConstantStringInfo (line 12) | public class ConstantStringInfo extends ConstantInfo {
    method ConstantStringInfo (line 16) | public ConstantStringInfo(ConstantPool constantPool,int i) {
    method readInfo (line 23) | @Override
    method getString (line 28) | public String getString() {

FILE: Java/src/classfile/classconstant/ConstantUtf8Info.java
  class ConstantUtf8Info (line 21) | public class ConstantUtf8Info extends ConstantInfo {
    method ConstantUtf8Info (line 24) | public ConstantUtf8Info(int i) {
    method readInfo (line 29) | @Override
    method decodeMUTF8 (line 41) | private static String decodeMUTF8(byte[] bytearr) throws IOException {
    method getVal (line 185) | public String getVal() {

FILE: Java/src/classpath/ClassPath.java
  class ClassPath (line 13) | public class ClassPath {
    method ClassPath (line 24) | public ClassPath(String jreOption, String cpOption) {
    method parseBootClasspath (line 32) | private Entry parseBootClasspath() {
    method parseExtClasspath (line 38) | private Entry parseExtClasspath() {
    method getJreDir (line 45) | private String getJreDir(String jreOption) {
    method parseUserClasspath (line 69) | private Entry parseUserClasspath(String cpOption) {
    method readClass (line 80) | public byte[] readClass(String className) {
    method toString (line 109) | @Override

FILE: Java/src/classpath/CompositeEntry.java
  class CompositeEntry (line 12) | public class CompositeEntry extends Entry {
    method CompositeEntry (line 17) | public CompositeEntry() {
    method CompositeEntry (line 20) | public CompositeEntry(String pathList, String pathListSeparator) {
    method readClass (line 29) | @Override
    method printClassName (line 46) | @Override

FILE: Java/src/classpath/DirEntry.java
  class DirEntry (line 10) | public class DirEntry extends Entry {
    method DirEntry (line 13) | public DirEntry(String path) {
    method readClass (line 54) | @Override
    method printClassName (line 80) | @Override

FILE: Java/src/classpath/Entry.java
  class Entry (line 11) | public abstract class Entry {
    method readClass (line 20) | abstract byte[] readClass(String className) throws IOException;
    method printClassName (line 25) | abstract String printClassName();
    method createEntry (line 34) | static Entry createEntry(String path) {

FILE: Java/src/classpath/WildcardEntry.java
  class WildcardEntry (line 14) | public class WildcardEntry extends Entry {
    method WildcardEntry (line 18) | public WildcardEntry(String jreLibPath) {
    method readClass (line 33) | @Override
    method printClassName (line 38) | @Override

FILE: Java/src/classpath/ZipJarEntry.java
  class ZipJarEntry (line 13) | public class ZipJarEntry extends Entry {
    method ZipJarEntry (line 17) | public ZipJarEntry(String path) {
    method ZipJarEntry (line 27) | public ZipJarEntry(String path, String zipName) {
    method readClass (line 41) | @Override
    method printClassName (line 78) | @Override

FILE: Java/src/instructions/InstructionFactory.java
  class InstructionFactory (line 85) | public class InstructionFactory {
    method createInstruction (line 236) | public static Instruction createInstruction(int opCode) {

FILE: Java/src/instructions/base/BranchInstruction.java
  class BranchInstruction (line 10) | public abstract class BranchInstruction implements Instruction {
    method fetchOperands (line 13) | @Override

FILE: Java/src/instructions/base/BranchLogic.java
  class BranchLogic (line 10) | public class BranchLogic {
    method branch (line 11) | public static void branch(Zframe frame, int offset) {

FILE: Java/src/instructions/base/BytecodeReader.java
  class BytecodeReader (line 10) | public class BytecodeReader {
    method reset (line 18) | public void reset(byte[] code, int pc) {
    method getPc (line 23) | public int getPc() {
    method readInt8 (line 27) | public byte readInt8() {
    method readUint8 (line 33) | public int readUint8() {
    method readInt16 (line 41) | public int readInt16() {
    method readUint16 (line 45) | public int readUint16() {
    method readInt32 (line 51) | public int readInt32() {
    method readInt32s (line 61) | public int[] readInt32s(int n) {
    method skipPadding (line 71) | public void skipPadding() {

FILE: Java/src/instructions/base/ClassInitLogic.java
  class ClassInitLogic (line 13) | public class ClassInitLogic {
    method initClass (line 14) | public static void initClass(Zthread thread, Zclass clazz) {
    method scheduleClinit (line 20) | private static void scheduleClinit(Zthread thread, Zclass clazz) {
    method initSuperClass (line 29) | private static void initSuperClass(Zthread thread, Zclass clazz) {

FILE: Java/src/instructions/base/Index16Instruction.java
  class Index16Instruction (line 8) | public abstract class Index16Instruction implements Instruction {
    method fetchOperands (line 11) | @Override

FILE: Java/src/instructions/base/Index8Instruction.java
  class Index8Instruction (line 10) | public abstract class Index8Instruction implements Instruction {
    method Index8Instruction (line 12) | public Index8Instruction(){}
    method fetchOperands (line 16) | @Override

FILE: Java/src/instructions/base/Instruction.java
  type Instruction (line 10) | public interface Instruction {
    method fetchOperands (line 12) | void fetchOperands(BytecodeReader reader);
    method execute (line 15) | void execute(Zframe frame);

FILE: Java/src/instructions/base/MethodInvokeLogic.java
  class MethodInvokeLogic (line 12) | public class MethodInvokeLogic {
    method invokeMethod (line 14) | public static void invokeMethod(Zframe invokerFrame, Zmethod method) {

FILE: Java/src/instructions/base/NoOperandsInstruction.java
  class NoOperandsInstruction (line 8) | public abstract class NoOperandsInstruction implements Instruction{
    method fetchOperands (line 10) | @Override

FILE: Java/src/instructions/comparisons/dcmp/DCMP.java
  class DCMP (line 13) | public class DCMP {
    method _dcmp (line 14) | static void _dcmp(Zframe frame, boolean flag) {

FILE: Java/src/instructions/comparisons/dcmp/DCMPG.java
  class DCMPG (line 12) | public class DCMPG extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/comparisons/dcmp/DCMPL.java
  class DCMPL (line 11) | public class DCMPL extends NoOperandsInstruction {
    method execute (line 12) | @Override

FILE: Java/src/instructions/comparisons/fcmp/FCMP.java
  class FCMP (line 13) | public class FCMP {
    method _fcmp (line 14) | static void _fcmp(Zframe frame, boolean flag) {

FILE: Java/src/instructions/comparisons/fcmp/FCMPG.java
  class FCMPG (line 11) | public class FCMPG extends NoOperandsInstruction {
    method execute (line 12) | @Override

FILE: Java/src/instructions/comparisons/fcmp/FCMPL.java
  class FCMPL (line 11) | public class FCMPL extends NoOperandsInstruction {
    method execute (line 12) | @Override

FILE: Java/src/instructions/comparisons/ifacmp/IF_ACMPEQ.java
  class IF_ACMPEQ (line 12) | public class IF_ACMPEQ extends BranchInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/comparisons/ifacmp/IF_ACMPNE.java
  class IF_ACMPNE (line 12) | public class IF_ACMPNE extends BranchInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/comparisons/ifacmp/IfAcmp.java
  class IfAcmp (line 12) | public class IfAcmp {
    method _acmp (line 13) | public static boolean _acmp(Zframe frame) {

FILE: Java/src/instructions/comparisons/ifcond/IFEQ.java
  class IFEQ (line 12) | public class IFEQ extends BranchInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/comparisons/ifcond/IFGE.java
  class IFGE (line 12) | public class IFGE extends BranchInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/comparisons/ifcond/IFGT.java
  class IFGT (line 12) | public class IFGT extends BranchInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/comparisons/ifcond/IFLE.java
  class IFLE (line 12) | public class IFLE extends BranchInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/comparisons/ifcond/IFLT.java
  class IFLT (line 12) | public class IFLT extends BranchInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/comparisons/ifcond/IFNE.java
  class IFNE (line 12) | public class IFNE extends BranchInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/comparisons/ificmp/IF_ICMPEQ.java
  class IF_ICMPEQ (line 12) | public class IF_ICMPEQ extends BranchInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/comparisons/ificmp/IF_ICMPGE.java
  class IF_ICMPGE (line 12) | public class IF_ICMPGE extends BranchInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/comparisons/ificmp/IF_ICMPGT.java
  class IF_ICMPGT (line 12) | public class IF_ICMPGT extends BranchInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/comparisons/ificmp/IF_ICMPLE.java
  class IF_ICMPLE (line 12) | public class IF_ICMPLE extends BranchInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/comparisons/ificmp/IF_ICMPLT.java
  class IF_ICMPLT (line 12) | public class IF_ICMPLT extends BranchInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/comparisons/ificmp/IF_ICMPNE.java
  class IF_ICMPNE (line 12) | public class IF_ICMPNE extends BranchInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/comparisons/ificmp/IfIcmp.java
  class IfIcmp (line 11) | public class IfIcmp {
    method _icmpPop (line 12) | static int[] _icmpPop(Zframe frame) {

FILE: Java/src/instructions/comparisons/lcmp/LCMP.java
  class LCMP (line 12) | public class LCMP extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/constants/ACONST_NULL.java
  class ACONST_NULL (line 11) | public class ACONST_NULL extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/constants/BIPUSH.java
  class BIPUSH (line 12) | public class BIPUSH implements Instruction {
    method fetchOperands (line 15) | @Override
    method execute (line 20) | @Override

FILE: Java/src/instructions/constants/DCONST_0.java
  class DCONST_0 (line 11) | public class DCONST_0 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/constants/DCONST_1.java
  class DCONST_1 (line 11) | public class DCONST_1 extends NoOperandsInstruction {
    method execute (line 12) | @Override

FILE: Java/src/instructions/constants/FCONST_0.java
  class FCONST_0 (line 11) | public class FCONST_0 extends NoOperandsInstruction {
    method execute (line 12) | @Override

FILE: Java/src/instructions/constants/FCONST_1.java
  class FCONST_1 (line 11) | public class FCONST_1 extends NoOperandsInstruction {
    method execute (line 12) | @Override

FILE: Java/src/instructions/constants/FCONST_2.java
  class FCONST_2 (line 11) | public class FCONST_2 extends NoOperandsInstruction {
    method execute (line 12) | @Override

FILE: Java/src/instructions/constants/ICONST_0.java
  class ICONST_0 (line 11) | public class ICONST_0 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/constants/ICONST_1.java
  class ICONST_1 (line 11) | public class ICONST_1 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/constants/ICONST_2.java
  class ICONST_2 (line 11) | public class ICONST_2 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/constants/ICONST_3.java
  class ICONST_3 (line 11) | public class ICONST_3 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/constants/ICONST_4.java
  class ICONST_4 (line 11) | public class ICONST_4 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/constants/ICONST_5.java
  class ICONST_5 (line 11) | public class ICONST_5 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/constants/ICONST_M1.java
  class ICONST_M1 (line 11) | public class ICONST_M1 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/constants/LCONST_0.java
  class LCONST_0 (line 11) | public class LCONST_0 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/constants/LCONST_1.java
  class LCONST_1 (line 11) | public class LCONST_1 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/constants/LDC.java
  class LDC (line 14) | public class LDC extends Index8Instruction {
    method execute (line 15) | @Override

FILE: Java/src/instructions/constants/LDC2_W.java
  class LDC2_W (line 15) | public class LDC2_W extends Index16Instruction {
    method execute (line 16) | @Override

FILE: Java/src/instructions/constants/LDC_W.java
  class LDC_W (line 11) | public class LDC_W extends LDC {
    method fetchOperands (line 12) | @Override

FILE: Java/src/instructions/constants/NOP.java
  class NOP (line 11) | public class NOP extends NoOperandsInstruction{
    method execute (line 12) | @Override

FILE: Java/src/instructions/constants/SIPUSH.java
  class SIPUSH (line 12) | public class SIPUSH implements Instruction {
    method fetchOperands (line 15) | @Override
    method execute (line 20) | @Override

FILE: Java/src/instructions/control/ARETURN.java
  class ARETURN (line 13) | public class ARETURN extends NoOperandsInstruction {
    method execute (line 14) | @Override

FILE: Java/src/instructions/control/DRETURN.java
  class DRETURN (line 12) | public class DRETURN extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/control/FRETURN.java
  class FRETURN (line 12) | public class FRETURN extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/control/GOTO.java
  class GOTO (line 12) | public class GOTO extends BranchInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/control/IRETURN.java
  class IRETURN (line 14) | public class IRETURN extends NoOperandsInstruction {
    method execute (line 15) | @Override

FILE: Java/src/instructions/control/LOOKUP_SWITCH.java
  class LOOKUP_SWITCH (line 13) | public class LOOKUP_SWITCH implements Instruction {
    method fetchOperands (line 19) | @Override
    method execute (line 27) | @Override

FILE: Java/src/instructions/control/LRETURN.java
  class LRETURN (line 12) | public class LRETURN extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/control/RETURN.java
  class RETURN (line 12) | public class RETURN extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/control/TABLE_SWITCH.java
  class TABLE_SWITCH (line 13) | public class TABLE_SWITCH implements Instruction {
    method fetchOperands (line 21) | @Override
    method execute (line 32) | @Override

FILE: Java/src/instructions/conversions/d2x/D2F.java
  class D2F (line 12) | public class D2F extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/conversions/d2x/D2I.java
  class D2I (line 12) | public class D2I extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/conversions/d2x/D2L.java
  class D2L (line 12) | public class D2L extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/conversions/f2x/F2D.java
  class F2D (line 12) | public class F2D extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/conversions/f2x/F2I.java
  class F2I (line 12) | public class F2I extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/conversions/f2x/F2L.java
  class F2L (line 12) | public class F2L extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/conversions/i2x/I2B.java
  class I2B (line 12) | public class I2B extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/conversions/i2x/I2C.java
  class I2C (line 12) | public class I2C extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/conversions/i2x/I2D.java
  class I2D (line 12) | public class I2D extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/conversions/i2x/I2F.java
  class I2F (line 12) | public class I2F extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/conversions/i2x/I2L.java
  class I2L (line 12) | public class I2L extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/conversions/i2x/I2S.java
  class I2S (line 12) | public class I2S extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/conversions/l2x/L2D.java
  class L2D (line 12) | public class L2D extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/conversions/l2x/L2F.java
  class L2F (line 12) | public class L2F extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/conversions/l2x/L2I.java
  class L2I (line 12) | public class L2I extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/extended/GOTO_W.java
  class GOTO_W (line 13) | public class GOTO_W implements Instruction {
    method fetchOperands (line 16) | @Override
    method execute (line 21) | @Override

FILE: Java/src/instructions/extended/IFNONNULL.java
  class IFNONNULL (line 13) | public class IFNONNULL extends BranchInstruction {
    method execute (line 14) | @Override

FILE: Java/src/instructions/extended/IFNULL.java
  class IFNULL (line 13) | public class IFNULL extends BranchInstruction {
    method execute (line 14) | @Override

FILE: Java/src/instructions/extended/WIDE.java
  class WIDE (line 23) | public class WIDE implements Instruction {
    method fetchOperands (line 30) | @Override
    method execute (line 97) | @Override

FILE: Java/src/instructions/loads/Load.java
  class Load (line 12) | public class Load {
    method aload (line 13) | public static void aload(Zframe frame, int index) {
    method dload (line 18) | public static void dload(Zframe frame, int index) {
    method fload (line 23) | public static void fload(Zframe frame, int index) {
    method iload (line 28) | public static void iload(Zframe frame, int index) {
    method lload (line 33) | public static void lload(Zframe frame, int index) {
    method checkNotNull (line 39) | public static void checkNotNull(Zobject arrRef) {
    method checkIndex (line 45) | public static void checkIndex(int count, int index) {

FILE: Java/src/instructions/loads/loaddouble/DLOAD.java
  class DLOAD (line 12) | public class DLOAD extends Index8Instruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/loads/loaddouble/DLOAD_0.java
  class DLOAD_0 (line 12) | public class DLOAD_0 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/loads/loaddouble/DLOAD_1.java
  class DLOAD_1 (line 12) | public class DLOAD_1 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/loads/loaddouble/DLOAD_2.java
  class DLOAD_2 (line 12) | public class DLOAD_2 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/loads/loaddouble/DLOAD_3.java
  class DLOAD_3 (line 12) | public class DLOAD_3 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/loads/loadfloat/FLOAD.java
  class FLOAD (line 12) | public class FLOAD extends Index8Instruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/loads/loadfloat/FLOAD_0.java
  class FLOAD_0 (line 12) | public class FLOAD_0 extends NoOperandsInstruction{
    method execute (line 14) | @Override

FILE: Java/src/instructions/loads/loadfloat/FLOAD_1.java
  class FLOAD_1 (line 12) | public class FLOAD_1 extends NoOperandsInstruction{
    method execute (line 14) | @Override

FILE: Java/src/instructions/loads/loadfloat/FLOAD_2.java
  class FLOAD_2 (line 12) | public class FLOAD_2 extends NoOperandsInstruction{
    method execute (line 14) | @Override

FILE: Java/src/instructions/loads/loadfloat/FLOAD_3.java
  class FLOAD_3 (line 12) | public class FLOAD_3 extends NoOperandsInstruction {
    method execute (line 14) | @Override

FILE: Java/src/instructions/loads/loadint/ILOAD.java
  class ILOAD (line 12) | public class ILOAD extends Index8Instruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/loads/loadint/ILOAD_0.java
  class ILOAD_0 (line 12) | public class ILOAD_0 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/loads/loadint/ILOAD_1.java
  class ILOAD_1 (line 12) | public class ILOAD_1 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/loads/loadint/ILOAD_2.java
  class ILOAD_2 (line 12) | public class ILOAD_2 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/loads/loadint/ILOAD_3.java
  class ILOAD_3 (line 12) | public class ILOAD_3 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/loads/loadlong/LLOAD.java
  class LLOAD (line 12) | public class LLOAD extends Index8Instruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/loads/loadlong/LLOAD_0.java
  class LLOAD_0 (line 12) | public class LLOAD_0 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/loads/loadlong/LLOAD_1.java
  class LLOAD_1 (line 12) | public class LLOAD_1 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/loads/loadlong/LLOAD_2.java
  class LLOAD_2 (line 12) | public class LLOAD_2 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/loads/loadlong/LLOAD_3.java
  class LLOAD_3 (line 12) | public class LLOAD_3 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/loads/loadref/ALOAD.java
  class ALOAD (line 12) | public class ALOAD extends Index8Instruction{
    method execute (line 13) | @Override

FILE: Java/src/instructions/loads/loadref/ALOAD_0.java
  class ALOAD_0 (line 12) | public class ALOAD_0 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/loads/loadref/ALOAD_1.java
  class ALOAD_1 (line 12) | public class ALOAD_1 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/loads/loadref/ALOAD_2.java
  class ALOAD_2 (line 12) | public class ALOAD_2 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/loads/loadref/ALOAD_3.java
  class ALOAD_3 (line 12) | public class ALOAD_3 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/loads/loadxarr/AALOAD.java
  class AALOAD (line 14) | public class AALOAD extends NoOperandsInstruction {
    method execute (line 15) | @Override

FILE: Java/src/instructions/loads/loadxarr/BALOAD.java
  class BALOAD (line 14) | public class BALOAD extends NoOperandsInstruction {
    method execute (line 15) | @Override

FILE: Java/src/instructions/loads/loadxarr/CALOAD.java
  class CALOAD (line 14) | public class CALOAD extends NoOperandsInstruction {
    method execute (line 15) | @Override

FILE: Java/src/instructions/loads/loadxarr/DALOAD.java
  class DALOAD (line 14) | public class DALOAD extends NoOperandsInstruction {
    method execute (line 15) | @Override

FILE: Java/src/instructions/loads/loadxarr/FALOAD.java
  class FALOAD (line 14) | public class FALOAD extends NoOperandsInstruction {
    method execute (line 15) | @Override

FILE: Java/src/instructions/loads/loadxarr/IALOAD.java
  class IALOAD (line 14) | public class IALOAD extends NoOperandsInstruction {
    method execute (line 15) | @Override

FILE: Java/src/instructions/loads/loadxarr/LALOAD.java
  class LALOAD (line 14) | public class LALOAD extends NoOperandsInstruction {
    method execute (line 15) | @Override

FILE: Java/src/instructions/loads/loadxarr/SALOAD.java
  class SALOAD (line 14) | public class SALOAD extends NoOperandsInstruction {
    method execute (line 15) | @Override

FILE: Java/src/instructions/math/add/DADD.java
  class DADD (line 12) | public class DADD extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/add/FADD.java
  class FADD (line 12) | public class FADD extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/add/IADD.java
  class IADD (line 12) | public class IADD extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/add/LADD.java
  class LADD (line 12) | public class LADD extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/and/IAND.java
  class IAND (line 12) | public class IAND extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/and/LAND.java
  class LAND (line 12) | public class LAND extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/div/DDIV.java
  class DDIV (line 12) | public class DDIV extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/div/FDIV.java
  class FDIV (line 12) | public class FDIV extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/div/IDIV.java
  class IDIV (line 12) | public class IDIV extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/div/LDIV.java
  class LDIV (line 12) | public class LDIV extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/iinc/IINC.java
  class IINC (line 13) | public class IINC implements Instruction {
    method fetchOperands (line 17) | @Override
    method execute (line 23) | @Override

FILE: Java/src/instructions/math/mul/DMUL.java
  class DMUL (line 12) | public class DMUL extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/mul/FMUL.java
  class FMUL (line 12) | public class FMUL extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/mul/IMUL.java
  class IMUL (line 12) | public class IMUL extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/mul/LMUL.java
  class LMUL (line 12) | public class LMUL extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/neg/DNEG.java
  class DNEG (line 12) | public class DNEG extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/neg/FNEG.java
  class FNEG (line 12) | public class FNEG extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/neg/INEG.java
  class INEG (line 12) | public class INEG extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/neg/LNEG.java
  class LNEG (line 12) | public class LNEG extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/or/IOR.java
  class IOR (line 12) | public class IOR extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/or/LOR.java
  class LOR (line 12) | public class LOR extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/rem/DREM.java
  class DREM (line 12) | public class DREM extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/rem/FREM.java
  class FREM (line 12) | public class FREM extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/rem/IREM.java
  class IREM (line 12) | public class IREM extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/rem/LREM.java
  class LREM (line 12) | public class LREM extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/sh/ISHL.java
  class ISHL (line 13) | public class ISHL extends NoOperandsInstruction {
    method execute (line 14) | @Override

FILE: Java/src/instructions/math/sh/ISHR.java
  class ISHR (line 12) | public class ISHR extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/sh/IUSHR.java
  class IUSHR (line 12) | public class IUSHR extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/sh/LSHL.java
  class LSHL (line 13) | public class LSHL extends NoOperandsInstruction {
    method execute (line 14) | @Override

FILE: Java/src/instructions/math/sh/LSHR.java
  class LSHR (line 13) | public class LSHR extends NoOperandsInstruction {
    method execute (line 14) | @Override

FILE: Java/src/instructions/math/sh/LUSHR.java
  class LUSHR (line 12) | public class LUSHR extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/sub/DSUB.java
  class DSUB (line 12) | public class DSUB extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/sub/FSUB.java
  class FSUB (line 12) | public class FSUB extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/sub/ISUB.java
  class ISUB (line 12) | public class ISUB extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/sub/LSUB.java
  class LSUB (line 12) | public class LSUB extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/xor/IXOR.java
  class IXOR (line 12) | public class IXOR extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/math/xor/LXOR.java
  class LXOR (line 12) | public class LXOR extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/references/ANEW_ARRAY.java
  class ANEW_ARRAY (line 19) | public class ANEW_ARRAY extends Index16Instruction {
    method execute (line 20) | @Override

FILE: Java/src/instructions/references/ARRAY_LENGTH.java
  class ARRAY_LENGTH (line 13) | public class ARRAY_LENGTH extends NoOperandsInstruction {
    method execute (line 14) | @Override

FILE: Java/src/instructions/references/ATHROW.java
  class ATHROW (line 14) | public class ATHROW extends NoOperandsInstruction {
    method execute (line 15) | @Override
    method findAndGotoExceptionHandler (line 33) | private boolean findAndGotoExceptionHandler(Zthread thread, Zobject ex) {
    method handleUncaughtException (line 65) | private void handleUncaughtException(Zthread thread, Zobject ex) {

FILE: Java/src/instructions/references/CHECK_CAST.java
  class CHECK_CAST (line 18) | public class CHECK_CAST extends Index16Instruction {
    method execute (line 19) | @Override

FILE: Java/src/instructions/references/GET_FIELD.java
  class GET_FIELD (line 14) | public class GET_FIELD extends Index16Instruction {
    method execute (line 15) | @Override

FILE: Java/src/instructions/references/GET_STATIC.java
  class GET_STATIC (line 15) | public class GET_STATIC extends Index16Instruction {
    method execute (line 16) | @Override

FILE: Java/src/instructions/references/INSTANCE_OF.java
  class INSTANCE_OF (line 17) | public class INSTANCE_OF extends Index16Instruction {
    method execute (line 18) | @Override

FILE: Java/src/instructions/references/INVOKE_INTERFACE.java
  class INVOKE_INTERFACE (line 14) | public class INVOKE_INTERFACE extends Index16Instruction {
    method fetchOperands (line 15) | @Override
    method execute (line 22) | @Override

FILE: Java/src/instructions/references/INVOKE_NATIVE.java
  class INVOKE_NATIVE (line 14) | public class INVOKE_NATIVE extends NoOperandsInstruction {
    method execute (line 15) | @Override

FILE: Java/src/instructions/references/INVOKE_SPECIAL.java
  class INVOKE_SPECIAL (line 14) | public class INVOKE_SPECIAL extends Index16Instruction {
    method execute (line 15) | @Override

FILE: Java/src/instructions/references/INVOKE_STATIC.java
  class INVOKE_STATIC (line 18) | public class INVOKE_STATIC extends Index16Instruction {
    method execute (line 19) | @Override

FILE: Java/src/instructions/references/INVOKE_VIRTUAL.java
  class INVOKE_VIRTUAL (line 13) | public class INVOKE_VIRTUAL extends Index16Instruction {
    method execute (line 14) | @Override

FILE: Java/src/instructions/references/MULTI_ANEW_ARRAY.java
  class MULTI_ANEW_ARRAY (line 46) | public class MULTI_ANEW_ARRAY extends Index16Instruction {
    method fetchOperands (line 50) | @Override
    method execute (line 56) | @Override
    method popAndCheckCounts (line 72) | private LinkedList<Integer> popAndCheckCounts(OperandStack operandStac...
    method newMultiDimensionalArray (line 85) | private Zobject newMultiDimensionalArray(LinkedList<Integer> list, Zcl...

FILE: Java/src/instructions/references/NEW.java
  class NEW (line 17) | public class NEW extends Index16Instruction {
    method execute (line 19) | @Override

FILE: Java/src/instructions/references/NEW_ARRAY.java
  class NEW_ARRAY (line 15) | public class NEW_ARRAY extends Index8Instruction {
    method execute (line 26) | @Override
    method getPrimitiveArrayClass (line 41) | private Zclass getPrimitiveArrayClass(ZclassLoader loader) {

FILE: Java/src/instructions/references/PUT_FIELD.java
  class PUT_FIELD (line 15) | public class PUT_FIELD extends Index16Instruction {
    method execute (line 16) | @Override

FILE: Java/src/instructions/references/PUT_STATIC.java
  class PUT_STATIC (line 16) | public class PUT_STATIC extends Index16Instruction {
    method execute (line 17) | @Override

FILE: Java/src/instructions/stack/dup/DUP.java
  class DUP (line 13) | public class DUP extends NoOperandsInstruction {
    method execute (line 14) | @Override

FILE: Java/src/instructions/stack/dup/DUP2.java
  class DUP2 (line 13) | public class DUP2 extends NoOperandsInstruction {
    method execute (line 14) | @Override

FILE: Java/src/instructions/stack/dup/DUP2_X1.java
  class DUP2_X1 (line 13) | public class DUP2_X1 extends NoOperandsInstruction {
    method execute (line 14) | @Override

FILE: Java/src/instructions/stack/dup/DUP2_X2.java
  class DUP2_X2 (line 13) | public class DUP2_X2 extends NoOperandsInstruction {
    method execute (line 14) | @Override

FILE: Java/src/instructions/stack/dup/DUP_X1.java
  class DUP_X1 (line 13) | public class DUP_X1 extends NoOperandsInstruction {
    method execute (line 14) | @Override

FILE: Java/src/instructions/stack/dup/DUP_X2.java
  class DUP_X2 (line 13) | public class DUP_X2 extends NoOperandsInstruction {
    method execute (line 14) | @Override

FILE: Java/src/instructions/stack/pop/POP.java
  class POP (line 12) | public class POP extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stack/pop/POP2.java
  class POP2 (line 12) | public class POP2 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stack/swap/SWAP.java
  class SWAP (line 13) | public class SWAP extends NoOperandsInstruction {
    method execute (line 14) | @Override

FILE: Java/src/instructions/stores/Store.java
  class Store (line 11) | public class Store {
    method astore (line 12) | public static void astore(Zframe frame, int index) {
    method istore (line 17) | public static void istore(Zframe frame, int index) {
    method lstore (line 22) | public static void lstore(Zframe frame, int index) {
    method fstore (line 27) | public static void fstore(Zframe frame, int index) {
    method dstote (line 32) | public static void dstote(Zframe frame, int index) {
    method checkNotNull (line 38) | public static void checkNotNull(Zobject arrRef) {
    method checkIndex (line 44) | public static void checkIndex(int count, int index) {

FILE: Java/src/instructions/stores/storedouble/DSTORE.java
  class DSTORE (line 12) | public class DSTORE extends Index8Instruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storedouble/DSTORE_0.java
  class DSTORE_0 (line 12) | public class DSTORE_0 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storedouble/DSTORE_1.java
  class DSTORE_1 (line 12) | public class DSTORE_1 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storedouble/DSTORE_2.java
  class DSTORE_2 (line 12) | public class DSTORE_2 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storedouble/DSTORE_3.java
  class DSTORE_3 (line 12) | public class DSTORE_3 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storefloat/FSTORE.java
  class FSTORE (line 12) | public class FSTORE extends Index8Instruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storefloat/FSTORE_0.java
  class FSTORE_0 (line 12) | public class FSTORE_0 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storefloat/FSTORE_1.java
  class FSTORE_1 (line 12) | public class FSTORE_1 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storefloat/FSTORE_2.java
  class FSTORE_2 (line 12) | public class FSTORE_2 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storefloat/FSTORE_3.java
  class FSTORE_3 (line 12) | public class FSTORE_3 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storeint/ISTORE.java
  class ISTORE (line 12) | public class ISTORE extends Index8Instruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storeint/ISTORE_0.java
  class ISTORE_0 (line 12) | public class ISTORE_0 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storeint/ISTORE_1.java
  class ISTORE_1 (line 12) | public class ISTORE_1 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storeint/ISTORE_2.java
  class ISTORE_2 (line 12) | public class ISTORE_2 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storeint/ISTORE_3.java
  class ISTORE_3 (line 12) | public class ISTORE_3 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storelong/LSTORE.java
  class LSTORE (line 12) | public class LSTORE extends Index8Instruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storelong/LSTORE_0.java
  class LSTORE_0 (line 12) | public class LSTORE_0 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storelong/LSTORE_1.java
  class LSTORE_1 (line 12) | public class LSTORE_1 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storelong/LSTORE_2.java
  class LSTORE_2 (line 12) | public class LSTORE_2 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storelong/LSTORE_3.java
  class LSTORE_3 (line 12) | public class LSTORE_3 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storeref/ASTORE.java
  class ASTORE (line 12) | public class ASTORE extends Index8Instruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storeref/ASTORE_0.java
  class ASTORE_0 (line 12) | public class ASTORE_0 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storeref/ASTORE_1.java
  class ASTORE_1 (line 12) | public class ASTORE_1 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storeref/ASTORE_2.java
  class ASTORE_2 (line 12) | public class ASTORE_2 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storeref/ASTORE_3.java
  class ASTORE_3 (line 12) | public class ASTORE_3 extends NoOperandsInstruction {
    method execute (line 13) | @Override

FILE: Java/src/instructions/stores/storexarr/AASTORE.java
  class AASTORE (line 14) | public class AASTORE extends NoOperandsInstruction {
    method execute (line 15) | @Override

FILE: Java/src/instructions/stores/storexarr/BASTORE.java
  class BASTORE (line 14) | public class BASTORE extends NoOperandsInstruction {
    method execute (line 15) | @Override

FILE: Java/src/instructions/stores/storexarr/CASTORE.java
  class CASTORE (line 14) | public class CASTORE extends NoOperandsInstruction {
    method execute (line 15) | @Override

FILE: Java/src/instructions/stores/storexarr/DASTORE.java
  class DASTORE (line 14) | public class DASTORE extends NoOperandsInstruction {
    method execute (line 15) | @Override

FILE: Java/src/instructions/stores/storexarr/FASTORE.java
  class FASTORE (line 14) | public class FASTORE extends NoOperandsInstruction {
    method execute (line 15) | @Override

FILE: Java/src/instructions/stores/storexarr/IASTORE.java
  class IASTORE (line 14) | public class IASTORE extends NoOperandsInstruction {
    method execute (line 15) | @Override

FILE: Java/src/instructions/stores/storexarr/LASTORE.java
  class LASTORE (line 14) | public class LASTORE extends NoOperandsInstruction {
    method execute (line 15) | @Override

FILE: Java/src/instructions/stores/storexarr/SASTORE.java
  class SASTORE (line 14) | public class SASTORE extends NoOperandsInstruction {
    method execute (line 15) | @Override

FILE: Java/src/runtimedata/LocalVars.java
  class LocalVars (line 10) | public class LocalVars extends Slots {
    method LocalVars (line 11) | public LocalVars(int size) {

FILE: Java/src/runtimedata/OperandStack.java
  class OperandStack (line 21) | public class OperandStack {
    method OperandStack (line 27) | public OperandStack(int maxStack) {
    method pushBoolean (line 35) | public void pushBoolean(boolean val) {
    method popBoolean (line 43) | public boolean popBoolean() {
    method pushInt (line 47) | public void pushInt(int val) {
    method popInt (line 54) | public int popInt() {
    method pushFloat (line 59) | public void pushFloat(float val) {
    method popFloat (line 66) | public float popFloat() {
    method pushLong (line 71) | public void pushLong(long val) {
    method popLong (line 84) | public long popLong() {
    method pushDouble (line 92) | public void pushDouble(double val) {
    method popDouble (line 97) | public double popDouble() {
    method pushRef (line 102) | public void pushRef(Zobject ref) {
    method popRef (line 109) | public Zobject popRef() {
    method pushSlot (line 114) | public void pushSlot(Slot slot) {
    method popSlot (line 119) | public Slot popSlot() {
    method getRefFromTop (line 125) | public Zobject getRefFromTop(int n) {
    method isEmpty (line 130) | public boolean isEmpty() {
    method clear (line 135) | public void clear() {

FILE: Java/src/runtimedata/Slot.java
  class Slot (line 12) | public class Slot {
    method Slot (line 16) | public Slot() {}

FILE: Java/src/runtimedata/Slots.java
  class Slots (line 13) | public class Slots {
    method Slots (line 16) | public Slots(int size) {
    method setInt (line 24) | public void setInt(int index, int val) {
    method getInt (line 28) | public int getInt(int index) {
    method setFloat (line 32) | public void setFloat(int index, float val) {
    method getFloat (line 36) | public float getFloat(int index) {
    method setLong (line 40) | public void setLong(int index, long val) {
    method getLong (line 47) | public long getLong(int index) {
    method setDouble (line 53) | public void setDouble(int index, double val) {
    method getDouble (line 58) | public double getDouble(int index) {
    method setRef (line 63) | public void setRef(int index, Zobject ref) {
    method getRef (line 67) | public Zobject getRef(int index) {
    method setSlot (line 71) | public void setSlot(int index, Slot slot) {

FILE: Java/src/runtimedata/Zframe.java
  class Zframe (line 12) | public class Zframe {
    method Zframe (line 20) | public Zframe(Zthread thread, int maxLocals, int maxStack) {
    method Zframe (line 26) | public Zframe(Zthread thread, Zmethod method) {
    method getLocalVars (line 33) | public LocalVars getLocalVars() {
    method getOperandStack (line 37) | public OperandStack getOperandStack() {
    method getThread (line 41) | public Zthread getThread() {
    method getNextPC (line 45) | public int getNextPC() {
    method setNextPC (line 49) | public void setNextPC(int nextPC) {
    method getMethod (line 53) | public Zmethod getMethod() {
    method setMethod (line 57) | public void setMethod(Zmethod method) {
    method revertNextPC (line 65) | public void revertNextPC() {

FILE: Java/src/runtimedata/Zstack.java
  class Zstack (line 11) | public class Zstack {
    method Zstack (line 16) | public Zstack(int maxSize) {
    method push (line 22) | void push(Zframe frame) {
    method pop (line 36) | Zframe pop() {
    method top (line 47) | Zframe top() {
    method getFrames (line 55) | Zframe[] getFrames() {

FILE: Java/src/runtimedata/Zthread.java
  class Zthread (line 18) | public class Zthread {
    method Zthread (line 22) | public Zthread() {
    method getPc (line 27) | public int getPc() {
    method setPc (line 31) | public void setPc(int pc) {
    method pushFrame (line 35) | public void pushFrame(Zframe frame) {
    method popFrame (line 39) | public Zframe popFrame() {
    method getCurrentFrame (line 43) | public Zframe getCurrentFrame() {
    method createFrame (line 47) | public Zframe createFrame(int maxLocals, int maxStack) {
    method createFrame (line 51) | public Zframe createFrame(Zmethod method) {
    method isStackEmpty (line 55) | public boolean isStackEmpty() {
    method clearStack (line 59) | public void clearStack() {
    method getFrames (line 65) | public Zframe[] getFrames() {

FILE: Java/src/runtimedata/heap/AccessFlag.java
  class AccessFlag (line 9) | public class AccessFlag {

FILE: Java/src/runtimedata/heap/ClassMember.java
  class ClassMember (line 12) | public class ClassMember {
    method ClassMember (line 18) | public ClassMember(Zclass clazz, MemberInfo classFileMemberInfo) {
    method copyMemberInfo (line 28) | private void copyMemberInfo(MemberInfo memberInfo) {
    method isPublic (line 35) | public boolean isPublic() {
    method isPrivate (line 39) | public boolean isPrivate() {
    method isProtected (line 43) | public boolean isProtected() {
    method isStatic (line 47) | public boolean isStatic() {
    method isFinal (line 51) | public boolean isFinal() {
    method isSynthetic (line 55) | public boolean isSynthetic() {
    method getName (line 59) | public String getName() {
    method getDescriptor (line 63) | public String getDescriptor() {
    method getClazz (line 67) | public Zclass getClazz() {
    method isAccessTo (line 71) | public boolean isAccessTo(Zclass d) {
    method getAccessFlags (line 87) | public int getAccessFlags() {
    method setClazz (line 92) | public void setClazz(Zclass clazz) {

FILE: Java/src/runtimedata/heap/ClassNameHelper.java
  class ClassNameHelper (line 10) | public class ClassNameHelper {
    method getArrayClassName (line 29) | public static String getArrayClassName(String className) {
    method getComponentClassName (line 36) | public static String getComponentClassName(String className) {
    method toDescriptor (line 47) | private static String toDescriptor(String className) {
    method toClassName (line 63) | private static String toClassName(String descriptor) {

FILE: Java/src/runtimedata/heap/ClassRef.java
  class ClassRef (line 10) | public class ClassRef extends SymRef {
    method ClassRef (line 11) | public ClassRef(RuntimeConstantPool runtimeConstantPool, ConstantClass...

FILE: Java/src/runtimedata/heap/ExceptionTable.java
  class ExceptionTable (line 9) | public class ExceptionTable {
    method ExceptionTable (line 12) | public ExceptionTable(CodeAttribute.ExceptionTableEntry[] entry, Runti...
    method getCatchType (line 24) | public ClassRef getCatchType(int index, RuntimeConstantPool runtimeCon...
    method findExceptionHandler (line 33) | public ExceptionHandler findExceptionHandler(Zclass exClazz, int pc) {
  class ExceptionHandler (line 52) | class ExceptionHandler {

FILE: Java/src/runtimedata/heap/FieldRef.java
  class FieldRef (line 10) | public class FieldRef extends MemberRef {
    method FieldRef (line 13) | public FieldRef(RuntimeConstantPool runtimeConstantPool, ConstantField...
    method resolvedField (line 19) | public Zfield resolvedField() {
    method resolvedRefField (line 27) | public void resolvedRefField() {
    method lookupField (line 44) | private Zfield lookupField(Zclass c, String name, String descriptor) {

FILE: Java/src/runtimedata/heap/InterfaceMethodRef.java
  class InterfaceMethodRef (line 11) | public class InterfaceMethodRef extends MemberRef {
    method InterfaceMethodRef (line 14) | public InterfaceMethodRef(RuntimeConstantPool runtimeConstantPool, Con...
    method resolvedInterfaceMethod (line 20) | public Zmethod resolvedInterfaceMethod() {
    method resolveInterfaceMethodRef (line 27) | private void resolveInterfaceMethodRef() {
    method lookupInterfaceMethod (line 47) | private Zmethod lookupInterfaceMethod(Zclass iface, String name, Strin...

FILE: Java/src/runtimedata/heap/MemberRef.java
  class MemberRef (line 11) | public class MemberRef extends SymRef {
    method MemberRef (line 15) | public MemberRef(RuntimeConstantPool runtimeConstantPool) {
    method copyMemberRefInfo (line 19) | void copyMemberRefInfo(ConstantMemberRefInfo refInfo) {
    method getName (line 25) | public String getName() {
    method getDescriptor (line 29) | public String getDescriptor() {

FILE: Java/src/runtimedata/heap/MethodDescriptor.java
  class MethodDescriptor (line 9) | public class MethodDescriptor {
    method MethodDescriptor (line 16) | public MethodDescriptor(String raw) {
    method addParameterType (line 22) | private void addParameterType(String type) {
    method parse (line 26) | private void parse() {
    method startParams (line 35) | private void startParams() {
    method endParams (line 43) | private void endParams() {
    method finish (line 50) | private void finish() {
    method causePanic (line 57) | private void causePanic() {
    method readChar (line 63) | private char readChar() {
    method unreadChar (line 70) | private void unreadChar() {
    method parseParamTypes (line 76) | private void parseParamTypes() {
    method parseReturnType (line 88) | private void parseReturnType() {
    method parseFieldType (line 105) | private String parseFieldType() {
    method parseObjectType (line 135) | private String parseObjectType() {
    method parseArrayType (line 149) | private String parseArrayType() {
    method getParameterTypes (line 157) | public ArrayList<String> getParameterTypes() {
    method getReturnType (line 161) | public String getReturnType() {

FILE: Java/src/runtimedata/heap/MethodLookup.java
  class MethodLookup (line 7) | public class MethodLookup {
    method lookupMethodInClass (line 8) | public static Zmethod lookupMethodInClass(Zclass clazz, String name, S...
    method lookupMethodInInterfaces (line 21) | public static Zmethod lookupMethodInInterfaces(Zclass[] ifaces, String...

FILE: Java/src/runtimedata/heap/MethodRef.java
  class MethodRef (line 10) | public class MethodRef extends MemberRef {
    method MethodRef (line 13) | public MethodRef(RuntimeConstantPool runtimeConstantPool, ConstantMeth...
    method resolvedMethod (line 19) | public Zmethod resolvedMethod() {
    method resolvedRefMethod (line 27) | public void resolvedRefMethod() {
    method lookupMethod (line 48) | private Zmethod lookupMethod(Zclass c, String name, String descriptor) {

FILE: Java/src/runtimedata/heap/RuntimeConstantInfo.java
  class RuntimeConstantInfo (line 11) | public class RuntimeConstantInfo<T> {
    method RuntimeConstantInfo (line 15) | RuntimeConstantInfo(T value,int type){
    method getValue (line 20) | public T getValue(){
    method getType (line 24) | public int getType() {

FILE: Java/src/runtimedata/heap/RuntimeConstantPool.java
  class RuntimeConstantPool (line 22) | public class RuntimeConstantPool {
    method RuntimeConstantPool (line 28) | public RuntimeConstantPool(Zclass clazz, ConstantPool classFileConstan...
    method getRuntimeConstant (line 85) | public RuntimeConstantInfo getRuntimeConstant(int index) {

FILE: Java/src/runtimedata/heap/StringPool.java
  class StringPool (line 11) | public class StringPool {
    method jString (line 15) | public static Zobject jString(ZclassLoader loader, String str) {
    method realString (line 44) | public static String realString(Zobject jStr) {

FILE: Java/src/runtimedata/heap/SymRef.java
  class SymRef (line 9) | public class SymRef {
    method SymRef (line 14) | public SymRef(RuntimeConstantPool runtimeConstantPool) {
    method resolvedClass (line 19) | public Zclass resolvedClass() {
    method resolvedClassRef (line 27) | private void resolvedClassRef() {

FILE: Java/src/runtimedata/heap/Zclass.java
  class Zclass (line 13) | public class Zclass {
    method Zclass (line 31) | public Zclass(ClassFile classFile) {
    method Zclass (line 43) | public Zclass(int accessFlags, String thisClassName, ZclassLoader loader,
    method getRuntimeConstantPool (line 53) | public RuntimeConstantPool getRuntimeConstantPool() {
    method getLoader (line 57) | public ZclassLoader getLoader() {
    method getSuperClass (line 61) | public Zclass getSuperClass() {
    method isInitStarted (line 65) | public boolean isInitStarted() {
    method startInit (line 69) | public void startInit() {
    method isPublic (line 74) | public boolean isPublic() {
    method isFinal (line 78) | public boolean isFinal() {
    method isSuper (line 82) | public boolean isSuper() {
    method isInterface (line 86) | public boolean isInterface() {
    method isAbstract (line 90) | public boolean isAbstract() {
    method isSynthetic (line 94) | public boolean isSynthetic() {
    method isAnnotation (line 98) | public boolean isAnnotation() {
    method isEnum (line 102) | public boolean isEnum() {
    method isAccessibleTo (line 106) | public boolean isAccessibleTo(Zclass other) {
    method getStaticVars (line 110) | public Slots getStaticVars() {
    method getPackageName (line 114) | public String getPackageName() {
    method getJavaName (line 122) | public String getJavaName() {
    method isSubClassOf (line 126) | public boolean isSubClassOf(Zclass parent) {
    method isSuperClassOf (line 135) | public boolean isSuperClassOf(Zclass sub) {
    method isSubInterfaceOf (line 142) | public boolean isSubInterfaceOf(Zclass iface) {
    method isSuperInterfaceOf (line 151) | private boolean isSuperInterfaceOf(Zclass source) {
    method isImplements (line 155) | public boolean isImplements(Zclass iface) {
    method isAssignableFrom (line 167) | public boolean isAssignableFrom(Zclass source) {
    method isJlObject (line 210) | public boolean isJlObject() {
    method isJlCloneable (line 214) | public boolean isJlCloneable() {
    method isJioSerializable (line 218) | public boolean isJioSerializable() {
    method newObject (line 222) | public Zobject newObject() {
    method arrayClass (line 226) | public Zclass arrayClass() {
    method getMethod (line 232) | public Zmethod getMethod(String name, String desc) {
    method getField (line 243) | public Zfield getField(String name, String descriptor, boolean isStati...
    method isArray (line 257) | public boolean isArray() {
    method newArray (line 261) | public Zobject newArray(int count) {
    method getComponentClass (line 287) | public Zclass getComponentClass() {
    method setjObject (line 292) | public void setjObject(Zobject jObject) {
    method getjObject (line 296) | public Zobject getjObject() {
    method getSourceFile (line 300) | public String getSourceFile() {

FILE: Java/src/runtimedata/heap/ZclassLoader.java
  class ZclassLoader (line 15) | public class ZclassLoader {
    method ZclassLoader (line 19) | public ZclassLoader(ClassPath classPath) {
    method loadBasicClasses (line 27) | private void loadBasicClasses() {
    method loadPrimitiveClasses (line 42) | private void loadPrimitiveClasses() {
    method loadPrimitiveClass (line 55) | private void loadPrimitiveClass(String className) {
    method loadClass (line 66) | public Zclass loadClass(String name) {
    method loadArrayClass (line 88) | private Zclass loadArrayClass(String name) {
    method loadNonArrayClass (line 96) | private Zclass loadNonArrayClass(String name) {
    method readClass (line 110) | private byte[] readClass(String name) {
    method defineClass (line 126) | private Zclass defineClass(byte[] data) {
    method parseClass (line 135) | private Zclass parseClass(byte[] data) {
    method resolveSuperClass (line 142) | private void resolveSuperClass(Zclass clazz) {
    method resolveInterfaces (line 150) | private void resolveInterfaces(Zclass clazz) {
    method link (line 159) | private void link(Zclass clazz) {
    method verify (line 165) | private void verify(Zclass clazz) {
    method prepare (line 169) | private void prepare(Zclass clazz) {
    method calcInstanceFieldSlotIds (line 177) | private void calcInstanceFieldSlotIds(Zclass clazz) {
    method calcStaticFieldSlotIds (line 197) | private void calcStaticFieldSlotIds(Zclass clazz) {
    method allocAndInitStaticVars (line 213) | private void allocAndInitStaticVars(Zclass clazz) {
    method initStaticFinalVar (line 224) | private void initStaticFinalVar(Zclass clazz, Zfield zfield) {

FILE: Java/src/runtimedata/heap/Zfield.java
  class Zfield (line 11) | public class Zfield extends ClassMember {
    method Zfield (line 19) | private Zfield(Zclass clazz, MemberInfo classFileField) {
    method makeFields (line 25) | public static Zfield[] makeFields(Zclass zclass, MemberInfo[] cfFields) {
    method copyAttributes (line 35) | public void copyAttributes(MemberInfo classFileField) {
    method isVolatile (line 42) | public boolean isVolatile() {
    method isTransient (line 46) | public boolean isTransient() {
    method isEnum (line 50) | public boolean isEnum() {
    method getConstValueIndex (line 55) | public int getConstValueIndex() {
    method getSlotId (line 59) | public int getSlotId() {
    method isLongOrDouble (line 63) | public boolean isLongOrDouble() {

FILE: Java/src/runtimedata/heap/Zmethod.java
  class Zmethod (line 15) | public class Zmethod extends ClassMember {
    method Zmethod (line 25) | private Zmethod(Zclass clazz, MemberInfo classFileMethod) {
    method copyAttributes (line 36) | private void copyAttributes(MemberInfo classFileMethod) {
    method calcArgSlotCount (line 50) | private int calcArgSlotCount(ArrayList<String> args) {
    method injectCodeAttribute (line 69) | private void injectCodeAttribute(String returnType) {
    method makeMethods (line 99) | public static Zmethod[] makeMethods(Zclass zclass, MemberInfo[] classF...
    method isSynchronized (line 109) | public boolean isSynchronized() {
    method isBridge (line 113) | public boolean isBridge() {
    method isVarargs (line 117) | public boolean isVarargs() {
    method isNative (line 121) | public boolean isNative() {
    method isAbstract (line 125) | public boolean isAbstract() {
    method isStrict (line 129) | public boolean isStrict() {
    method getMaxStack (line 133) | public int getMaxStack() {
    method getMaxLocals (line 137) | public int getMaxLocals() {
    method getCode (line 141) | public byte[] getCode() {
    method getArgSlotCount (line 145) | public int getArgSlotCount() {
    method findExceptionHandler (line 151) | public int findExceptionHandler(Zclass exClazz, int pc) {
    method getExceptionTypes (line 159) | public Zclass[] getExceptionTypes() {
    method getLineNumber (line 177) | public int getLineNumber(int pc) {

FILE: Java/src/runtimedata/heap/Zobject.java
  class Zobject (line 10) | public class Zobject {
    method Zobject (line 19) | public Zobject(Zclass clazz) {
    method Zobject (line 24) | public Zobject(Zclass clazz, Object data, Object extra) {
    method getFields (line 30) | public Slots getFields() {
    method getClazz (line 34) | public Zclass getClazz() {
    method isInstanceOf (line 39) | public boolean isInstanceOf(Zclass target) {
    method getBytes (line 44) | public byte[] getBytes() {
    method getChars (line 48) | public char[] getChars() {
    method getShorts (line 52) | public short[] getShorts() {
    method getInts (line 56) | public int[] getInts() {
    method getLongs (line 60) | public long[] getLongs() {
    method getFloats (line 64) | public float[] getFloats() {
    method getDoubles (line 68) | public double[] getDoubles() {
    method getRefs (line 72) | public Zobject[] getRefs() {
    method getArrayLen (line 76) | public int getArrayLen() {
    method getRefVar (line 101) | public Zobject getRefVar(String name, String descriptor) {
    method setRefVar (line 107) | public void setRefVar(String name, String descriptor, Zobject ref) {
    method getIntVar (line 113) | public int getIntVar(String name, String descriptor) {
    method setIntVar (line 119) | public void setIntVar(String name, String descriptor, int val) {
    method getLongVar (line 125) | public long getLongVar(String name, String descriptor) {
    method setLongVar (line 131) | public void setLongVar(String name, String descriptor, long val) {
    method getFloatVar (line 137) | public float getFloatVar(String name, String descriptor) {
    method setFloatVar (line 143) | public void setFloatVar(String name, String descriptor, float val) {
    method getDoubleVar (line 149) | public double getDoubleVar(String name, String descriptor) {
    method setDoubleVar (line 155) | public void setDoubleVar(String name, String descriptor, double val) {

FILE: Java/src/test/TestClassFile03.java
  class TestClassFile03 (line 18) | public class TestClassFile03 {
    method main (line 19) | public static void main(String[] args) {

FILE: Java/src/test/TestClassLoader07.java
  class TestClassLoader07 (line 20) | public class TestClassLoader07 {
    method main (line 21) | public static void main(String[] args) {
    method test (line 70) | public static int test() {

FILE: Java/src/test/TestClassPath02.java
  class TestClassPath02 (line 17) | public class TestClassPath02 {
    method main (line 18) | public static void main(String[] args) {

FILE: Java/src/test/TestCmd01.java
  class TestCmd01 (line 11) | public class TestCmd01 {
    method main (line 12) | public static void main(String[] args) {

FILE: Java/src/test/TestException12.java
  class TestException12 (line 19) | public class TestException12 {
    method main (line 20) | public static void main(String[] args) {
    method test (line 72) | public static void test() {
    method f1 (line 81) | public static void f1() {

FILE: Java/src/test/TestGetClass11.java
  class TestGetClass11 (line 19) | public class TestGetClass11 {
    method main (line 20) | public static void main(String[] args) {
    method test (line 72) | public static void test() {

FILE: Java/src/test/TestInterpreter06.java
  class TestInterpreter06 (line 20) | public class TestInterpreter06 {
    method main (line 21) | public static void main(String[] args) {
    method test (line 85) | public static int test() {

FILE: Java/src/test/TestInvokeMethod08.java
  class TestInvokeMethod08 (line 20) | public class TestInvokeMethod08 implements Runnable {
    method main (line 21) | public static void main(String[] args) {
    method test (line 81) | public static int test() {
    method staticMethod (line 92) | public static int staticMethod(int n) {
    method instanceMethod (line 99) | private void instanceMethod() {
    method run (line 102) | @Override

FILE: Java/src/test/TestLocalVars04.java
  class TestLocalVars04 (line 9) | public class TestLocalVars04 {
    method main (line 11) | public static void main(String[] args) {

FILE: Java/src/test/TestNewArray09.java
  class TestNewArray09 (line 20) | public class TestNewArray09 {
    method main (line 21) | public static void main(String[] args) {
    method test (line 69) | public static void test() {

FILE: Java/src/test/TestOperandStack05.java
  class TestOperandStack05 (line 9) | public class TestOperandStack05 {
    method main (line 10) | public static void main(String[] args) {

FILE: Java/src/test/TestStringPool10.java
  class TestStringPool10 (line 18) | public class TestStringPool10 {
    method main (line 19) | public static void main(String[] args) {
    method test (line 70) | public static void test() {

FILE: Java/src/znative/NativeMethod.java
  type NativeMethod (line 10) | public interface NativeMethod {
    method run (line 11) | public void run(Zframe frame);

FILE: Java/src/znative/RegisterCenter.java
  class RegisterCenter (line 15) | public class RegisterCenter {
    method register (line 18) | public static void register(String className, String methodName, Strin...
    method findNativeMethod (line 23) | public static NativeMethod findNativeMethod(String className, String m...
    method init (line 45) | public static void init() {

FILE: Java/src/znative/java/lang/NStackTraceElement.java
  class NStackTraceElement (line 9) | public class NStackTraceElement {
    method NStackTraceElement (line 15) | public NStackTraceElement(String fileName, String className, String me...
    method toString (line 22) | @Override

FILE: Java/src/znative/java/lang/Nclass.java
  class Nclass (line 14) | public class Nclass {
    class getPrimitiveClass (line 19) | public static class getPrimitiveClass implements NativeMethod {
      method run (line 20) | @Override
    class getName0 (line 30) | public static class getName0 implements NativeMethod {
      method run (line 31) | @Override
    class desiredAssertionStatus0 (line 41) | public static class desiredAssertionStatus0 implements NativeMethod {
      method run (line 42) | @Override
    class isArray (line 48) | public static class isArray implements NativeMethod {
      method run (line 49) | @Override

FILE: Java/src/znative/java/lang/Nobject.java
  class Nobject (line 14) | public class Nobject {
    class getClass (line 18) | public static class getClass implements NativeMethod {
      method run (line 20) | @Override

FILE: Java/src/znative/java/lang/Nthrowable.java
  class Nthrowable (line 15) | public class Nthrowable {
    class fillInStackTrace (line 17) | public static class fillInStackTrace implements NativeMethod {
      method run (line 18) | @Override
      method createStackTraceElements (line 29) | private NStackTraceElement[] createStackTraceElements(Zobject exObj,...
      method distanceToObject (line 46) | private int distanceToObject(Zclass exClazz) {
      method createStackTraceElement (line 56) | private NStackTraceElement createStackTraceElement(Zframe frame) {
Condensed preview — 299 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (389K chars).
[
  {
    "path": ".gitignore",
    "chars": 83,
    "preview": "*.iml\n/local.properties\n/.idea/\n/out\n.DS_Store\n/captures\n/Java/src/help.java\n/tmp\n\n"
  },
  {
    "path": "Java/src/Main.java",
    "chars": 229,
    "preview": "/**\n * Author: zhangxin\n * Time: 2017/4/30 0030.\n * Desc:\n */\npublic class Main {\n    public static void main(String[] a"
  },
  {
    "path": "Java/src/Utils/ByteUtils.java",
    "chars": 2062,
    "preview": "package Utils;\n\n/**\n * Author: zhangxin\n * Time: 2017/5/2 0002.\n * Desc:\n */\npublic class ByteUtils {\n\n\n    public stati"
  },
  {
    "path": "Java/src/Utils/Cmd.java",
    "chars": 3370,
    "preview": "package Utils;\n\n/**\n * Author: zhangxin\n * Time: 2017/4/30 0030.\n * Desc:Cmd解析程序\n */\npublic class Cmd {\n\n    private boo"
  },
  {
    "path": "Java/src/classfile/ClassFile.java",
    "chars": 3955,
    "preview": "package classfile;\n\nimport Utils.ByteUtils;\nimport classfile.attribute.AttributeInfo;\nimport classfile.attribute.SourceF"
  },
  {
    "path": "Java/src/classfile/ClassReader.java",
    "chars": 1770,
    "preview": "package classfile;\n\nimport Utils.ByteUtils;\n\n/**\n * Author: zhangxin\n * Time: 2017/5/2 0002.\n * Desc: 封装的读取 class 字节码文件的"
  },
  {
    "path": "Java/src/classfile/ConstantPool.java",
    "chars": 2883,
    "preview": "package classfile;\n\nimport classfile.classconstant.*;\n\n/**\n * Author: zhangxin\n * Time: 2017/5/2 0002.\n * Desc: 常量池实际上也是"
  },
  {
    "path": "Java/src/classfile/MemberInfo.java",
    "chars": 2472,
    "preview": "package classfile;\n\nimport classfile.attribute.AttributeInfo;\nimport classfile.attribute.CodeAttribute;\nimport classfile"
  },
  {
    "path": "Java/src/classfile/attribute/AttributeInfo.java",
    "chars": 2870,
    "preview": "package classfile.attribute;\n\nimport Utils.ByteUtils;\nimport classfile.ClassReader;\nimport classfile.ConstantPool;\n\n/**\n"
  },
  {
    "path": "Java/src/classfile/attribute/CodeAttribute.java",
    "chars": 3155,
    "preview": "package classfile.attribute;\n\nimport Utils.ByteUtils;\nimport classfile.ClassReader;\nimport classfile.ConstantPool;\n\n/**\n"
  },
  {
    "path": "Java/src/classfile/attribute/ConstantValueAttribute.java",
    "chars": 968,
    "preview": "package classfile.attribute;\n\nimport classfile.ClassReader;\n\n/**\n * Author: zhangxin\n * Time: 2017/5/3 0003.\n * Desc:Con"
  },
  {
    "path": "Java/src/classfile/attribute/DeprecatedAttribute.java",
    "chars": 412,
    "preview": "package classfile.attribute;\n\nimport classfile.ClassReader;\n\n/**\n * Author: zhangxin\n * Time: 2017/5/3 0003.\n * Desc:仅起标"
  },
  {
    "path": "Java/src/classfile/attribute/ExceptionsAttribute.java",
    "chars": 592,
    "preview": "package classfile.attribute;\n\nimport classfile.ClassReader;\n\n/**\n * Author: zhangxin\n * Time: 2017/5/3 0003.\n * Desc: Ex"
  },
  {
    "path": "Java/src/classfile/attribute/LineNumberTableAttribute.java",
    "chars": 1505,
    "preview": "package classfile.attribute;\n\nimport classfile.ClassReader;\n\n/**\n * Author: zhangxin\n * Time: 2017/5/3 0003.\n * Desc: Li"
  },
  {
    "path": "Java/src/classfile/attribute/LocalVariableTableAttribute.java",
    "chars": 1654,
    "preview": "package classfile.attribute;\n\nimport classfile.ClassReader;\n\n/**\n * Author: zhangxin\n * Time: 2017/5/3 0003.\n * Desc: 用于"
  },
  {
    "path": "Java/src/classfile/attribute/SourceFileAttribute.java",
    "chars": 804,
    "preview": "package classfile.attribute;\n\nimport classfile.ClassReader;\nimport classfile.ConstantPool;\n\n/**\n * Author: zhangxin\n * T"
  },
  {
    "path": "Java/src/classfile/attribute/SyntheticAttribute.java",
    "chars": 426,
    "preview": "package classfile.attribute;\n\nimport classfile.ClassReader;\n\n/**\n * Author: zhangxin\n * Time: 2017/5/3 0003.\n * Desc:仅起标"
  },
  {
    "path": "Java/src/classfile/attribute/UnparsedAttribute.java",
    "chars": 547,
    "preview": "package classfile.attribute;\n\nimport classfile.ClassReader;\n\n/**\n * Author: zhangxin\n * Time: 2017/5/3 0003.\n * Desc: 由于"
  },
  {
    "path": "Java/src/classfile/classconstant/ConstantClassInfo.java",
    "chars": 874,
    "preview": "package classfile.classconstant;\n\nimport classfile.ClassReader;\nimport classfile.ConstantPool;\n\n/**\n * Author: zhangxin\n"
  },
  {
    "path": "Java/src/classfile/classconstant/ConstantDoubleInfo.java",
    "chars": 493,
    "preview": "package classfile.classconstant;\n\nimport Utils.ByteUtils;\nimport classfile.ClassReader;\n\n/**\n * Author: zhangxin\n * Time"
  },
  {
    "path": "Java/src/classfile/classconstant/ConstantFieldRefInfo.java",
    "chars": 312,
    "preview": "package classfile.classconstant;\n\nimport classfile.ConstantPool;\n\n/**\n * Author: zhangxin\n * Time: 2017/5/3 0003.\n * Des"
  },
  {
    "path": "Java/src/classfile/classconstant/ConstantFloatInfo.java",
    "chars": 488,
    "preview": "package classfile.classconstant;\n\nimport Utils.ByteUtils;\nimport classfile.ClassReader;\n\n/**\n * Author: zhangxin\n * Time"
  },
  {
    "path": "Java/src/classfile/classconstant/ConstantInfo.java",
    "chars": 3104,
    "preview": "package classfile.classconstant;\n\nimport classfile.ClassReader;\nimport classfile.ConstantPool;\n\n/**\n * Author: zhangxin\n"
  },
  {
    "path": "Java/src/classfile/classconstant/ConstantIntegerInfo.java",
    "chars": 599,
    "preview": "package classfile.classconstant;\n\nimport Utils.ByteUtils;\nimport classfile.ClassReader;\n\n/**\n * Author: zhangxin\n * Time"
  },
  {
    "path": "Java/src/classfile/classconstant/ConstantInterfaceMethodRefInfo.java",
    "chars": 336,
    "preview": "package classfile.classconstant;\n\nimport classfile.ConstantPool;\n\n/**\n * Author: zhangxin\n * Time: 2017/5/3 0003.\n * Des"
  },
  {
    "path": "Java/src/classfile/classconstant/ConstantInvokeDynamicInfo.java",
    "chars": 486,
    "preview": "package classfile.classconstant;\n\nimport classfile.ClassReader;\n\n/**\n * Author: zhangxin\n * Time: 2017/5/2 0002.\n * Desc"
  },
  {
    "path": "Java/src/classfile/classconstant/ConstantLongInfo.java",
    "chars": 591,
    "preview": "package classfile.classconstant;\n\nimport Utils.ByteUtils;\nimport classfile.ClassReader;\n\n/**\n * Author: zhangxin\n * Time"
  },
  {
    "path": "Java/src/classfile/classconstant/ConstantMemberRefInfo.java",
    "chars": 1621,
    "preview": "package classfile.classconstant;\n\nimport classfile.ClassReader;\nimport classfile.ConstantPool;\n\n/**\n * Author: zhangxin\n"
  },
  {
    "path": "Java/src/classfile/classconstant/ConstantMethodHandleInfo.java",
    "chars": 680,
    "preview": "package classfile.classconstant;\n\nimport classfile.ClassReader;\n\n/**\n * Author: zhangxin\n * Time: 2017/5/2 0002.\n * Desc"
  },
  {
    "path": "Java/src/classfile/classconstant/ConstantMethodRefInfo.java",
    "chars": 316,
    "preview": "package classfile.classconstant;\n\nimport classfile.ConstantPool;\n\n/**\n * Author: zhangxin\n * Time: 2017/5/3 0003.\n * Des"
  },
  {
    "path": "Java/src/classfile/classconstant/ConstantMethodTypeInfo.java",
    "chars": 518,
    "preview": "package classfile.classconstant;\n\nimport classfile.ClassReader;\n\n/**\n * Author: zhangxin\n * Time: 2017/5/2 0002.\n * Desc"
  },
  {
    "path": "Java/src/classfile/classconstant/ConstantNameAndTypeInfo.java",
    "chars": 1144,
    "preview": "package classfile.classconstant;\n\nimport classfile.ClassReader;\n\n/**\n * Author: zhangxin\n * Time: 2017/5/2 0002.\n * Desc"
  },
  {
    "path": "Java/src/classfile/classconstant/ConstantStringInfo.java",
    "chars": 714,
    "preview": "package classfile.classconstant;\n\nimport classfile.ClassReader;\nimport classfile.ConstantPool;\n\n/**\n * Author: zhangxin\n"
  },
  {
    "path": "Java/src/classfile/classconstant/ConstantUtf8Info.java",
    "chars": 6607,
    "preview": "package classfile.classconstant;\n\nimport classfile.ClassReader;\n\nimport java.io.IOException;\nimport java.io.UTFDataForma"
  },
  {
    "path": "Java/src/classpath/ClassPath.java",
    "chars": 3175,
    "preview": "package classpath;\n\nimport java.io.File;\nimport java.io.IOException;\n\nimport static classpath.Entry.createEntry;\n\n/**\n *"
  },
  {
    "path": "Java/src/classpath/CompositeEntry.java",
    "chars": 1319,
    "preview": "package classpath;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\n\n/**\n * Author: zhangxin\n * Time: 2017/4/30 "
  },
  {
    "path": "Java/src/classpath/DirEntry.java",
    "chars": 2172,
    "preview": "package classpath;\n\nimport java.io.*;\n\n/**\n * Author: zhangxin\n * Time: 2017/4/30 0030.\n * Desc: 表示目录形式的类路径,这是相对来说最简单的一种"
  },
  {
    "path": "Java/src/classpath/Entry.java",
    "chars": 1675,
    "preview": "package classpath;\n\nimport java.io.File;\nimport java.io.IOException;\n\n/**\n * Author: zhangxin\n * Time: 2017/4/30 0030.\n "
  },
  {
    "path": "Java/src/classpath/WildcardEntry.java",
    "chars": 1144,
    "preview": "package classpath;\n\nimport java.io.File;\nimport java.util.ArrayList;\n\n/**\n * Author: zhangxin\n * Time: 2017/4/30 0030.\n "
  },
  {
    "path": "Java/src/classpath/ZipJarEntry.java",
    "chars": 2285,
    "preview": "package classpath;\n\nimport java.io.*;\nimport java.util.zip.ZipEntry;\nimport java.util.zip.ZipFile;\nimport java.util.zip."
  },
  {
    "path": "Java/src/instructions/InstructionFactory.java",
    "chars": 20671,
    "preview": "package instructions;\n\nimport instructions.base.Instruction;\nimport instructions.comparisons.dcmp.DCMPG;\nimport instruct"
  },
  {
    "path": "Java/src/instructions/base/BranchInstruction.java",
    "chars": 424,
    "preview": "package instructions.base;\n\n/**\n * Author: zhangxin\n * Time: 2017/5/5 0005.\n * Desc:表示跳转指令,Offset字段存放跳转偏移量。\n * 这个类是指令的子类"
  },
  {
    "path": "Java/src/instructions/base/BranchLogic.java",
    "chars": 358,
    "preview": "package instructions.base;\n\nimport runtimedata.Zframe;\n\n/**\n * Author: zhangxin\n * Time: 2017/5/5 0005.\n * Desc: 真正的跳转逻辑"
  },
  {
    "path": "Java/src/instructions/base/BytecodeReader.java",
    "chars": 1433,
    "preview": "package instructions.base;\n\nimport Utils.ByteUtils;\n\n/**\n * Author: zhangxin\n * Time: 2017/5/5 0005.\n * Desc:\n */\npublic"
  },
  {
    "path": "Java/src/instructions/base/ClassInitLogic.java",
    "chars": 1065,
    "preview": "package instructions.base;\n\nimport runtimedata.Zframe;\nimport runtimedata.Zthread;\nimport runtimedata.heap.Zclass;\nimpor"
  },
  {
    "path": "Java/src/instructions/base/Index16Instruction.java",
    "chars": 323,
    "preview": "package instructions.base;\n\n/**\n * Author: zhangxin\n * Time: 2017/5/5 0005.\n * Desc:有一些指令需要访问运行时常量池,常量池索引由两字节操作数给出。\n */\n"
  },
  {
    "path": "Java/src/instructions/base/Index8Instruction.java",
    "chars": 447,
    "preview": "package instructions.base;\n\n/**\n * Author: zhangxin\n * Time: 2017/5/5 0005.\n * Desc:存储和加载类指令需要根据索引存取局部变量表,索引由单字节操作数给出\n *"
  },
  {
    "path": "Java/src/instructions/base/Instruction.java",
    "chars": 303,
    "preview": "package instructions.base;\n\nimport runtimedata.Zframe;\n\n/**\n * Author: zhangxin\n * Time: 2017/5/5 0005.\n * Desc: 每个指令都会实"
  },
  {
    "path": "Java/src/instructions/base/MethodInvokeLogic.java",
    "chars": 741,
    "preview": "package instructions.base;\n\nimport runtimedata.Slot;\nimport runtimedata.Zframe;\nimport runtimedata.Zthread;\nimport runti"
  },
  {
    "path": "Java/src/instructions/base/NoOperandsInstruction.java",
    "chars": 286,
    "preview": "package instructions.base;\n\n/**\n * Author: zhangxin\n * Time: 2017/5/5 0005.\n * Desc:表示没有操作数的指令,所以没有定义 任何字段。FetchOperands"
  },
  {
    "path": "Java/src/instructions/comparisons/dcmp/DCMP.java",
    "chars": 844,
    "preview": "package instructions.comparisons.dcmp;\n\nimport runtimedata.OperandStack;\nimport runtimedata.Zframe;\n\n/**\n * Author: zhan"
  },
  {
    "path": "Java/src/instructions/comparisons/dcmp/DCMPG.java",
    "chars": 366,
    "preview": "package instructions.comparisons.dcmp;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.comparisons."
  },
  {
    "path": "Java/src/instructions/comparisons/dcmp/DCMPL.java",
    "chars": 324,
    "preview": "package instructions.comparisons.dcmp;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\n\n/**\n"
  },
  {
    "path": "Java/src/instructions/comparisons/fcmp/FCMP.java",
    "chars": 840,
    "preview": "package instructions.comparisons.fcmp;\n\nimport runtimedata.OperandStack;\nimport runtimedata.Zframe;\n\n/**\n * Author: zhan"
  },
  {
    "path": "Java/src/instructions/comparisons/fcmp/FCMPG.java",
    "chars": 323,
    "preview": "package instructions.comparisons.fcmp;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\n\n/**\n"
  },
  {
    "path": "Java/src/instructions/comparisons/fcmp/FCMPL.java",
    "chars": 324,
    "preview": "package instructions.comparisons.fcmp;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\n\n/**\n"
  },
  {
    "path": "Java/src/instructions/comparisons/ifacmp/IF_ACMPEQ.java",
    "chars": 418,
    "preview": "package instructions.comparisons.ifacmp;\n\nimport instructions.base.BranchInstruction;\nimport instructions.base.BranchLog"
  },
  {
    "path": "Java/src/instructions/comparisons/ifacmp/IF_ACMPNE.java",
    "chars": 419,
    "preview": "package instructions.comparisons.ifacmp;\n\nimport instructions.base.BranchInstruction;\nimport instructions.base.BranchLog"
  },
  {
    "path": "Java/src/instructions/comparisons/ifacmp/IfAcmp.java",
    "chars": 436,
    "preview": "package instructions.comparisons.ifacmp;\n\nimport runtimedata.OperandStack;\nimport runtimedata.Zframe;\nimport runtimedata"
  },
  {
    "path": "Java/src/instructions/comparisons/ifcond/IFEQ.java",
    "chars": 454,
    "preview": "package instructions.comparisons.ifcond;\n\nimport instructions.base.BranchInstruction;\nimport instructions.base.BranchLog"
  },
  {
    "path": "Java/src/instructions/comparisons/ifcond/IFGE.java",
    "chars": 454,
    "preview": "package instructions.comparisons.ifcond;\n\nimport instructions.base.BranchInstruction;\nimport instructions.base.BranchLog"
  },
  {
    "path": "Java/src/instructions/comparisons/ifcond/IFGT.java",
    "chars": 453,
    "preview": "package instructions.comparisons.ifcond;\n\nimport instructions.base.BranchInstruction;\nimport instructions.base.BranchLog"
  },
  {
    "path": "Java/src/instructions/comparisons/ifcond/IFLE.java",
    "chars": 454,
    "preview": "package instructions.comparisons.ifcond;\n\nimport instructions.base.BranchInstruction;\nimport instructions.base.BranchLog"
  },
  {
    "path": "Java/src/instructions/comparisons/ifcond/IFLT.java",
    "chars": 453,
    "preview": "package instructions.comparisons.ifcond;\n\nimport instructions.base.BranchInstruction;\nimport instructions.base.BranchLog"
  },
  {
    "path": "Java/src/instructions/comparisons/ifcond/IFNE.java",
    "chars": 454,
    "preview": "package instructions.comparisons.ifcond;\n\nimport instructions.base.BranchInstruction;\nimport instructions.base.BranchLog"
  },
  {
    "path": "Java/src/instructions/comparisons/ificmp/IF_ICMPEQ.java",
    "chars": 509,
    "preview": "package instructions.comparisons.ificmp;\n\nimport instructions.base.BranchInstruction;\nimport instructions.base.BranchLog"
  },
  {
    "path": "Java/src/instructions/comparisons/ificmp/IF_ICMPGE.java",
    "chars": 508,
    "preview": "package instructions.comparisons.ificmp;\n\nimport instructions.base.BranchInstruction;\nimport instructions.base.BranchLog"
  },
  {
    "path": "Java/src/instructions/comparisons/ificmp/IF_ICMPGT.java",
    "chars": 508,
    "preview": "package instructions.comparisons.ificmp;\n\nimport instructions.base.BranchInstruction;\nimport instructions.base.BranchLog"
  },
  {
    "path": "Java/src/instructions/comparisons/ificmp/IF_ICMPLE.java",
    "chars": 509,
    "preview": "package instructions.comparisons.ificmp;\n\nimport instructions.base.BranchInstruction;\nimport instructions.base.BranchLog"
  },
  {
    "path": "Java/src/instructions/comparisons/ificmp/IF_ICMPLT.java",
    "chars": 509,
    "preview": "package instructions.comparisons.ificmp;\n\nimport instructions.base.BranchInstruction;\nimport instructions.base.BranchLog"
  },
  {
    "path": "Java/src/instructions/comparisons/ificmp/IF_ICMPNE.java",
    "chars": 508,
    "preview": "package instructions.comparisons.ificmp;\n\nimport instructions.base.BranchInstruction;\nimport instructions.base.BranchLog"
  },
  {
    "path": "Java/src/instructions/comparisons/ificmp/IfIcmp.java",
    "chars": 408,
    "preview": "package instructions.comparisons.ificmp;\n\nimport runtimedata.OperandStack;\nimport runtimedata.Zframe;\n\n/**\n * Author: zh"
  },
  {
    "path": "Java/src/instructions/comparisons/lcmp/LCMP.java",
    "chars": 630,
    "preview": "package instructions.comparisons.lcmp;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;"
  },
  {
    "path": "Java/src/instructions/constants/ACONST_NULL.java",
    "chars": 347,
    "preview": "package instructions.constants;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\n\n/**\n * Auth"
  },
  {
    "path": "Java/src/instructions/constants/BIPUSH.java",
    "chars": 608,
    "preview": "package instructions.constants;\n\nimport instructions.base.BytecodeReader;\nimport instructions.base.Instruction;\nimport r"
  },
  {
    "path": "Java/src/instructions/constants/DCONST_0.java",
    "chars": 347,
    "preview": "package instructions.constants;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\n\n/**\n * Auth"
  },
  {
    "path": "Java/src/instructions/constants/DCONST_1.java",
    "chars": 335,
    "preview": "package instructions.constants;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\n\n/**\n * Auth"
  },
  {
    "path": "Java/src/instructions/constants/FCONST_0.java",
    "chars": 346,
    "preview": "package instructions.constants;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\n\n/**\n * Auth"
  },
  {
    "path": "Java/src/instructions/constants/FCONST_1.java",
    "chars": 346,
    "preview": "package instructions.constants;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\n\n/**\n * Auth"
  },
  {
    "path": "Java/src/instructions/constants/FCONST_2.java",
    "chars": 346,
    "preview": "package instructions.constants;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\n\n/**\n * Auth"
  },
  {
    "path": "Java/src/instructions/constants/ICONST_0.java",
    "chars": 349,
    "preview": "package instructions.constants;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\n\n/**\n * Auth"
  },
  {
    "path": "Java/src/instructions/constants/ICONST_1.java",
    "chars": 349,
    "preview": "package instructions.constants;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\n\n/**\n * Auth"
  },
  {
    "path": "Java/src/instructions/constants/ICONST_2.java",
    "chars": 349,
    "preview": "package instructions.constants;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\n\n/**\n * Auth"
  },
  {
    "path": "Java/src/instructions/constants/ICONST_3.java",
    "chars": 349,
    "preview": "package instructions.constants;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\n\n/**\n * Auth"
  },
  {
    "path": "Java/src/instructions/constants/ICONST_4.java",
    "chars": 349,
    "preview": "package instructions.constants;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\n\n/**\n * Auth"
  },
  {
    "path": "Java/src/instructions/constants/ICONST_5.java",
    "chars": 349,
    "preview": "package instructions.constants;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\n\n/**\n * Auth"
  },
  {
    "path": "Java/src/instructions/constants/ICONST_M1.java",
    "chars": 351,
    "preview": "package instructions.constants;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\n\n/**\n * Auth"
  },
  {
    "path": "Java/src/instructions/constants/LCONST_0.java",
    "chars": 350,
    "preview": "package instructions.constants;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\n\n/**\n * Auth"
  },
  {
    "path": "Java/src/instructions/constants/LCONST_1.java",
    "chars": 350,
    "preview": "package instructions.constants;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\n\n/**\n * Auth"
  },
  {
    "path": "Java/src/instructions/constants/LDC.java",
    "chars": 1589,
    "preview": "package instructions.constants;\n\nimport classfile.classconstant.ConstantInfo;\nimport instructions.base.Index8Instruction"
  },
  {
    "path": "Java/src/instructions/constants/LDC2_W.java",
    "chars": 1111,
    "preview": "package instructions.constants;\n\nimport classfile.classconstant.ConstantInfo;\nimport instructions.base.Index16Instructio"
  },
  {
    "path": "Java/src/instructions/constants/LDC_W.java",
    "chars": 390,
    "preview": "package instructions.constants;\n\nimport instructions.base.BytecodeReader;\n\n/**\n * @author zachaxy\n * @date 17/12/26\n * d"
  },
  {
    "path": "Java/src/instructions/constants/NOP.java",
    "chars": 305,
    "preview": "package instructions.constants;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\n\n/**\n * Auth"
  },
  {
    "path": "Java/src/instructions/constants/SIPUSH.java",
    "chars": 536,
    "preview": "package instructions.constants;\n\nimport instructions.base.BytecodeReader;\nimport instructions.base.Instruction;\nimport r"
  },
  {
    "path": "Java/src/instructions/control/ARETURN.java",
    "chars": 623,
    "preview": "package instructions.control;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\nimport runtime"
  },
  {
    "path": "Java/src/instructions/control/DRETURN.java",
    "chars": 597,
    "preview": "package instructions.control;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\nimport runtime"
  },
  {
    "path": "Java/src/instructions/control/FRETURN.java",
    "chars": 593,
    "preview": "package instructions.control;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\nimport runtime"
  },
  {
    "path": "Java/src/instructions/control/GOTO.java",
    "chars": 352,
    "preview": "package instructions.control;\n\nimport instructions.base.BranchInstruction;\nimport instructions.base.BranchLogic;\nimport "
  },
  {
    "path": "Java/src/instructions/control/IRETURN.java",
    "chars": 663,
    "preview": "package instructions.control;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\nimport runtime"
  },
  {
    "path": "Java/src/instructions/control/LOOKUP_SWITCH.java",
    "chars": 1144,
    "preview": "package instructions.control;\n\nimport instructions.base.BranchLogic;\nimport instructions.base.BytecodeReader;\nimport ins"
  },
  {
    "path": "Java/src/instructions/control/LRETURN.java",
    "chars": 589,
    "preview": "package instructions.control;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\nimport runtime"
  },
  {
    "path": "Java/src/instructions/control/RETURN.java",
    "chars": 402,
    "preview": "package instructions.control;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.Zframe;\n\n/**\n * @autho"
  },
  {
    "path": "Java/src/instructions/control/TABLE_SWITCH.java",
    "chars": 1248,
    "preview": "package instructions.control;\n\nimport instructions.base.BranchLogic;\nimport instructions.base.BytecodeReader;\nimport ins"
  },
  {
    "path": "Java/src/instructions/conversions/d2x/D2F.java",
    "chars": 481,
    "preview": "package instructions.conversions.d2x;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\n"
  },
  {
    "path": "Java/src/instructions/conversions/d2x/D2I.java",
    "chars": 475,
    "preview": "package instructions.conversions.d2x;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\n"
  },
  {
    "path": "Java/src/instructions/conversions/d2x/D2L.java",
    "chars": 478,
    "preview": "package instructions.conversions.d2x;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\n"
  },
  {
    "path": "Java/src/instructions/conversions/f2x/F2D.java",
    "chars": 473,
    "preview": "package instructions.conversions.f2x;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\n"
  },
  {
    "path": "Java/src/instructions/conversions/f2x/F2I.java",
    "chars": 473,
    "preview": "package instructions.conversions.f2x;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\n"
  },
  {
    "path": "Java/src/instructions/conversions/f2x/F2L.java",
    "chars": 476,
    "preview": "package instructions.conversions.f2x;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\n"
  },
  {
    "path": "Java/src/instructions/conversions/i2x/I2B.java",
    "chars": 471,
    "preview": "package instructions.conversions.i2x;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\n"
  },
  {
    "path": "Java/src/instructions/conversions/i2x/I2C.java",
    "chars": 471,
    "preview": "package instructions.conversions.i2x;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\n"
  },
  {
    "path": "Java/src/instructions/conversions/i2x/I2D.java",
    "chars": 478,
    "preview": "package instructions.conversions.i2x;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\n"
  },
  {
    "path": "Java/src/instructions/conversions/i2x/I2F.java",
    "chars": 475,
    "preview": "package instructions.conversions.i2x;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\n"
  },
  {
    "path": "Java/src/instructions/conversions/i2x/I2L.java",
    "chars": 472,
    "preview": "package instructions.conversions.i2x;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\n"
  },
  {
    "path": "Java/src/instructions/conversions/i2x/I2S.java",
    "chars": 473,
    "preview": "package instructions.conversions.i2x;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\n"
  },
  {
    "path": "Java/src/instructions/conversions/l2x/L2D.java",
    "chars": 480,
    "preview": "package instructions.conversions.l2x;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\n"
  },
  {
    "path": "Java/src/instructions/conversions/l2x/L2F.java",
    "chars": 477,
    "preview": "package instructions.conversions.l2x;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\n"
  },
  {
    "path": "Java/src/instructions/conversions/l2x/L2I.java",
    "chars": 471,
    "preview": "package instructions.conversions.l2x;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\n"
  },
  {
    "path": "Java/src/instructions/extended/GOTO_W.java",
    "chars": 553,
    "preview": "package instructions.extended;\n\nimport instructions.base.BranchLogic;\nimport instructions.base.BytecodeReader;\nimport in"
  },
  {
    "path": "Java/src/instructions/extended/IFNONNULL.java",
    "chars": 489,
    "preview": "package instructions.extended;\n\nimport instructions.base.BranchInstruction;\nimport instructions.base.BranchLogic;\nimport"
  },
  {
    "path": "Java/src/instructions/extended/IFNULL.java",
    "chars": 486,
    "preview": "package instructions.extended;\n\nimport instructions.base.BranchInstruction;\nimport instructions.base.BranchLogic;\nimport"
  },
  {
    "path": "Java/src/instructions/extended/WIDE.java",
    "chars": 3394,
    "preview": "package instructions.extended;\n\nimport instructions.base.BytecodeReader;\nimport instructions.base.Instruction;\nimport in"
  },
  {
    "path": "Java/src/instructions/loads/Load.java",
    "chars": 1470,
    "preview": "package instructions.loads;\n\nimport runtimedata.Zframe;\nimport runtimedata.heap.Zobject;\n\n/**\n * Author: zhangxin\n * Tim"
  },
  {
    "path": "Java/src/instructions/loads/loaddouble/DLOAD.java",
    "chars": 347,
    "preview": "package instructions.loads.loaddouble;\n\nimport instructions.base.Index8Instruction;\nimport instructions.loads.Load;\nimpo"
  },
  {
    "path": "Java/src/instructions/loads/loaddouble/DLOAD_0.java",
    "chars": 353,
    "preview": "package instructions.loads.loaddouble;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\n"
  },
  {
    "path": "Java/src/instructions/loads/loaddouble/DLOAD_1.java",
    "chars": 353,
    "preview": "package instructions.loads.loaddouble;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\n"
  },
  {
    "path": "Java/src/instructions/loads/loaddouble/DLOAD_2.java",
    "chars": 353,
    "preview": "package instructions.loads.loaddouble;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\n"
  },
  {
    "path": "Java/src/instructions/loads/loaddouble/DLOAD_3.java",
    "chars": 354,
    "preview": "package instructions.loads.loaddouble;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\n"
  },
  {
    "path": "Java/src/instructions/loads/loadfloat/FLOAD.java",
    "chars": 346,
    "preview": "package instructions.loads.loadfloat;\n\nimport instructions.base.Index8Instruction;\nimport instructions.loads.Load;\nimpor"
  },
  {
    "path": "Java/src/instructions/loads/loadfloat/FLOAD_0.java",
    "chars": 352,
    "preview": "package instructions.loads.loadfloat;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\ni"
  },
  {
    "path": "Java/src/instructions/loads/loadfloat/FLOAD_1.java",
    "chars": 352,
    "preview": "package instructions.loads.loadfloat;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\ni"
  },
  {
    "path": "Java/src/instructions/loads/loadfloat/FLOAD_2.java",
    "chars": 352,
    "preview": "package instructions.loads.loadfloat;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\ni"
  },
  {
    "path": "Java/src/instructions/loads/loadfloat/FLOAD_3.java",
    "chars": 354,
    "preview": "package instructions.loads.loadfloat;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\ni"
  },
  {
    "path": "Java/src/instructions/loads/loadint/ILOAD.java",
    "chars": 344,
    "preview": "package instructions.loads.loadint;\n\nimport instructions.base.Index8Instruction;\nimport instructions.loads.Load;\nimport "
  },
  {
    "path": "Java/src/instructions/loads/loadint/ILOAD_0.java",
    "chars": 350,
    "preview": "package instructions.loads.loadint;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\nimp"
  },
  {
    "path": "Java/src/instructions/loads/loadint/ILOAD_1.java",
    "chars": 350,
    "preview": "package instructions.loads.loadint;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\nimp"
  },
  {
    "path": "Java/src/instructions/loads/loadint/ILOAD_2.java",
    "chars": 350,
    "preview": "package instructions.loads.loadint;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\nimp"
  },
  {
    "path": "Java/src/instructions/loads/loadint/ILOAD_3.java",
    "chars": 351,
    "preview": "package instructions.loads.loadint;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\nimp"
  },
  {
    "path": "Java/src/instructions/loads/loadlong/LLOAD.java",
    "chars": 345,
    "preview": "package instructions.loads.loadlong;\n\nimport instructions.base.Index8Instruction;\nimport instructions.loads.Load;\nimport"
  },
  {
    "path": "Java/src/instructions/loads/loadlong/LLOAD_0.java",
    "chars": 351,
    "preview": "package instructions.loads.loadlong;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\nim"
  },
  {
    "path": "Java/src/instructions/loads/loadlong/LLOAD_1.java",
    "chars": 351,
    "preview": "package instructions.loads.loadlong;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\nim"
  },
  {
    "path": "Java/src/instructions/loads/loadlong/LLOAD_2.java",
    "chars": 351,
    "preview": "package instructions.loads.loadlong;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\nim"
  },
  {
    "path": "Java/src/instructions/loads/loadlong/LLOAD_3.java",
    "chars": 352,
    "preview": "package instructions.loads.loadlong;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\nim"
  },
  {
    "path": "Java/src/instructions/loads/loadref/ALOAD.java",
    "chars": 343,
    "preview": "package instructions.loads.loadref;\n\nimport instructions.base.Index8Instruction;\nimport instructions.loads.Load;\nimport "
  },
  {
    "path": "Java/src/instructions/loads/loadref/ALOAD_0.java",
    "chars": 350,
    "preview": "package instructions.loads.loadref;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\nimp"
  },
  {
    "path": "Java/src/instructions/loads/loadref/ALOAD_1.java",
    "chars": 350,
    "preview": "package instructions.loads.loadref;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\nimp"
  },
  {
    "path": "Java/src/instructions/loads/loadref/ALOAD_2.java",
    "chars": 350,
    "preview": "package instructions.loads.loadref;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\nimp"
  },
  {
    "path": "Java/src/instructions/loads/loadref/ALOAD_3.java",
    "chars": 350,
    "preview": "package instructions.loads.loadref;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\nimp"
  },
  {
    "path": "Java/src/instructions/loads/loadxarr/AALOAD.java",
    "chars": 821,
    "preview": "package instructions.loads.loadxarr;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\nim"
  },
  {
    "path": "Java/src/instructions/loads/loadxarr/BALOAD.java",
    "chars": 812,
    "preview": "package instructions.loads.loadxarr;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\nim"
  },
  {
    "path": "Java/src/instructions/loads/loadxarr/CALOAD.java",
    "chars": 812,
    "preview": "package instructions.loads.loadxarr;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\nim"
  },
  {
    "path": "Java/src/instructions/loads/loadxarr/DALOAD.java",
    "chars": 823,
    "preview": "package instructions.loads.loadxarr;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\nim"
  },
  {
    "path": "Java/src/instructions/loads/loadxarr/FALOAD.java",
    "chars": 818,
    "preview": "package instructions.loads.loadxarr;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\nim"
  },
  {
    "path": "Java/src/instructions/loads/loadxarr/IALOAD.java",
    "chars": 808,
    "preview": "package instructions.loads.loadxarr;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\nim"
  },
  {
    "path": "Java/src/instructions/loads/loadxarr/LALOAD.java",
    "chars": 813,
    "preview": "package instructions.loads.loadxarr;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\nim"
  },
  {
    "path": "Java/src/instructions/loads/loadxarr/SALOAD.java",
    "chars": 816,
    "preview": "package instructions.loads.loadxarr;\n\nimport instructions.base.NoOperandsInstruction;\nimport instructions.loads.Load;\nim"
  },
  {
    "path": "Java/src/instructions/math/add/DADD.java",
    "chars": 515,
    "preview": "package instructions.math.add;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/add/FADD.java",
    "chars": 508,
    "preview": "package instructions.math.add;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/add/IADD.java",
    "chars": 497,
    "preview": "package instructions.math.add;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/add/LADD.java",
    "chars": 504,
    "preview": "package instructions.math.add;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/and/IAND.java",
    "chars": 497,
    "preview": "package instructions.math.and;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/and/LAND.java",
    "chars": 503,
    "preview": "package instructions.math.and;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/div/DDIV.java",
    "chars": 515,
    "preview": "package instructions.math.div;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/div/FDIV.java",
    "chars": 509,
    "preview": "package instructions.math.div;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/div/IDIV.java",
    "chars": 496,
    "preview": "package instructions.math.div;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/div/LDIV.java",
    "chars": 503,
    "preview": "package instructions.math.div;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/iinc/IINC.java",
    "chars": 734,
    "preview": "package instructions.math.iinc;\n\nimport instructions.base.BytecodeReader;\nimport instructions.base.Instruction;\nimport r"
  },
  {
    "path": "Java/src/instructions/math/mul/DMUL.java",
    "chars": 515,
    "preview": "package instructions.math.mul;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/mul/FMUL.java",
    "chars": 509,
    "preview": "package instructions.math.mul;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/mul/IMUL.java",
    "chars": 497,
    "preview": "package instructions.math.mul;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/mul/LMUL.java",
    "chars": 502,
    "preview": "package instructions.math.mul;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/neg/DNEG.java",
    "chars": 440,
    "preview": "package instructions.math.neg;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/neg/FNEG.java",
    "chars": 436,
    "preview": "package instructions.math.neg;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/neg/INEG.java",
    "chars": 431,
    "preview": "package instructions.math.neg;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/neg/LNEG.java",
    "chars": 435,
    "preview": "package instructions.math.neg;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/or/IOR.java",
    "chars": 495,
    "preview": "package instructions.math.or;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport r"
  },
  {
    "path": "Java/src/instructions/math/or/LOR.java",
    "chars": 501,
    "preview": "package instructions.math.or;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport r"
  },
  {
    "path": "Java/src/instructions/math/rem/DREM.java",
    "chars": 516,
    "preview": "package instructions.math.rem;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/rem/FREM.java",
    "chars": 509,
    "preview": "package instructions.math.rem;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/rem/IREM.java",
    "chars": 619,
    "preview": "package instructions.math.rem;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/rem/LREM.java",
    "chars": 626,
    "preview": "package instructions.math.rem;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/sh/ISHL.java",
    "chars": 728,
    "preview": "package instructions.math.sh;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport r"
  },
  {
    "path": "Java/src/instructions/math/sh/ISHR.java",
    "chars": 579,
    "preview": "package instructions.math.sh;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport r"
  },
  {
    "path": "Java/src/instructions/math/sh/IUSHR.java",
    "chars": 598,
    "preview": "package instructions.math.sh;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport r"
  },
  {
    "path": "Java/src/instructions/math/sh/LSHL.java",
    "chars": 732,
    "preview": "package instructions.math.sh;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport r"
  },
  {
    "path": "Java/src/instructions/math/sh/LSHR.java",
    "chars": 732,
    "preview": "package instructions.math.sh;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport r"
  },
  {
    "path": "Java/src/instructions/math/sh/LUSHR.java",
    "chars": 720,
    "preview": "package instructions.math.sh;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport r"
  },
  {
    "path": "Java/src/instructions/math/sub/DSUB.java",
    "chars": 515,
    "preview": "package instructions.math.sub;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/sub/FSUB.java",
    "chars": 509,
    "preview": "package instructions.math.sub;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/sub/ISUB.java",
    "chars": 496,
    "preview": "package instructions.math.sub;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/sub/LSUB.java",
    "chars": 502,
    "preview": "package instructions.math.sub;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/xor/IXOR.java",
    "chars": 497,
    "preview": "package instructions.math.xor;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/math/xor/LXOR.java",
    "chars": 503,
    "preview": "package instructions.math.xor;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimport "
  },
  {
    "path": "Java/src/instructions/references/ANEW_ARRAY.java",
    "chars": 1413,
    "preview": "package instructions.references;\n\nimport instructions.base.Index16Instruction;\nimport runtimedata.OperandStack;\nimport r"
  },
  {
    "path": "Java/src/instructions/references/ARRAY_LENGTH.java",
    "chars": 667,
    "preview": "package instructions.references;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimpor"
  },
  {
    "path": "Java/src/instructions/references/ATHROW.java",
    "chars": 2346,
    "preview": "package instructions.references;\n\nimport instructions.base.NoOperandsInstruction;\nimport runtimedata.OperandStack;\nimpor"
  },
  {
    "path": "Java/src/instructions/references/CHECK_CAST.java",
    "chars": 1225,
    "preview": "package instructions.references;\n\nimport instructions.base.Index16Instruction;\nimport runtimedata.OperandStack;\nimport r"
  },
  {
    "path": "Java/src/instructions/references/GET_FIELD.java",
    "chars": 2013,
    "preview": "package instructions.references;\n\nimport instructions.base.Index16Instruction;\nimport runtimedata.OperandStack;\nimport r"
  },
  {
    "path": "Java/src/instructions/references/GET_STATIC.java",
    "chars": 2149,
    "preview": "package instructions.references;\n\nimport instructions.base.ClassInitLogic;\nimport instructions.base.Index16Instruction;\n"
  },
  {
    "path": "Java/src/instructions/references/INSTANCE_OF.java",
    "chars": 1175,
    "preview": "package instructions.references;\n\nimport instructions.base.Index16Instruction;\nimport runtimedata.OperandStack;\nimport r"
  }
]

// ... and 99 more files (download for full content)

About this extraction

This page contains the full source code of the zachaxy/JVM GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 299 files (315.3 KB), approximately 94.5k tokens, and a symbol index with 994 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!