package com.github.ipk2015.coding2017.minijvm.print;
import com.github.ipk2015.coding2017.minijvm.constant.ClassInfo;
import com.github.ipk2015.coding2017.minijvm.constant.ConstantInfo;
import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool;
import com.github.ipk2015.coding2017.minijvm.constant.FieldRefInfo;
import com.github.ipk2015.coding2017.minijvm.constant.MethodRefInfo;
import com.github.ipk2015.coding2017.minijvm.constant.NameAndTypeInfo;
import com.github.ipk2015.coding2017.minijvm.constant.StringInfo;
import com.github.ipk2015.coding2017.minijvm.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 visitClassInfo(ClassInfo info) {
int utf8Index = info.getUtf8Index();
String className = info.getClassName();
sop("Class\t\t"+"#"+utf8Index+"\t\t// "+className);
}
@Override
public void visitFieldRef(FieldRefInfo info) {
int classInfoIndex = info.getClassInfoIndex();
int nameAndTypeIndex = info.getNameAndTypeIndex();
String className = info.getClassName();
String fieldName = info.getFieldName();
String fieldType = info.getFieldType();
sop("Fieldref\t\t"+"#"+classInfoIndex+".#"+nameAndTypeIndex+"\t\t// "
+className+"."+fieldName+":"+fieldType);
}
@Override
public void visitMethodRef(MethodRefInfo info) {
int classInfoIndex = info.getClassInfoIndex();
int nameAndTypeIndex = info.getNameAndTypeIndex();
String className = info.getClassName();
String methodName = info.getMethodName();
String paramAndReturnType = info.getParamAndReturnType();
sop("Methodref\t\t"+"#"+classInfoIndex+".#"+nameAndTypeIndex+"\t\t// "
+className+"."+methodName+":"+paramAndReturnType);
}
@Override
public void visitNameAndType(NameAndTypeInfo info) {
int index1 = info.getIndex1();
int index2 = info.getIndex2();
String name = info.getName();
String typeInfo = info.getTypeInfo();
sop("NameAndType\t"+"#"+index1+".#"+index2+"\t\t// "+name+":"+typeInfo);
}
@Override
public void visitString(StringInfo info) {
int index = info.getIndex();
String utf8String = info.getConstantPool().getUTF8String(index);
sop("String\t\t"+"#"+index+"\t\t// "+utf8String);
}
@Override
public void visistUTF8(UTF8Info info) {
sop("Utf8\t\t"+info.getValue());
}
};
int size = pool.getSize();
for(int i = 1;i < size+1;i++){
ConstantInfo constantInfo = pool.getConstantInfo(i);
System.out.print("\t"+"#"+i+" = ");
constantInfo.accept(visitor);
}
}
public static void sop(String s){
System.out.println(s);
}
}