104 105 StringBuilder sb = new StringBuilder(); 106 if (pkg != null && ! pkg.isEmpty()) { 107 sb.append(pkg.replace('.', '/')); 108 if (sb.charAt(sb.length() - 1) != '/') { 109 sb.append('/'); 110 } 111 } 112 sb.append(name); 113 for (String n: nested) { 114 sb.append('$'); 115 sb.append(n); 116 } 117 return sb.toString(); 118 } 119 120 public static String getName(Type type) { 121 return LayoutUtils.getName(type); 122 } 123 124 public static String ClassToDescriptor(Class<?> cls) { 125 if (cls.isArray()) { 126 return cls.getName(); 127 } 128 if (cls.isPrimitive()) { 129 switch (cls.getTypeName()) { 130 case "int": 131 return "I"; 132 case "long": 133 return "J"; 134 case "byte": 135 return "B"; 136 case "char": 137 return "C"; 138 case "float": 139 return "F"; 140 case "double": 141 return "D"; 142 case "short": 143 return "S"; 144 case "boolean": 145 return "Z"; 146 case "void": 147 return "V"; 148 } 149 } 150 // assuming reference 151 return "L" + cls.getName() + ";"; 152 } 153 154 public static String DescriptorToBinaryName(String descriptor) { 155 final char[] ar = descriptor.trim().toCharArray(); 156 switch (ar[0]) { 157 case '(': 158 throw new IllegalArgumentException("Method descriptor is not allowed"); 159 case 'B': 160 return "byte"; 161 case 'C': 162 return "char"; 163 case 'D': 164 return "double"; 165 case 'F': 166 return "float"; 167 case 'I': 168 return "int"; 169 case 'J': 170 return "long"; 171 case 'S': 172 return "short"; 173 case 'Z': 174 return "boolean"; 175 } 176 177 StringBuilder sb = new StringBuilder(); 178 if (ar[0] == 'L') { 179 for (int i = 1; i < ar.length && ar[i] != ';'; i++) { 180 if (ar[i] == '/') { 181 sb.append('.'); 182 } 183 if (!Character.isJavaIdentifierPart(ar[i])) { 184 throw new IllegalArgumentException("Malformed descriptor"); 185 } 186 sb.append(ar[i]); 187 } 188 return sb.toString(); 189 } 190 191 if (ar[0] == '[') { 192 int depth = 1; 193 while (ar[depth] == '[') depth++; 194 sb.append(DescriptorToBinaryName(descriptor.substring(depth))); 195 for (int i = 0; i < depth; i++) { 196 sb.append("[]"); 197 } 198 return sb.toString(); 199 } 200 201 throw new IllegalArgumentException("Malformed descriptor"); 202 } 203 204 public static Layout getLayout(Type type) { 205 return LayoutUtils.getLayout(type); 206 } 207 208 public static Function getFunction(Type type) { 209 return LayoutUtils.getFunction(type); 210 } 211 212 public static Class<?> unboxIfNeeded(Class<?> clazz) { 213 if (clazz == Boolean.class) { 214 return boolean.class; 215 } else if (clazz == Void.class) { 216 return void.class; 217 } else if (clazz == Byte.class) { 218 return byte.class; 219 } else if (clazz == Character.class) { 220 return char.class; 221 } else if (clazz == Short.class) { 222 return short.class; 223 } else if (clazz == Integer.class) { | 104 105 StringBuilder sb = new StringBuilder(); 106 if (pkg != null && ! pkg.isEmpty()) { 107 sb.append(pkg.replace('.', '/')); 108 if (sb.charAt(sb.length() - 1) != '/') { 109 sb.append('/'); 110 } 111 } 112 sb.append(name); 113 for (String n: nested) { 114 sb.append('$'); 115 sb.append(n); 116 } 117 return sb.toString(); 118 } 119 120 public static String getName(Type type) { 121 return LayoutUtils.getName(type); 122 } 123 124 public static Layout getLayout(Type type) { 125 return LayoutUtils.getLayout(type); 126 } 127 128 public static Function getFunction(Type type) { 129 return LayoutUtils.getFunction(type); 130 } 131 132 public static Class<?> unboxIfNeeded(Class<?> clazz) { 133 if (clazz == Boolean.class) { 134 return boolean.class; 135 } else if (clazz == Void.class) { 136 return void.class; 137 } else if (clazz == Byte.class) { 138 return byte.class; 139 } else if (clazz == Character.class) { 140 return char.class; 141 } else if (clazz == Short.class) { 142 return short.class; 143 } else if (clazz == Integer.class) { |