⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bytecodeparser.java

📁 JDK1.4编译器后端
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
        error("magic error");    }    // Declared in BytecodeReader.jrag at line 277    public void parseMinor() {      int low = u1();      int high = u1();      if(BytecodeParser.VERBOSE)         println("Minor: " + high + "." + low);    }    // Declared in BytecodeReader.jrag at line 284    public void parseMajor() {      int low = u1();      int high = u1();      if(BytecodeParser.VERBOSE)         println("Major: " + high + "." + low);    }    // Declared in BytecodeReader.jrag at line 291    public static boolean isInnerClass = false;    // Declared in BytecodeReader.jrag at line 293    public TypeDecl parseTypeDecl() {      isInnerClass = false;      int flags = u2();      Modifiers modifiers = modifiers(flags & 0xfddf);      if ((flags & 0x0200) == 0) {        ClassDecl decl = new ClassDecl();        decl.setModifiers(modifiers);        decl.setID(parseThisClass());        Access superClass = parseSuperClass();        decl.setSuperClassAccessOpt(superClass == null ? new Opt()            : new Opt(superClass));        decl.setImplementsList(parseInterfaces(new List()));        if((flags & 0x0008) == 0 && outerClassInfo != null)          isInnerClass = true;        return decl;      } else {        InterfaceDecl decl = new InterfaceDecl();        decl.setModifiers(modifiers);        decl.setID(parseThisClass());        Access superClass = parseSuperClass();        decl.setSuperInterfaceIdList(            parseInterfaces(              superClass == null ? new List()              : new List().add(superClass)));        return decl;      }    }    // Declared in BytecodeReader.jrag at line 324    public String parseThisClass() {      int index = u2();      CONSTANT_Class_Info info = (CONSTANT_Class_Info) constantPool[index];      classInfo = info;      return info.simpleName();    }    // Declared in BytecodeReader.jrag at line 331    public Access parseSuperClass() {      int index = u2();      if (index == 0)        return null;      CONSTANT_Class_Info info = (CONSTANT_Class_Info) constantPool[index];      return info.access();    }    // Declared in BytecodeReader.jrag at line 339    public List parseInterfaces(List list) {      int count = u2();      for (int i = 0; i < count; i++) {        CONSTANT_Class_Info info = (CONSTANT_Class_Info) constantPool[u2()];        list.add(info.access());      }      return list;    }    // Declared in BytecodeReader.jrag at line 349    public Access fromClassName(String s) {      // Sample ClassName: a/b/c$d$e      // the package name ends at the last '/'      // after that follows a list of type names separated by '$'      // all except the first are nested types      String packageName = "";      int index = s.lastIndexOf('/');      if(index != -1)        packageName = s.substring(0, index).replace('/', '.');      String[] typeNames = s.substring(index + 1).split("\\$");      Access result = new TypeAccess(packageName, typeNames[0]);      for(int i = 1; i < typeNames.length; i++)        result = result.qualifiesAccess(new TypeAccess(typeNames[i]));      return result;    }    // Declared in BytecodeReader.jrag at line 367    public static Modifiers modifiers(int flags) {      Modifiers m = new Modifiers();      if ((flags & 0x0001) != 0)        m.addModifier(new Modifier("public"));      if ((flags & 0x0002) != 0)        m.addModifier(new Modifier("private"));      if ((flags & 0x0004) != 0)        m.addModifier(new Modifier("protected"));      if ((flags & 0x0008) != 0)        m.addModifier(new Modifier("static"));      if ((flags & 0x0010) != 0)        m.addModifier(new Modifier("final"));      if ((flags & 0x0020) != 0)        m.addModifier(new Modifier("synchronized"));      if ((flags & 0x0040) != 0)        m.addModifier(new Modifier("volatile"));      if ((flags & 0x0080) != 0)        m.addModifier(new Modifier("transient"));      if ((flags & 0x0100) != 0)        m.addModifier(new Modifier("native"));      if ((flags & 0x0400) != 0)        m.addModifier(new Modifier("abstract"));      if ((flags & 0x0800) != 0)        m.addModifier(new Modifier("strictfp"));      return m;    }    // Declared in BytecodeReader.jrag at line 394    public void parseFields(TypeDecl typeDecl) {      int count = u2();      if(BytecodeParser.VERBOSE)         println("Fields (" + count + "):");      for (int i = 0; i < count; i++) {        if(BytecodeParser.VERBOSE)           print(" Field nbr " + i + " ");        FieldInfo fieldInfo = new FieldInfo(this);        if(!fieldInfo.isSynthetic())          typeDecl.addBodyDecl(fieldInfo.bodyDecl());      }    }    // Declared in BytecodeReader.jrag at line 408    public void parseMethods(TypeDecl typeDecl) {      int count = u2();      if(BytecodeParser.VERBOSE)         println("Methods (" + count + "):");      for (int i = 0; i < count; i++) {        if(BytecodeParser.VERBOSE)           print("  Method nbr " + i + " ");        MethodInfo info = new MethodInfo(this);        if(!info.isSynthetic() && !info.name.equals("<clinit>")) {          typeDecl.addBodyDecl(info.bodyDecl());        }      }    }    // Declared in BytecodeReader.jrag at line 423    public CONSTANT_Info[] constantPool = null;    // Declared in BytecodeReader.jrag at line 425    private void checkLengthAndNull(int index) {      if(index >= constantPool.length) {        throw new Error("Trying to access element " + index  + " in constant pool of length " + constantPool.length);      }      if(constantPool[index] == null)        throw new Error("Unexpected null element in constant pool at index " + index);    }    // Declared in BytecodeReader.jrag at line 432    public boolean validConstantPoolIndex(int index) {      return index < constantPool.length && constantPool[index] != null;    }    // Declared in BytecodeReader.jrag at line 435    public CONSTANT_Info getCONSTANT_Info(int index) {      checkLengthAndNull(index);      return constantPool[index];    }    // Declared in BytecodeReader.jrag at line 439    public CONSTANT_Utf8_Info getCONSTANT_Utf8_Info(int index) {      checkLengthAndNull(index);      CONSTANT_Info info = constantPool[index];      if(!(info instanceof CONSTANT_Utf8_Info))        throw new Error("Expected CONSTANT_Utf8_info at " + index + " in constant pool but found " + info.getClass().getName());      return (CONSTANT_Utf8_Info)info;    }    // Declared in BytecodeReader.jrag at line 446    public CONSTANT_Class_Info getCONSTANT_Class_Info(int index) {      checkLengthAndNull(index);      CONSTANT_Info info = constantPool[index];      if(!(info instanceof CONSTANT_Class_Info))        throw new Error("Expected CONSTANT_Class_info at " + index + " in constant pool but found " + info.getClass().getName());      return (CONSTANT_Class_Info)info;    }    // Declared in BytecodeReader.jrag at line 454    public void parseConstantPool() {      int count = u2();      if(BytecodeParser.VERBOSE)         println("constant_pool_count: " + count);      constantPool = new CONSTANT_Info[count + 1];      for (int i = 1; i < count; i++) {        parseEntry(i);        if (constantPool[i] instanceof CONSTANT_Long_Info            || constantPool[i] instanceof CONSTANT_Double_Info)          i++;      }      //println("ConstantPool: ");      //for(int i = 1; i < count; i++) {      //  println(i + ", " + constantPool[i]);      //}    }    // Declared in BytecodeReader.jrag at line 473    private static final int CONSTANT_Class = 7;    // Declared in BytecodeReader.jrag at line 474    private static final int CONSTANT_FieldRef = 9;    // Declared in BytecodeReader.jrag at line 475    private static final int CONSTANT_MethodRef = 10;    // Declared in BytecodeReader.jrag at line 476    private static final int CONSTANT_InterfaceMethodRef = 11;    // Declared in BytecodeReader.jrag at line 477    private static final int CONSTANT_String = 8;    // Declared in BytecodeReader.jrag at line 478    private static final int CONSTANT_Integer = 3;    // Declared in BytecodeReader.jrag at line 479    private static final int CONSTANT_Float = 4;    // Declared in BytecodeReader.jrag at line 480    private static final int CONSTANT_Long = 5;    // Declared in BytecodeReader.jrag at line 481    private static final int CONSTANT_Double = 6;    // Declared in BytecodeReader.jrag at line 482    private static final int CONSTANT_NameAndType = 12;    // Declared in BytecodeReader.jrag at line 483    private static final int CONSTANT_Utf8 = 1;    // Declared in BytecodeReader.jrag at line 485    public void parseEntry(int i) {      int tag = u1();      switch (tag) {        case CONSTANT_Class:          constantPool[i] = new CONSTANT_Class_Info(this);          break;        case CONSTANT_FieldRef:          constantPool[i] = new CONSTANT_Fieldref_Info(this);          break;        case CONSTANT_MethodRef:          constantPool[i] = new CONSTANT_Methodref_Info(this);          break;        case CONSTANT_InterfaceMethodRef:          constantPool[i] = new CONSTANT_InterfaceMethodref_Info(this);          break;        case CONSTANT_String:          constantPool[i] = new CONSTANT_String_Info(this);          break;        case CONSTANT_Integer:          constantPool[i] = new CONSTANT_Integer_Info(this);          break;        case CONSTANT_Float:          constantPool[i] = new CONSTANT_Float_Info(this);          break;        case CONSTANT_Long:          constantPool[i] = new CONSTANT_Long_Info(this);          break;        case CONSTANT_Double:          constantPool[i] = new CONSTANT_Double_Info(this);          break;        case CONSTANT_NameAndType:          constantPool[i] = new CONSTANT_NameAndType_Info(this);          break;        case CONSTANT_Utf8:          constantPool[i] = new CONSTANT_Utf8_Info(this);          break;        default:          println("Unknown entry: " + tag);      }    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -