package com.donaldy.jvm.print;
import com.donaldy.jvm.clz.ClassFile;
import com.donaldy.jvm.clz.ClassIndex;
import com.donaldy.jvm.constant.ClassInfo;
import com.donaldy.jvm.constant.ConstantInfo;
import com.donaldy.jvm.constant.ConstantPool;
import com.donaldy.jvm.constant.FieldRefInfo;
import com.donaldy.jvm.constant.MethodRefInfo;
import com.donaldy.jvm.constant.NameAndTypeInfo;
import com.donaldy.jvm.constant.StringInfo;
import com.donaldy.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.getIndex1()).append(":#")
.append(info.getIndex2());
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);
}
}
/*public void print(){
System.out.println("Constant Pool:");
for (int i = 0; i <= this.pool.getSize(); ++i) {
ConstantInfo cnstInfo = this.pool.getConstantInfo(i);
if (cnstInfo instanceof ClassInfo) {
ClassInfo info = (ClassInfo)cnstInfo;
StringBuilder buffer = new StringBuilder();
buffer.append("Class #").append(info.getUtf8Index())
.append(" ").append(info.getClassName());
System.out.println(buffer);
}
if (cnstInfo instanceof UTF8Info) {
UTF8Info info = (UTF8Info) cnstInfo;
StringBuilder buffer = new StringBuilder();
buffer.append("UTF8 ").append(info.getValue());
System.out.println(buffer);
}
*//*int type = constInfo.getType();
System.out.println("type : " + type);
if (type == ClassInfo.UTF8_INFO) {
} else if (type == ClassInfo.FLOAT_INFO) {
} else if (type == ClassInfo.CLASS_INFO) {
} else if (type == ClassInfo.STRING_INFO) {
} else if (type == ClassInfo.FIELD_INFO) {
} else if (type == ClassInfo.METHOD_INFO) {
} else if (type == ClassInfo.NAME_AND_TYPE_INFO) {
}*//*
}
}*/
}