1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ClassDataCache.java Mon May 06 18:06:08 2013 +0200
1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ClassDataCache.java Tue May 07 19:01:14 2013 +0200
1.3 @@ -23,6 +23,8 @@
1.4 import java.util.Map;
1.5 import org.apidesign.bck2brwsr.core.ExtraJavaScript;
1.6 import org.apidesign.vm4brwsr.ByteCodeParser.ClassData;
1.7 +import org.apidesign.vm4brwsr.ByteCodeParser.FieldData;
1.8 +import org.apidesign.vm4brwsr.ByteCodeParser.MethodData;
1.9
1.10 @ExtraJavaScript(processByteCode = false, resource="")
1.11 final class ClassDataCache {
1.12 @@ -37,7 +39,12 @@
1.13 classDataMap = new HashMap<String, Object>();
1.14 }
1.15
1.16 - ClassData getClassData(final String className) throws IOException {
1.17 + ClassData getClassData(String className) throws IOException {
1.18 + if (className.startsWith("[")) {
1.19 + // required for accessVirtualMethod, shouldn't be problematic for
1.20 + // calls from other sources
1.21 + className = "java/lang/Object";
1.22 + }
1.23 Object cacheEntry = classDataMap.get(className);
1.24 if (cacheEntry == null) {
1.25 final InputStream is = loadClass(resources, className);
1.26 @@ -48,6 +55,58 @@
1.27 return (cacheEntry != MISSING_CLASS) ? (ClassData) cacheEntry : null;
1.28 }
1.29
1.30 + MethodData findMethod(final String startingClass,
1.31 + final String name,
1.32 + final String signature) throws IOException {
1.33 + return findMethod(getClassData(startingClass), name, signature);
1.34 + }
1.35 +
1.36 + FieldData findField(final String startingClass,
1.37 + final String name,
1.38 + final String signature) throws IOException {
1.39 + return findField(getClassData(startingClass), name, signature);
1.40 + }
1.41 +
1.42 + MethodData findMethod(ClassData currentClass,
1.43 + final String name,
1.44 + final String signature) throws IOException {
1.45 + while (currentClass != null) {
1.46 + final MethodData methodData =
1.47 + currentClass.findMethod(name, signature);
1.48 + if (methodData != null) {
1.49 + return methodData;
1.50 + }
1.51 +
1.52 + final String superClassName = currentClass.getSuperClassName();
1.53 + if (superClassName == null) {
1.54 + break;
1.55 + }
1.56 + currentClass = getClassData(superClassName);
1.57 + }
1.58 +
1.59 + return null;
1.60 + }
1.61 +
1.62 + FieldData findField(ClassData currentClass,
1.63 + final String name,
1.64 + final String signature) throws IOException {
1.65 + while (currentClass != null) {
1.66 + final FieldData fieldData =
1.67 + currentClass.findField(name, signature);
1.68 + if (fieldData != null) {
1.69 + return fieldData;
1.70 + }
1.71 +
1.72 + final String superClassName = currentClass.getSuperClassName();
1.73 + if (superClassName == null) {
1.74 + break;
1.75 + }
1.76 + currentClass = getClassData(superClassName);
1.77 + }
1.78 +
1.79 + return null;
1.80 + }
1.81 +
1.82 private static InputStream loadClass(Bck2Brwsr.Resources l, String name)
1.83 throws IOException {
1.84 return l.get(name + ".class"); // NOI18N