--- old/langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/ConstantWriter.java 2015-05-26 21:42:33.883833037 -0700
+++ /dev/null 2015-04-26 22:05:36.465433038 -0700
@@ -1,466 +0,0 @@
-/*
- * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package com.sun.tools.javap;
-
-import com.sun.tools.classfile.ClassFile;
-import com.sun.tools.classfile.ConstantPool;
-import com.sun.tools.classfile.ConstantPoolException;
-
-import static com.sun.tools.classfile.ConstantPool.*;
-
-/*
- * Write a constant pool entry.
- *
- *
This is NOT part of any supported API.
- * If you write code that depends on this, you do so at your own risk.
- * This code and its internal interfaces are subject to change or
- * deletion without notice.
- */
-public class ConstantWriter extends BasicWriter {
- public static ConstantWriter instance(Context context) {
- ConstantWriter instance = context.get(ConstantWriter.class);
- if (instance == null)
- instance = new ConstantWriter(context);
- return instance;
- }
-
- protected ConstantWriter(Context context) {
- super(context);
- context.put(ConstantWriter.class, this);
- classWriter = ClassWriter.instance(context);
- options = Options.instance(context);
- }
-
- protected void writeConstantPool() {
- ConstantPool constant_pool = classWriter.getClassFile().constant_pool;
- writeConstantPool(constant_pool);
- }
-
- protected void writeConstantPool(ConstantPool constant_pool) {
- ConstantPool.Visitor v = new ConstantPool.Visitor() {
- public Integer visitClass(CONSTANT_Class_info info, Void p) {
- print("#" + info.name_index);
- tab();
- println("// " + stringValue(info));
- return 1;
- }
-
- public Integer visitDouble(CONSTANT_Double_info info, Void p) {
- println(stringValue(info));
- return 2;
- }
-
- public Integer visitFieldref(CONSTANT_Fieldref_info info, Void p) {
- print("#" + info.class_index + ".#" + info.name_and_type_index);
- tab();
- println("// " + stringValue(info));
- return 1;
- }
-
- public Integer visitFloat(CONSTANT_Float_info info, Void p) {
- println(stringValue(info));
- return 1;
- }
-
- public Integer visitInteger(CONSTANT_Integer_info info, Void p) {
- println(stringValue(info));
- return 1;
- }
-
- public Integer visitInterfaceMethodref(CONSTANT_InterfaceMethodref_info info, Void p) {
- print("#" + info.class_index + ".#" + info.name_and_type_index);
- tab();
- println("// " + stringValue(info));
- return 1;
- }
-
- public Integer visitInvokeDynamic(CONSTANT_InvokeDynamic_info info, Void p) {
- print("#" + info.bootstrap_method_attr_index + ":#" + info.name_and_type_index);
- tab();
- println("// " + stringValue(info));
- return 1;
- }
-
- public Integer visitLong(CONSTANT_Long_info info, Void p) {
- println(stringValue(info));
- return 2;
- }
-
- public Integer visitNameAndType(CONSTANT_NameAndType_info info, Void p) {
- print("#" + info.name_index + ":#" + info.type_index);
- tab();
- println("// " + stringValue(info));
- return 1;
- }
-
- public Integer visitMethodref(CONSTANT_Methodref_info info, Void p) {
- print("#" + info.class_index + ".#" + info.name_and_type_index);
- tab();
- println("// " + stringValue(info));
- return 1;
- }
-
- public Integer visitMethodHandle(CONSTANT_MethodHandle_info info, Void p) {
- print("#" + info.reference_kind.tag + ":#" + info.reference_index);
- tab();
- println("// " + stringValue(info));
- return 1;
- }
-
- public Integer visitMethodType(CONSTANT_MethodType_info info, Void p) {
- print("#" + info.descriptor_index);
- tab();
- println("// " + stringValue(info));
- return 1;
- }
-
- public Integer visitString(CONSTANT_String_info info, Void p) {
- print("#" + info.string_index);
- tab();
- println("// " + stringValue(info));
- return 1;
- }
-
- public Integer visitUtf8(CONSTANT_Utf8_info info, Void p) {
- println(stringValue(info));
- return 1;
- }
-
- };
- println("Constant pool:");
- indent(+1);
- int width = String.valueOf(constant_pool.size()).length() + 1;
- int cpx = 1;
- while (cpx < constant_pool.size()) {
- print(String.format("%" + width + "s", ("#" + cpx)));
- try {
- CPInfo cpInfo = constant_pool.get(cpx);
- print(String.format(" = %-18s ", cpTagName(cpInfo)));
- cpx += cpInfo.accept(v, null);
- } catch (ConstantPool.InvalidIndex ex) {
- // should not happen
- }
- }
- indent(-1);
- }
-
- protected void write(int cpx) {
- ClassFile classFile = classWriter.getClassFile();
- if (cpx == 0) {
- print("#0");
- return;
- }
-
- CPInfo cpInfo;
- try {
- cpInfo = classFile.constant_pool.get(cpx);
- } catch (ConstantPoolException e) {
- print("#" + cpx);
- return;
- }
-
- int tag = cpInfo.getTag();
- switch (tag) {
- case CONSTANT_Methodref:
- case CONSTANT_InterfaceMethodref:
- case CONSTANT_Fieldref:
- // simplify references within this class
- CPRefInfo ref = (CPRefInfo) cpInfo;
- try {
- if (ref.class_index == classFile.this_class)
- cpInfo = classFile.constant_pool.get(ref.name_and_type_index);
- } catch (ConstantPool.InvalidIndex e) {
- // ignore, for now
- }
- }
- print(tagName(tag) + " " + stringValue(cpInfo));
- }
-
- String cpTagName(CPInfo cpInfo) {
- String n = cpInfo.getClass().getSimpleName();
- return n.replace("CONSTANT_", "").replace("_info", "");
- }
-
- String tagName(int tag) {
- switch (tag) {
- case CONSTANT_Utf8:
- return "Utf8";
- case CONSTANT_Integer:
- return "int";
- case CONSTANT_Float:
- return "float";
- case CONSTANT_Long:
- return "long";
- case CONSTANT_Double:
- return "double";
- case CONSTANT_Class:
- return "class";
- case CONSTANT_String:
- return "String";
- case CONSTANT_Fieldref:
- return "Field";
- case CONSTANT_MethodHandle:
- return "MethodHandle";
- case CONSTANT_MethodType:
- return "MethodType";
- case CONSTANT_Methodref:
- return "Method";
- case CONSTANT_InterfaceMethodref:
- return "InterfaceMethod";
- case CONSTANT_InvokeDynamic:
- return "InvokeDynamic";
- case CONSTANT_NameAndType:
- return "NameAndType";
- default:
- return "(unknown tag " + tag + ")";
- }
- }
-
- String stringValue(int constant_pool_index) {
- ClassFile classFile = classWriter.getClassFile();
- try {
- return stringValue(classFile.constant_pool.get(constant_pool_index));
- } catch (ConstantPool.InvalidIndex e) {
- return report(e);
- }
- }
-
- String stringValue(CPInfo cpInfo) {
- return stringValueVisitor.visit(cpInfo);
- }
-
- StringValueVisitor stringValueVisitor = new StringValueVisitor();
-
- private class StringValueVisitor implements ConstantPool.Visitor {
- public String visit(CPInfo info) {
- return info.accept(this, null);
- }
-
- public String visitClass(CONSTANT_Class_info info, Void p) {
- return getCheckedName(info);
- }
-
- String getCheckedName(CONSTANT_Class_info info) {
- try {
- return checkName(info.getName());
- } catch (ConstantPoolException e) {
- return report(e);
- }
- }
-
- public String visitDouble(CONSTANT_Double_info info, Void p) {
- return info.value + "d";
- }
-
- public String visitFieldref(CONSTANT_Fieldref_info info, Void p) {
- return visitRef(info, p);
- }
-
- public String visitFloat(CONSTANT_Float_info info, Void p) {
- return info.value + "f";
- }
-
- public String visitInteger(CONSTANT_Integer_info info, Void p) {
- return String.valueOf(info.value);
- }
-
- public String visitInterfaceMethodref(CONSTANT_InterfaceMethodref_info info, Void p) {
- return visitRef(info, p);
- }
-
- public String visitInvokeDynamic(CONSTANT_InvokeDynamic_info info, Void p) {
- try {
- String callee = stringValue(info.getNameAndTypeInfo());
- return "#" + info.bootstrap_method_attr_index + ":" + callee;
- } catch (ConstantPoolException e) {
- return report(e);
- }
- }
-
- public String visitLong(CONSTANT_Long_info info, Void p) {
- return info.value + "l";
- }
-
- public String visitNameAndType(CONSTANT_NameAndType_info info, Void p) {
- return getCheckedName(info) + ":" + getType(info);
- }
-
- String getCheckedName(CONSTANT_NameAndType_info info) {
- try {
- return checkName(info.getName());
- } catch (ConstantPoolException e) {
- return report(e);
- }
- }
-
- String getType(CONSTANT_NameAndType_info info) {
- try {
- return info.getType();
- } catch (ConstantPoolException e) {
- return report(e);
- }
- }
-
- public String visitMethodHandle(CONSTANT_MethodHandle_info info, Void p) {
- try {
- return info.reference_kind.name + " " + stringValue(info.getCPRefInfo());
- } catch (ConstantPoolException e) {
- return report(e);
- }
- }
-
- public String visitMethodType(CONSTANT_MethodType_info info, Void p) {
- try {
- return info.getType();
- } catch (ConstantPoolException e) {
- return report(e);
- }
- }
-
- public String visitMethodref(CONSTANT_Methodref_info info, Void p) {
- return visitRef(info, p);
- }
-
- public String visitString(CONSTANT_String_info info, Void p) {
- try {
- ClassFile classFile = classWriter.getClassFile();
- int string_index = info.string_index;
- return stringValue(classFile.constant_pool.getUTF8Info(string_index));
- } catch (ConstantPoolException e) {
- return report(e);
- }
- }
-
- public String visitUtf8(CONSTANT_Utf8_info info, Void p) {
- String s = info.value;
- StringBuilder sb = new StringBuilder();
- for (int i = 0; i < s.length(); i++) {
- char c = s.charAt(i);
- switch (c) {
- case '\t':
- sb.append('\\').append('t');
- break;
- case '\n':
- sb.append('\\').append('n');
- break;
- case '\r':
- sb.append('\\').append('r');
- break;
- case '\b':
- sb.append('\\').append('b');
- break;
- case '\f':
- sb.append('\\').append('f');
- break;
- case '\"':
- sb.append('\\').append('\"');
- break;
- case '\'':
- sb.append('\\').append('\'');
- break;
- case '\\':
- sb.append('\\').append('\\');
- break;
- default:
- sb.append(c);
- }
- }
- return sb.toString();
- }
-
- String visitRef(CPRefInfo info, Void p) {
- String cn = getCheckedClassName(info);
- String nat;
- try {
- nat = stringValue(info.getNameAndTypeInfo());
- } catch (ConstantPoolException e) {
- nat = report(e);
- }
- return cn + "." + nat;
- }
-
- String getCheckedClassName(CPRefInfo info) {
- try {
- return checkName(info.getClassName());
- } catch (ConstantPoolException e) {
- return report(e);
- }
- }
- }
-
- /* If name is a valid binary name, return it; otherwise quote it. */
- private static String checkName(String name) {
- if (name == null)
- return "null";
-
- int len = name.length();
- if (len == 0)
- return "\"\"";
-
- int cc = '/';
- int cp;
- for (int k = 0; k < len; k += Character.charCount(cp)) {
- cp = name.codePointAt(k);
- if ((cc == '/' && !Character.isJavaIdentifierStart(cp))
- || (cp != '/' && !Character.isJavaIdentifierPart(cp))) {
- return "\"" + addEscapes(name) + "\"";
- }
- cc = cp;
- }
-
- return name;
- }
-
- /* If name requires escapes, put them in, so it can be a string body. */
- private static String addEscapes(String name) {
- String esc = "\\\"\n\t";
- String rep = "\\\"nt";
- StringBuilder buf = null;
- int nextk = 0;
- int len = name.length();
- for (int k = 0; k < len; k++) {
- char cp = name.charAt(k);
- int n = esc.indexOf(cp);
- if (n >= 0) {
- if (buf == null)
- buf = new StringBuilder(len * 2);
- if (nextk < k)
- buf.append(name, nextk, k);
- buf.append('\\');
- buf.append(rep.charAt(n));
- nextk = k+1;
- }
- }
- if (buf == null)
- return name;
- if (nextk < len)
- buf.append(name, nextk, len);
- return buf.toString();
- }
-
- private ClassWriter classWriter;
- private Options options;
-}
--- /dev/null 2015-04-26 22:05:36.465433038 -0700
+++ new/langtools/src/jdk.jdeps/share/classes/com/sun/tools/javap/ConstantWriter.java 2015-05-26 21:42:33.703833035 -0700
@@ -0,0 +1,466 @@
+/*
+ * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.javap;
+
+import com.sun.tools.classfile.ClassFile;
+import com.sun.tools.classfile.ConstantPool;
+import com.sun.tools.classfile.ConstantPoolException;
+
+import static com.sun.tools.classfile.ConstantPool.*;
+
+/*
+ * Write a constant pool entry.
+ *
+ * This is NOT part of any supported API.
+ * If you write code that depends on this, you do so at your own risk.
+ * This code and its internal interfaces are subject to change or
+ * deletion without notice.
+ */
+public class ConstantWriter extends BasicWriter {
+ public static ConstantWriter instance(Context context) {
+ ConstantWriter instance = context.get(ConstantWriter.class);
+ if (instance == null)
+ instance = new ConstantWriter(context);
+ return instance;
+ }
+
+ protected ConstantWriter(Context context) {
+ super(context);
+ context.put(ConstantWriter.class, this);
+ classWriter = ClassWriter.instance(context);
+ options = Options.instance(context);
+ }
+
+ protected void writeConstantPool() {
+ ConstantPool constant_pool = classWriter.getClassFile().constant_pool;
+ writeConstantPool(constant_pool);
+ }
+
+ protected void writeConstantPool(ConstantPool constant_pool) {
+ ConstantPool.Visitor v = new ConstantPool.Visitor() {
+ public Integer visitClass(CONSTANT_Class_info info, Void p) {
+ print("#" + info.name_index);
+ tab();
+ println("// " + stringValue(info));
+ return 1;
+ }
+
+ public Integer visitDouble(CONSTANT_Double_info info, Void p) {
+ println(stringValue(info));
+ return 2;
+ }
+
+ public Integer visitFieldref(CONSTANT_Fieldref_info info, Void p) {
+ print("#" + info.class_index + ".#" + info.name_and_type_index);
+ tab();
+ println("// " + stringValue(info));
+ return 1;
+ }
+
+ public Integer visitFloat(CONSTANT_Float_info info, Void p) {
+ println(stringValue(info));
+ return 1;
+ }
+
+ public Integer visitInteger(CONSTANT_Integer_info info, Void p) {
+ println(stringValue(info));
+ return 1;
+ }
+
+ public Integer visitInterfaceMethodref(CONSTANT_InterfaceMethodref_info info, Void p) {
+ print("#" + info.class_index + ".#" + info.name_and_type_index);
+ tab();
+ println("// " + stringValue(info));
+ return 1;
+ }
+
+ public Integer visitInvokeDynamic(CONSTANT_InvokeDynamic_info info, Void p) {
+ print("#" + info.bootstrap_method_attr_index + ":#" + info.name_and_type_index);
+ tab();
+ println("// " + stringValue(info));
+ return 1;
+ }
+
+ public Integer visitLong(CONSTANT_Long_info info, Void p) {
+ println(stringValue(info));
+ return 2;
+ }
+
+ public Integer visitNameAndType(CONSTANT_NameAndType_info info, Void p) {
+ print("#" + info.name_index + ":#" + info.type_index);
+ tab();
+ println("// " + stringValue(info));
+ return 1;
+ }
+
+ public Integer visitMethodref(CONSTANT_Methodref_info info, Void p) {
+ print("#" + info.class_index + ".#" + info.name_and_type_index);
+ tab();
+ println("// " + stringValue(info));
+ return 1;
+ }
+
+ public Integer visitMethodHandle(CONSTANT_MethodHandle_info info, Void p) {
+ print("#" + info.reference_kind.tag + ":#" + info.reference_index);
+ tab();
+ println("// " + stringValue(info));
+ return 1;
+ }
+
+ public Integer visitMethodType(CONSTANT_MethodType_info info, Void p) {
+ print("#" + info.descriptor_index);
+ tab();
+ println("// " + stringValue(info));
+ return 1;
+ }
+
+ public Integer visitString(CONSTANT_String_info info, Void p) {
+ print("#" + info.string_index);
+ tab();
+ println("// " + stringValue(info));
+ return 1;
+ }
+
+ public Integer visitUtf8(CONSTANT_Utf8_info info, Void p) {
+ println(stringValue(info));
+ return 1;
+ }
+
+ };
+ println("Constant pool:");
+ indent(+1);
+ int width = String.valueOf(constant_pool.size()).length() + 1;
+ int cpx = 1;
+ while (cpx < constant_pool.size()) {
+ print(String.format("%" + width + "s", ("#" + cpx)));
+ try {
+ CPInfo cpInfo = constant_pool.get(cpx);
+ print(String.format(" = %-18s ", cpTagName(cpInfo)));
+ cpx += cpInfo.accept(v, null);
+ } catch (ConstantPool.InvalidIndex ex) {
+ // should not happen
+ }
+ }
+ indent(-1);
+ }
+
+ protected void write(int cpx) {
+ ClassFile classFile = classWriter.getClassFile();
+ if (cpx == 0) {
+ print("#0");
+ return;
+ }
+
+ CPInfo cpInfo;
+ try {
+ cpInfo = classFile.constant_pool.get(cpx);
+ } catch (ConstantPoolException e) {
+ print("#" + cpx);
+ return;
+ }
+
+ int tag = cpInfo.getTag();
+ switch (tag) {
+ case CONSTANT_Methodref:
+ case CONSTANT_InterfaceMethodref:
+ case CONSTANT_Fieldref:
+ // simplify references within this class
+ CPRefInfo ref = (CPRefInfo) cpInfo;
+ try {
+ if (ref.class_index == classFile.this_class)
+ cpInfo = classFile.constant_pool.get(ref.name_and_type_index);
+ } catch (ConstantPool.InvalidIndex e) {
+ // ignore, for now
+ }
+ }
+ print(tagName(tag) + " " + stringValue(cpInfo));
+ }
+
+ String cpTagName(CPInfo cpInfo) {
+ String n = cpInfo.getClass().getSimpleName();
+ return n.replace("CONSTANT_", "").replace("_info", "");
+ }
+
+ String tagName(int tag) {
+ switch (tag) {
+ case CONSTANT_Utf8:
+ return "Utf8";
+ case CONSTANT_Integer:
+ return "int";
+ case CONSTANT_Float:
+ return "float";
+ case CONSTANT_Long:
+ return "long";
+ case CONSTANT_Double:
+ return "double";
+ case CONSTANT_Class:
+ return "class";
+ case CONSTANT_String:
+ return "String";
+ case CONSTANT_Fieldref:
+ return "Field";
+ case CONSTANT_MethodHandle:
+ return "MethodHandle";
+ case CONSTANT_MethodType:
+ return "MethodType";
+ case CONSTANT_Methodref:
+ return "Method";
+ case CONSTANT_InterfaceMethodref:
+ return "InterfaceMethod";
+ case CONSTANT_InvokeDynamic:
+ return "InvokeDynamic";
+ case CONSTANT_NameAndType:
+ return "NameAndType";
+ default:
+ return "(unknown tag " + tag + ")";
+ }
+ }
+
+ String stringValue(int constant_pool_index) {
+ ClassFile classFile = classWriter.getClassFile();
+ try {
+ return stringValue(classFile.constant_pool.get(constant_pool_index));
+ } catch (ConstantPool.InvalidIndex e) {
+ return report(e);
+ }
+ }
+
+ String stringValue(CPInfo cpInfo) {
+ return stringValueVisitor.visit(cpInfo);
+ }
+
+ StringValueVisitor stringValueVisitor = new StringValueVisitor();
+
+ private class StringValueVisitor implements ConstantPool.Visitor {
+ public String visit(CPInfo info) {
+ return info.accept(this, null);
+ }
+
+ public String visitClass(CONSTANT_Class_info info, Void p) {
+ return getCheckedName(info);
+ }
+
+ String getCheckedName(CONSTANT_Class_info info) {
+ try {
+ return checkName(info.getName());
+ } catch (ConstantPoolException e) {
+ return report(e);
+ }
+ }
+
+ public String visitDouble(CONSTANT_Double_info info, Void p) {
+ return info.value + "d";
+ }
+
+ public String visitFieldref(CONSTANT_Fieldref_info info, Void p) {
+ return visitRef(info, p);
+ }
+
+ public String visitFloat(CONSTANT_Float_info info, Void p) {
+ return info.value + "f";
+ }
+
+ public String visitInteger(CONSTANT_Integer_info info, Void p) {
+ return String.valueOf(info.value);
+ }
+
+ public String visitInterfaceMethodref(CONSTANT_InterfaceMethodref_info info, Void p) {
+ return visitRef(info, p);
+ }
+
+ public String visitInvokeDynamic(CONSTANT_InvokeDynamic_info info, Void p) {
+ try {
+ String callee = stringValue(info.getNameAndTypeInfo());
+ return "#" + info.bootstrap_method_attr_index + ":" + callee;
+ } catch (ConstantPoolException e) {
+ return report(e);
+ }
+ }
+
+ public String visitLong(CONSTANT_Long_info info, Void p) {
+ return info.value + "l";
+ }
+
+ public String visitNameAndType(CONSTANT_NameAndType_info info, Void p) {
+ return getCheckedName(info) + ":" + getType(info);
+ }
+
+ String getCheckedName(CONSTANT_NameAndType_info info) {
+ try {
+ return checkName(info.getName());
+ } catch (ConstantPoolException e) {
+ return report(e);
+ }
+ }
+
+ String getType(CONSTANT_NameAndType_info info) {
+ try {
+ return info.getType();
+ } catch (ConstantPoolException e) {
+ return report(e);
+ }
+ }
+
+ public String visitMethodHandle(CONSTANT_MethodHandle_info info, Void p) {
+ try {
+ return info.reference_kind.name + " " + stringValue(info.getCPRefInfo());
+ } catch (ConstantPoolException e) {
+ return report(e);
+ }
+ }
+
+ public String visitMethodType(CONSTANT_MethodType_info info, Void p) {
+ try {
+ return info.getType();
+ } catch (ConstantPoolException e) {
+ return report(e);
+ }
+ }
+
+ public String visitMethodref(CONSTANT_Methodref_info info, Void p) {
+ return visitRef(info, p);
+ }
+
+ public String visitString(CONSTANT_String_info info, Void p) {
+ try {
+ ClassFile classFile = classWriter.getClassFile();
+ int string_index = info.string_index;
+ return stringValue(classFile.constant_pool.getUTF8Info(string_index));
+ } catch (ConstantPoolException e) {
+ return report(e);
+ }
+ }
+
+ public String visitUtf8(CONSTANT_Utf8_info info, Void p) {
+ String s = info.value;
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < s.length(); i++) {
+ char c = s.charAt(i);
+ switch (c) {
+ case '\t':
+ sb.append('\\').append('t');
+ break;
+ case '\n':
+ sb.append('\\').append('n');
+ break;
+ case '\r':
+ sb.append('\\').append('r');
+ break;
+ case '\b':
+ sb.append('\\').append('b');
+ break;
+ case '\f':
+ sb.append('\\').append('f');
+ break;
+ case '\"':
+ sb.append('\\').append('\"');
+ break;
+ case '\'':
+ sb.append('\\').append('\'');
+ break;
+ case '\\':
+ sb.append('\\').append('\\');
+ break;
+ default:
+ sb.append(c);
+ }
+ }
+ return sb.toString();
+ }
+
+ String visitRef(CPRefInfo info, Void p) {
+ String cn = getCheckedClassName(info);
+ String nat;
+ try {
+ nat = stringValue(info.getNameAndTypeInfo());
+ } catch (ConstantPoolException e) {
+ nat = report(e);
+ }
+ return cn + "." + nat;
+ }
+
+ String getCheckedClassName(CPRefInfo info) {
+ try {
+ return checkName(info.getClassName());
+ } catch (ConstantPoolException e) {
+ return report(e);
+ }
+ }
+ }
+
+ /* If name is a valid binary name, return it; otherwise quote it. */
+ private static String checkName(String name) {
+ if (name == null)
+ return "null";
+
+ int len = name.length();
+ if (len == 0)
+ return "\"\"";
+
+ int cc = '/';
+ int cp;
+ for (int k = 0; k < len; k += Character.charCount(cp)) {
+ cp = name.codePointAt(k);
+ if ((cc == '/' && !Character.isJavaIdentifierStart(cp))
+ || (cp != '/' && !Character.isJavaIdentifierPart(cp))) {
+ return "\"" + addEscapes(name) + "\"";
+ }
+ cc = cp;
+ }
+
+ return name;
+ }
+
+ /* If name requires escapes, put them in, so it can be a string body. */
+ private static String addEscapes(String name) {
+ String esc = "\\\"\n\t";
+ String rep = "\\\"nt";
+ StringBuilder buf = null;
+ int nextk = 0;
+ int len = name.length();
+ for (int k = 0; k < len; k++) {
+ char cp = name.charAt(k);
+ int n = esc.indexOf(cp);
+ if (n >= 0) {
+ if (buf == null)
+ buf = new StringBuilder(len * 2);
+ if (nextk < k)
+ buf.append(name, nextk, k);
+ buf.append('\\');
+ buf.append(rep.charAt(n));
+ nextk = k+1;
+ }
+ }
+ if (buf == null)
+ return name;
+ if (nextk < len)
+ buf.append(name, nextk, len);
+ return buf.toString();
+ }
+
+ private ClassWriter classWriter;
+ private Options options;
+}