/*
* Decompiled with CFR 0.152.
*/
package org.apache.bcel.util;
import java.io.Closeable;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import org.apache.bcel.Const;
import org.apache.bcel.classfile.Attribute;
import org.apache.bcel.classfile.Code;
import org.apache.bcel.classfile.CodeException;
import org.apache.bcel.classfile.ConstantPool;
import org.apache.bcel.classfile.ConstantValue;
import org.apache.bcel.classfile.ExceptionTable;
import org.apache.bcel.classfile.InnerClass;
import org.apache.bcel.classfile.InnerClasses;
import org.apache.bcel.classfile.LineNumber;
import org.apache.bcel.classfile.LineNumberTable;
import org.apache.bcel.classfile.LocalVariableTable;
import org.apache.bcel.classfile.SourceFile;
import org.apache.bcel.classfile.Utility;
import org.apache.bcel.util.Class2HTML;
import org.apache.bcel.util.ConstantHTML;
final class AttributeHTML
implements Closeable {
private final String className;
private final PrintWriter printWriter;
private int attrCount;
private final ConstantHTML constantHtml;
private final ConstantPool constantPool;
AttributeHTML(String dir, String className, ConstantPool constantPool, ConstantHTML constantHtml, Charset charset) throws FileNotFoundException, UnsupportedEncodingException {
this.className = className;
this.constantPool = constantPool;
this.constantHtml = constantHtml;
this.printWriter = new PrintWriter(dir + className + "_attributes.html", charset.name());
this.printWriter.print("
");
this.printWriter.println("");
}
@Override
public void close() {
this.printWriter.println("
");
this.printWriter.close();
}
private String codeLink(int link, int methodNumber) {
return "" + link + "";
}
void writeAttribute(Attribute attribute, String anchor) {
this.writeAttribute(attribute, anchor, 0);
}
void writeAttribute(Attribute attribute, String anchor, int methodNumber) {
byte tag = attribute.getTag();
if (tag == -1) {
return;
}
++this.attrCount;
if (this.attrCount % 2 == 0) {
this.printWriter.print("");
} else {
this.printWriter.print(" |
");
}
this.printWriter.println("");
switch (tag) {
case 2: {
Code c = (Code)attribute;
this.printWriter.print("- Maximum stack size = " + c.getMaxStack() + "
\n- Number of local variables = " + c.getMaxLocals() + "
\n- Byte code
\n");
CodeException[] ce = c.getExceptionTable();
int len = ce.length;
if (len <= 0) break;
this.printWriter.print("Exceptions handled ");
for (CodeException cex : ce) {
int catchType = cex.getCatchType();
this.printWriter.print("- ");
if (catchType != 0) {
this.printWriter.print(this.constantHtml.referenceConstant(catchType));
} else {
this.printWriter.print("Any Exception");
}
this.printWriter.print("
(Ranging from lines " + this.codeLink(cex.getStartPC(), methodNumber) + " to " + this.codeLink(cex.getEndPC(), methodNumber) + ", handled at line " + this.codeLink(cex.getHandlerPC(), methodNumber) + ") ");
}
this.printWriter.print(" ");
break;
}
case 1: {
int index = ((ConstantValue)attribute).getConstantValueIndex();
this.printWriter.print("\n");
break;
}
case 0: {
int index = ((SourceFile)attribute).getSourceFileIndex();
this.printWriter.print("\n");
break;
}
case 3: {
int[] indices = ((ExceptionTable)attribute).getExceptionIndexTable();
this.printWriter.print("\n");
break;
}
case 4: {
LineNumber[] lineNumbers = ((LineNumberTable)attribute).getLineNumberTable();
this.printWriter.print("");
for (int i = 0; i < lineNumbers.length; ++i) {
this.printWriter.print("(" + lineNumbers[i].getStartPC() + ", " + lineNumbers[i].getLineNumber() + ")");
if (i >= lineNumbers.length - 1) continue;
this.printWriter.print(", ");
}
break;
}
case 5: {
this.printWriter.print(" ");
((LocalVariableTable)attribute).forEach(var -> {
int sigIdx = var.getSignatureIndex();
String signature = this.constantPool.getConstantUtf8(sigIdx).getBytes();
signature = Utility.signatureToString(signature, false);
int start = var.getStartPC();
int end = start + var.getLength();
this.printWriter.println("- " + Class2HTML.referenceType(signature) + " " + var.getName() + " in slot %" + var.getIndex() + "
Valid from lines " + start + " to " + end + " ");
});
this.printWriter.print(" \n");
break;
}
case 6: {
this.printWriter.print("");
for (InnerClass clazz : ((InnerClasses)attribute).getInnerClasses()) {
int index = clazz.getInnerNameIndex();
String name = index > 0 ? this.constantPool.getConstantUtf8(index).getBytes() : "<anonymous>";
String access = Utility.accessToString(clazz.getInnerAccessFlags());
this.printWriter.print("- " + access + " " + this.constantHtml.referenceConstant(clazz.getInnerClassIndex()) + " in class " + this.constantHtml.referenceConstant(clazz.getOuterClassIndex()) + " named " + name + "
\n");
}
this.printWriter.print(" \n");
break;
}
default: {
this.printWriter.print("" + attribute);
}
}
this.printWriter.println(" |
");
this.printWriter.flush();
}
}