package com.github.orajavac.coding2017.jvm.print;
import com.github.orajavac.coding2017.jvm.constant.ClassInfo;
import com.github.orajavac.coding2017.jvm.constant.ConstantInfo;
import com.github.orajavac.coding2017.jvm.constant.ConstantPool;
import com.github.orajavac.coding2017.jvm.constant.FieldRefInfo;
import com.github.orajavac.coding2017.jvm.constant.MethodRefInfo;
import com.github.orajavac.coding2017.jvm.constant.NameAndTypeInfo;
import com.github.orajavac.coding2017.jvm.constant.StringInfo;
import com.github.orajavac.coding2017.jvm.constant.UTF8Info;
public class ConstantPoolPrinter {
ConstantPool pool;
ConstantPoolPrinter(ConstantPool pool){
this.pool = pool;
}
public void print(){
System.out.println("Constant Pool:");
ConstantInfo.Visistor visistor = new ConstantInfo.Visistor(){
public void visitString(StringInfo info){
StringBuilder buffer = new StringBuilder();
buffer.append("String #").append(info.getIndex());
}
public void visitClassInfo(ClassInfo info){
StringBuilder buffer = new StringBuilder();
buffer.append("Class #").append(info.getUtf8Index()).append(" ")
.append(info.getClassName());
}
public void visitFieldRef(FieldRefInfo info){
StringBuilder buffer = new StringBuilder();
buffer.append("FiledRef #").append(info.getClassInfoIndex()).append(" ")
.append(info.getNameAndTypeIndex());
}
public void visitMethodRef(MethodRefInfo info){
StringBuilder buffer = new StringBuilder();
buffer.append("MethodRef #").append(info.getClassInfoIndex()).append(" ").append(info.getParamAndReturnType());
}
public void visitNameAndType(NameAndTypeInfo info){
StringBuilder buffer = new StringBuilder();
buffer.append("NameAndType #").append(info.getIndex1()).append(" ").append(info.getIndex2());
}
public void visitUTF8(UTF8Info info){
StringBuilder buffer = new StringBuilder();
buffer.append("UTF8 #").append(info.getValue());
}
};
for (int i=0;i<pool.getSize();i++){
ConstantInfo constantInfo = pool.getConstantInfo(i);
constantInfo.accept(visistor);
}
}
}