1 /*
2 * Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
67 parseError(str, "not a method type");
68 }
69 Class<?> rtype = parseSig(str, i, end, loader);
70 if (rtype == null || i[0] != end)
71 parseError(str, "bad return type");
72 ptypes.add(rtype);
73 return ptypes;
74 }
75
76 private static void parseError(String str, String msg) {
77 throw new IllegalArgumentException("bad signature: "+str+": "+msg);
78 }
79
80 /**
81 * @param loader the class loader in which to look up the types (null means
82 * bootstrap class loader)
83 */
84 private static Class<?> parseSig(String str, int[] i, int end, ClassLoader loader) {
85 if (i[0] == end) return null;
86 char c = str.charAt(i[0]++);
87 if (c == 'L') {
88 int begc = i[0], endc = str.indexOf(';', begc);
89 if (endc < 0) return null;
90 i[0] = endc+1;
91 String name = str.substring(begc, endc).replace('/', '.');
92 try {
93 return Class.forName(name, false, loader);
94 } catch (ClassNotFoundException ex) {
95 throw new TypeNotPresentException(name, ex);
96 }
97 } else if (c == '[') {
98 Class<?> t = parseSig(str, i, end, loader);
99 if (t != null)
100 t = java.lang.reflect.Array.newInstance(t, 0).getClass();
101 return t;
102 } else {
103 return Wrapper.forBasicType(c).primitiveType();
104 }
105 }
106
107 public static String unparse(Class<?> type) {
108 if (type == Object.class) {
109 return "Ljava/lang/Object;";
110 } else if (type == int.class) {
111 return "I";
112 }
113 return type.descriptorString();
|
1 /*
2 * Copyright (c) 2008, 2020, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
67 parseError(str, "not a method type");
68 }
69 Class<?> rtype = parseSig(str, i, end, loader);
70 if (rtype == null || i[0] != end)
71 parseError(str, "bad return type");
72 ptypes.add(rtype);
73 return ptypes;
74 }
75
76 private static void parseError(String str, String msg) {
77 throw new IllegalArgumentException("bad signature: "+str+": "+msg);
78 }
79
80 /**
81 * @param loader the class loader in which to look up the types (null means
82 * bootstrap class loader)
83 */
84 private static Class<?> parseSig(String str, int[] i, int end, ClassLoader loader) {
85 if (i[0] == end) return null;
86 char c = str.charAt(i[0]++);
87 if (c == 'L' || c == 'Q') {
88 int begc = i[0], endc = str.indexOf(';', begc);
89 if (endc < 0) return null;
90 i[0] = endc+1;
91 String name = str.substring(begc, endc).replace('/', '.');
92 try {
93 Class<?> clz = Class.forName(name, false, loader);
94 return c == 'Q' ? clz.asValueType() : clz.asPrimaryType();
95 } catch (ClassNotFoundException ex) {
96 throw new TypeNotPresentException(name, ex);
97 }
98 } else if (c == '[') {
99 Class<?> t = parseSig(str, i, end, loader);
100 if (t != null)
101 t = java.lang.reflect.Array.newInstance(t, 0).getClass();
102 return t;
103 } else {
104 return Wrapper.forBasicType(c).primitiveType();
105 }
106 }
107
108 public static String unparse(Class<?> type) {
109 if (type == Object.class) {
110 return "Ljava/lang/Object;";
111 } else if (type == int.class) {
112 return "I";
113 }
114 return type.descriptorString();
|