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 java.util.function.Consumer;
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("");
}
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) {
++this.attrCount;
if(this.attrCount % 2 == 0) {
this.printWriter.print("");
} else {
this.printWriter.print(" |
");
}
this.printWriter.println("");
int index;
int cex;
int indice;
int var20;
label71:
switch(tag) {
case 0:
index = ((SourceFile)attribute).getSourceFileIndex();
this.printWriter.print("\n");
break;
case 1:
index = ((ConstantValue)attribute).getConstantValueIndex();
this.printWriter.print("\n");
break;
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) {
this.printWriter.print("Exceptions handled ");
CodeException[] var17 = ce;
int var19 = ce.length;
for(var20 = 0; var20 < var19; ++var20) {
CodeException var21 = var17[var20];
indice = var21.getCatchType();
this.printWriter.print("- ");
if(indice != 0) {
this.printWriter.print(this.constantHtml.referenceConstant(indice));
} else {
this.printWriter.print("Any Exception");
}
this.printWriter.print("
(Ranging from lines " + this.codeLink(var21.getStartPC(), methodNumber) + " to " + this.codeLink(var21.getEndPC(), methodNumber) + ", handled at line " + this.codeLink(var21.getHandlerPC(), methodNumber) + ") ");
}
this.printWriter.print(" ");
}
break;
case 3:
int[] indices = ((ExceptionTable)attribute).getExceptionIndexTable();
this.printWriter.print("");
int[] var18 = indices;
var20 = indices.length;
for(cex = 0; cex < var20; ++cex) {
indice = var18[cex];
this.printWriter.print("- Exception class index(" + indice + ")\n");
}
this.printWriter.print("
\n");
break;
case 4:
LineNumber[] lineNumbers = ((LineNumberTable)attribute).getLineNumberTable();
this.printWriter.print("");
var20 = 0;
while(true) {
if(var20 >= lineNumbers.length) {
break label71;
}
this.printWriter.print("(" + lineNumbers[var20].getStartPC() + ", " + lineNumbers[var20].getLineNumber() + ")");
if(var20 < lineNumbers.length - 1) {
this.printWriter.print(", ");
}
++var20;
}
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("");
InnerClass[] i = ((InnerClasses)attribute).getInnerClasses();
cex = i.length;
for(indice = 0; indice < cex; ++indice) {
InnerClass clazz = i[indice];
index = clazz.getInnerNameIndex();
String name;
if(index > 0) {
name = this.constantPool.getConstantUtf8(index).getBytes();
} else {
name = "<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();
}
}
}