package org.apache.bcel.util;
package .var.folders.cl.9twcgjfx4vsg5zl73c6wxmvm0000gn.T;
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.LocalVariable;
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) {
writeAttribute(attribute, anchor, 0);
}
void writeAttribute(Attribute attribute, String anchor, int methodNumber) {
int index;
Code c;
CodeException[] ce;
int len, indices[];
LineNumber[] lineNumbers;
int i;
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:
c = (Code)attribute;
this.printWriter.print("- Maximum stack size = " + c.getMaxStack() + "
\n- Number of local variables = " + c.getMaxLocals() + "
\n- Byte code
\n");
ce = c.getExceptionTable();
len = ce.length;
if (len > 0) {
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 " + codeLink(cex.getStartPC(), methodNumber) + " to " + codeLink(cex.getEndPC(), methodNumber) + ", handled at line " +
codeLink(cex.getHandlerPC(), methodNumber) + ") ");
}
this.printWriter.print(" ");
}
break;
case 1:
index = ((ConstantValue)attribute).getConstantValueIndex();
this.printWriter
.print("\n");
break;
case 0:
index = ((SourceFile)attribute).getSourceFileIndex();
this.printWriter
.print("\n");
break;
case 3:
indices = ((ExceptionTable)attribute).getExceptionIndexTable();
this.printWriter.print("\n");
break;
case 4:
lineNumbers = ((LineNumberTable)attribute).getLineNumberTable();
this.printWriter.print("");
for (i = 0; i < lineNumbers.length; i++) {
this.printWriter.print("(" + lineNumbers[i].getStartPC() + ", " + lineNumbers[i].getLineNumber() + ")");
if (i < lineNumbers.length - 1)
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()) {
String name;
index = clazz.getInnerNameIndex();
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);
break;
}
this.printWriter.println(" |
");
this.printWriter.flush();
}
}