private void processExceptions(DataInputStream data, MethodInfo target) throws IOException { int numExceptions = data.readUnsignedShort(); Type[] exceptions = numExceptions <= 0 ? Type.EMPTY_ARRAY : new Type[numExceptions]; for (int i = 0; i < numExceptions; i++) { exceptions[i] = intern(new ClassType(decodeClassEntry(data.readUnsignedShort()))); } // Do not overwrite a signature exception if (numExceptions > 0 && target.exceptions().size() == 0) { target.setExceptions(exceptions); } }
private void processInnerClasses(DataInputStream data, ClassInfo target) throws IOException { int numClasses = data.readUnsignedShort(); innerClasses = numClasses > 0 ? new HashMap<DotName, InnerClassInfo>(numClasses) : Collections.<DotName, InnerClassInfo>emptyMap(); for (int i = 0; i < numClasses; i++) { DotName innerClass = decodeClassEntry(data.readUnsignedShort()); int outerIndex = data.readUnsignedShort(); DotName outerClass = outerIndex == 0 ? null : decodeClassEntry(outerIndex); int simpleIndex = data.readUnsignedShort(); String simpleName = simpleIndex == 0 ? null : decodeUtf8Entry(simpleIndex); int flags = data.readUnsignedShort(); if (innerClass.equals(target.name())) { target.setInnerClassInfo(outerClass, simpleName); target.setFlags((short)flags); } innerClasses.put(innerClass, new InnerClassInfo(innerClass, outerClass, simpleName, flags)); } }
private void processClassInfo(DataInputStream data) throws IOException { short flags = (short) data.readUnsignedShort(); DotName thisName = decodeClassEntry(data.readUnsignedShort()); int superIndex = data.readUnsignedShort(); DotName superName = (superIndex != 0) ? decodeClassEntry(superIndex) : null; int numInterfaces = data.readUnsignedShort(); List<Type> interfaces = new ArrayList<Type>(numInterfaces); for (int i = 0; i < numInterfaces; i++) { interfaces.add(intern(new ClassType(decodeClassEntry(data.readUnsignedShort())))); } Type[] interfaceTypes = intern(interfaces.toArray(new Type[interfaces.size()])); Type superClassType = superName == null ? null : intern(new ClassType(superName)); this.classAnnotations = new HashMap<DotName, List<AnnotationInstance>>(); this.currentClass = new ClassInfo(thisName, superClassType, flags, interfaceTypes, classAnnotations); if (superName != null) addSubclass(superName, currentClass); for (int i = 0; i < numInterfaces; i++) { addImplementor(interfaces.get(i).name(), currentClass); } classes.put(currentClass.name(), currentClass); }
private void processEnclosingMethod(DataInputStream data, ClassInfo target) throws IOException { int classIndex = data.readUnsignedShort(); int index = data.readUnsignedShort(); if (index == 0) { return; // Enclosed in a static or an instance variable } DotName enclosingClass = decodeClassEntry(classIndex); NameAndType nameAndType = decodeNameAndTypeEntry(index); IntegerHolder pos = new IntegerHolder(); Type[] parameters = intern(parseMethodArgs(nameAndType.descriptor, pos)); Type returnType = parseType(nameAndType.descriptor, pos); EnclosingMethodInfo method = new EnclosingMethodInfo(nameAndType.name, returnType, parameters, enclosingClass); target.setEnclosingMethod(method); }