package com.coderising.jvm.print;
import java.util.concurrent.SynchronousQueue;
import com.coderising.jvm.constant.ClassInfo;
import com.coderising.jvm.constant.ConstantInfo;
import com.coderising.jvm.constant.ConstantPool;
import com.coderising.jvm.constant.FieldRefInfo;
import com.coderising.jvm.constant.MethodRefInfo;
import com.coderising.jvm.constant.NameAndTypeInfo;
import com.coderising.jvm.constant.NullConstantInfo;
import com.coderising.jvm.constant.StringInfo;
import com.coderising.jvm.constant.UTF8Info;
public class ConstantPoolPrinter {
ConstantPool pool;
ConstantPoolPrinter(ConstantPool pool){
this.pool = pool;
}
public void print(){
System.out.println("Constant Pool:");
ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() {
@Override
public void visitUTF8Info(UTF8Info utf8Info) {
System.out.println("UTF8 " + utf8Info.getValue());
}
@Override
public void visitStringInfo(StringInfo stringInfo) {
System.out.println("String " + stringInfo.toString());
}
@Override
public void visitNullConstantInfo(NullConstantInfo nullConstantInfo) {
}
@Override
public void visitNameAndTypeInfo(NameAndTypeInfo nameAndTypeInfo) {
System.out.println("NameAndType " + nameAndTypeInfo.getIndex1() + ":" + nameAndTypeInfo.getIndex2()
+ " // " + nameAndTypeInfo.getName() + ":" + nameAndTypeInfo.getTypeInfo());
}
@Override
public void visitMethodRefInfo(MethodRefInfo methodRefInfo) {
System.out.println("Methodref " + methodRefInfo.getClassInfoIndex() + "."
+ methodRefInfo.getNameAndTypeIndex() + " // "
+ methodRefInfo.getClassName() + "." + methodRefInfo.getMethodName()
+ ":" + methodRefInfo.getParamAndReturnType());
}
@Override
public void visitFieldRefInfo(FieldRefInfo fieldRefInfo) {
System.out.println("Fieldref " + fieldRefInfo.getClassInfoIndex() + "."
+ fieldRefInfo.getNameAndTypeIndex() + " // "
+ fieldRefInfo.getClassName() + "." + fieldRefInfo.getFieldName() + ":"
+ fieldRefInfo.getFieldType());
}
@Override
public void visitClassInfo(ClassInfo classInfo) {
System.out.println("Class " + classInfo.getUtf8Index() + " // " + classInfo.getClassName());
}
};
for(int i=1;i<this.pool.getSize();i++){
if(i < 10){
System.out.print(" ");
}
System.out.print(" #" + i + " = ");
this.pool.getConstantInfo(i).accept(visitor);
}
}
}