rt/vm/src/main/java/org/apidesign/vm4brwsr/ClassDataCache.java
branchclosure
changeset 1085 6a4ef883e233
parent 1084 f5c9934a252c
child 1087 d868b5a67b9b
     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