package miniJVM.print; import miniJVM.constant.*; public class ConstantPoolPrinter { ConstantPool pool; ConstantPoolPrinter(ConstantPool pool){ this.pool = pool; } public void print(){ System.out.println("Constant Pool:"); int poolSize = pool.getSize(); ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() { public void visitClassInfo(ClassInfo info) { StringBuilder sb = new StringBuilder(); sb.append("Class "); sb.append("#" + info.getUtf8Index()); sb.append(" //" + info.getClassName()); System.out.println(sb.toString()); } public void visitFieldRef(FieldRefInfo info) { StringBuilder sb = new StringBuilder(); sb.append("Fieldref "); sb.append("#" + info.getClassInfoIndex()); sb.append("." + info.getNameAndTypeIndex()); sb.append(" //" + info.getClassName()); sb.append("." + info.getFieldName()); sb.append(":" + info.getFieldType()); System.out.println(sb.toString()); } public void visitMethodRef(MethodRefInfo info) { StringBuilder sb = new StringBuilder(); sb.append("MethodRef "); sb.append("#" + info.getClassInfoIndex()); sb.append(".").append("#" + info.getNameAndTypeIndex()); sb.append(" //" + info.getClassName()); sb.append("." + info.getMethodName()); sb.append(":" + info.getParamAndReturnType()); System.out.println(sb.toString()); } public void visitNameAndType(NameAndTypeInfo info) { StringBuilder sb = new StringBuilder(); sb.append("NameAndType "); sb.append("#" + info.getIndex1()); sb.append(":#" + info.getIndex2()); sb.append(" //" + info.getName()); sb.append(":" + info.getTypeInfo()); System.out.println(sb.toString()); } public void visitString(StringInfo info) { StringBuilder sb = new StringBuilder(); sb.append("String "); sb.append("#" + info.getIndex()); sb.append(" //" + info.toString()); System.out.println(sb.toString()); } public void visitUTF8(UTF8Info info) { StringBuilder sb = new StringBuilder(); sb.append("Utf8 "); sb.append(info.getValue()); System.out.println(sb.toString()); } }; for(int i = 1; i < poolSize; i++){ System.out.print(i + "# = "); ConstantInfo cnst = pool.getConstantInfo(i); cnst.accept(visitor); // if(cnst instanceof ClassInfo){ // sb.append("Class "); // sb.append("#" + ((ClassInfo) cnst).getUtf8Index()); // sb.append(" //" + ((ClassInfo) cnst).getClassName()); // }else if(cnst instanceof UTF8Info){ // sb.append("Utf8 "); // sb.append(((UTF8Info) cnst).getValue()); // }else if(cnst instanceof MethodRefInfo){ // sb.append("MethodRef "); // sb.append("#" + ((MethodRefInfo) cnst).getClassInfoIndex()); // sb.append(".").append("#" + ((MethodRefInfo) cnst).getNameAndTypeIndex()); // sb.append(" //" + ((MethodRefInfo) cnst).getClassName()); // sb.append("." + ((MethodRefInfo) cnst).getMethodName()); // sb.append(":" + ((MethodRefInfo) cnst).getParamAndReturnType()); // }else if(cnst instanceof NameAndTypeInfo){ // sb.append("NameAndType "); // sb.append("#" + ((NameAndTypeInfo) cnst).getIndex1()); // sb.append(":#" + ((NameAndTypeInfo) cnst).getIndex2()); // sb.append(" //" + ((NameAndTypeInfo) cnst).getName()); // sb.append(":" + ((NameAndTypeInfo) cnst).getTypeInfo()); // }else if(cnst instanceof FieldRefInfo){ // sb.append("Fieldref "); // sb.append("#" + ((FieldRefInfo) cnst).getClassInfoIndex()); // sb.append("." + ((FieldRefInfo) cnst).getNameAndTypeIndex()); // sb.append(" //" + ((FieldRefInfo) cnst).getClassName()); // sb.append("." + ((FieldRefInfo) cnst).getFieldName()); // sb.append(":" + ((FieldRefInfo) cnst).getFieldType()); // }else if(cnst instanceof StringInfo){ // sb.append("String "); // sb.append("#" + ((StringInfo) cnst).getIndex()); // sb.append(" //" + cnst.toString()); // }else{ // throw new RuntimeException(cnst.getType() + "not processed"); // } // System.out.println(sb.toString()); } } }