package com.coderising.jvm.print;
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.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 visitString(StringInfo info) {
StringBuilder buffer = new StringBuilder();
buffer.append("String #").append(info.getIndex());
System.out.println(buffer);
}
@Override
public void visitNameAndType(NameAndTypeInfo info) {
StringBuilder buffer = new StringBuilder();
buffer.append("NameAndType #").append(info.getNameIndex()).append(":#")
.append(info.getDescriptorIndex());
System.out.println(buffer);
}
@Override
public void visitMethodRef(MethodRefInfo info) {
StringBuilder buffer = new StringBuilder();
buffer.append("MethodRef #").append(info.getClassInfoIndex()).append(".#")
.append(info.getNameAndTypeIndex());
System.out.println(buffer);
}
@Override
public void visitFieldRef(FieldRefInfo info) {
StringBuilder buffer = new StringBuilder();
buffer.append("FieldRef #").append(info.getClassInfoIndex()).append(".#")
.append(info.getNameAndTypeIndex());
System.out.println(buffer);
}
@Override
public void visitClassInfo(ClassInfo info) {
StringBuilder buffer = new StringBuilder();
buffer.append("Class #").append(info.getUtf8Index())
.append(" ").append(info.getClassName());
System.out.println(buffer);
}
@Override
public void visistUTF8(UTF8Info info) {
StringBuilder buffer = new StringBuilder();
buffer.append("UTF8 ").append(info.getValue());
System.out.println(buffer);
}
};
for(int i=1; i<=pool.getSize(); i++){
ConstantInfo constantInfo = pool.getConstantInfo(i);
System.out.print("#"+i+"=");
constantInfo.accept(visitor);
}
}
}