rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java
changeset 1801 a29572878b0e
parent 1800 65cab8539582
child 1810 260d731c9504
     1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Fri Feb 27 19:28:07 2015 +0100
     1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java	Fri Feb 27 20:55:00 2015 +0100
     1.3 @@ -29,6 +29,7 @@
     1.4  abstract class ByteCodeToJavaScript implements Appendable {
     1.5      private ClassData jc;
     1.6      private final Appendable out;
     1.7 +    private final StringArray classRefs = new StringArray();
     1.8      private boolean outChanged;
     1.9      private boolean callbacks;
    1.10  
    1.11 @@ -85,11 +86,12 @@
    1.12          return classOperation;
    1.13      }
    1.14      
    1.15 -    String accessClassFalse(String classOperation) {
    1.16 +    final String accessClassFalse(String classOperation) {
    1.17          if (jc.getClassName().replace('/', '_').equals(classOperation)) {
    1.18              return "c";
    1.19          }
    1.20 -        return accessClass(classOperation) + "(false)";
    1.21 +        classRefs.addIfMissing(classOperation);
    1.22 +        return "(refs_" + classOperation + " || (refs_" + classOperation + " = " + accessClass(classOperation) + "(false)))";
    1.23      }
    1.24  
    1.25      protected String accessField(String object, String mangledName,
    1.26 @@ -323,6 +325,10 @@
    1.27          for (String init : toInitilize.toArray()) {
    1.28              append("\n    ").append(init).append("();");
    1.29          }
    1.30 +        for (String ref : classRefs.toArray()) {
    1.31 +            append("\n    var refs_").append(ref).append(";");
    1.32 +        }
    1.33 +        classRefs.clear();
    1.34          
    1.35          if (jsResource != null) {
    1.36              requireResource(jsResource);