diff -r 2ac4283ee209 -r d868b5a67b9b rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Wed May 08 14:54:32 2013 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Wed May 08 17:47:47 2013 +0200 @@ -115,7 +115,7 @@ protected void declaredMethod(MethodData methodData, String destObject, String mangledName) throws IOException { - if (exportedSymbols.isExported(methodData)) { + if (isHierarchyExported(methodData)) { exportMember(destObject, mangledName); } } @@ -317,7 +317,7 @@ && (((method.access & ByteCodeParser.ACC_FINAL) != 0) || ((referencedClass.getAccessFlags() & ByteCodeParser.ACC_FINAL) != 0) - || !exportedSymbols.isExported(method))) { + || !isHierarchyExported(method))) { return object + "." + mangledName; } @@ -331,6 +331,28 @@ return "invoker." + mangledName + '(' + object + ')'; } + private boolean isHierarchyExported(final MethodData methodData) + throws IOException { + if (exportedSymbols.isExported(methodData)) { + return true; + } + if ((methodData.access & (ByteCodeParser.ACC_PRIVATE + | ByteCodeParser.ACC_STATIC)) != 0) { + return false; + } + + final ExportedMethodFinder exportedMethodFinder = + new ExportedMethodFinder(exportedSymbols); + + classDataCache.findMethods( + methodData.cls, + methodData.getName(), + methodData.getInternalSig(), + exportedMethodFinder); + + return (exportedMethodFinder.getFound() != null); + } + private static String accessNonVirtualMember(String object, String mangledName, ClassData declaringClass) { @@ -338,6 +360,33 @@ : object + "['" + mangledName + "']"; } + private static final class ExportedMethodFinder + implements ClassDataCache.TraversalCallback { + private final ExportedSymbols exportedSymbols; + private MethodData found; + + public ExportedMethodFinder(final ExportedSymbols exportedSymbols) { + this.exportedSymbols = exportedSymbols; + } + + @Override + public boolean traverse(final MethodData methodData) { + try { + if (exportedSymbols.isExported(methodData)) { + found = methodData; + return false; + } + } catch (final IOException e) { + } + + return true; + } + + public MethodData getFound() { + return found; + } + } + private static final class Standalone extends VM { private Standalone(Appendable out, Bck2Brwsr.Resources resources) { super(out, resources);