diff -r f5c9934a252c -r 6a4ef883e233 rt/vm/src/main/java/org/apidesign/vm4brwsr/ClassDataCache.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ClassDataCache.java Mon May 06 18:06:08 2013 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ClassDataCache.java Tue May 07 19:01:14 2013 +0200 @@ -23,6 +23,8 @@ import java.util.Map; import org.apidesign.bck2brwsr.core.ExtraJavaScript; import org.apidesign.vm4brwsr.ByteCodeParser.ClassData; +import org.apidesign.vm4brwsr.ByteCodeParser.FieldData; +import org.apidesign.vm4brwsr.ByteCodeParser.MethodData; @ExtraJavaScript(processByteCode = false, resource="") final class ClassDataCache { @@ -37,7 +39,12 @@ classDataMap = new HashMap(); } - ClassData getClassData(final String className) throws IOException { + ClassData getClassData(String className) throws IOException { + if (className.startsWith("[")) { + // required for accessVirtualMethod, shouldn't be problematic for + // calls from other sources + className = "java/lang/Object"; + } Object cacheEntry = classDataMap.get(className); if (cacheEntry == null) { final InputStream is = loadClass(resources, className); @@ -48,6 +55,58 @@ return (cacheEntry != MISSING_CLASS) ? (ClassData) cacheEntry : null; } + MethodData findMethod(final String startingClass, + final String name, + final String signature) throws IOException { + return findMethod(getClassData(startingClass), name, signature); + } + + FieldData findField(final String startingClass, + final String name, + final String signature) throws IOException { + return findField(getClassData(startingClass), name, signature); + } + + MethodData findMethod(ClassData currentClass, + final String name, + final String signature) throws IOException { + while (currentClass != null) { + final MethodData methodData = + currentClass.findMethod(name, signature); + if (methodData != null) { + return methodData; + } + + final String superClassName = currentClass.getSuperClassName(); + if (superClassName == null) { + break; + } + currentClass = getClassData(superClassName); + } + + return null; + } + + FieldData findField(ClassData currentClass, + final String name, + final String signature) throws IOException { + while (currentClass != null) { + final FieldData fieldData = + currentClass.findField(name, signature); + if (fieldData != null) { + return fieldData; + } + + final String superClassName = currentClass.getSuperClassName(); + if (superClassName == null) { + break; + } + currentClass = getClassData(superClassName); + } + + return null; + } + private static InputStream loadClass(Bck2Brwsr.Resources l, String name) throws IOException { return l.get(name + ".class"); // NOI18N