# HG changeset patch # User Michael Haupt # Date 1359986346 28800 # Node ID 31d0b30b30a36cc51c31342ba87090b803c1addb # Parent b34ac36d27e18a8ea47a71eaa3b0513f39a59f1d Add MetaUtil.classForName diff -r b34ac36d27e1 -r 31d0b30b30a3 graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaUtil.java --- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaUtil.java Mon Feb 04 05:57:15 2013 -0800 +++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/MetaUtil.java Mon Feb 04 05:59:06 2013 -0800 @@ -177,7 +177,7 @@ public static String toJavaName(JavaType type, boolean qualified) { Kind kind = type.getKind(); if (kind == Kind.Object) { - return internalNameToJava(type.getName(), qualified); + return internalNameToJava(type.getName(), qualified, false); } return type.getKind().getJavaName(); } @@ -196,10 +196,10 @@ * @return the Java name corresponding to {@code type} */ public static String toJavaName(JavaType type) { - return (type == null) ? null : internalNameToJava(type.getName(), true); + return (type == null) ? null : internalNameToJava(type.getName(), true, false); } - private static String internalNameToJava(String name, boolean qualified) { + private static String internalNameToJava(String name, boolean qualified, boolean classForNameCompatible) { switch (name.charAt(0)) { case 'L': { String result = name.substring(1, name.length() - 1).replace('/', '.'); @@ -210,10 +210,9 @@ } } return result; - } case '[': - return internalNameToJava(name.substring(1), qualified) + "[]"; + return classForNameCompatible ? name.replace('/', '.') : internalNameToJava(name.substring(1), qualified, classForNameCompatible) + "[]"; default: if (name.length() != 1) { throw new IllegalArgumentException("Illegal internal name: " + name); @@ -222,6 +221,19 @@ } } + /** + * Turns an class name in internal format into a resolved Java type. + */ + public static ResolvedJavaType classForName(String internal, MetaAccessProvider metaAccess, ClassLoader cl) { + Kind k = Kind.fromTypeString(internal); + try { + String n = internalNameToJava(internal, true, true); + return metaAccess.lookupJavaType(k.isPrimitive() ? k.toJavaClass() : Class.forName(n, true, cl)); + } catch (ClassNotFoundException cnfe) { + throw new IllegalArgumentException("could not instantiate class described by " + internal, cnfe); + } + } + /** * Gets a string for a given method formatted according to a given format specification. A * format specification is composed of characters that are to be copied verbatim to the result