Root object needs to be hold via strong reference gc
authorJaroslav Tulach <jtulach@netbeans.org>
Wed, 12 Nov 2014 10:56:18 +0100
branchgc
changeset 871d943cdd696d7
parent 870 77bff7390451
child 872 1b8f1aed344a
Root object needs to be hold via strong reference
json-tck/src/main/java/net/java/html/json/tests/GCTest.java
ko4j/src/main/java/org/netbeans/html/ko4j/FXContext.java
ko4j/src/main/java/org/netbeans/html/ko4j/Knockout.java
     1.1 --- a/json-tck/src/main/java/net/java/html/json/tests/GCTest.java	Wed Nov 12 10:48:12 2014 +0100
     1.2 +++ b/json-tck/src/main/java/net/java/html/json/tests/GCTest.java	Wed Nov 12 10:56:18 2014 +0100
     1.3 @@ -90,6 +90,10 @@
     1.4              Reference<?> ref = new WeakReference<Object>(removed);
     1.5              removed = null;
     1.6              assertGC(ref, "Can removed object disappear?");
     1.7 +            
     1.8 +            ref = new WeakReference<Object>(m);
     1.9 +            m = null;
    1.10 +            assertNotGC(ref, "Root model cannot GC");
    1.11          } finally {
    1.12              Utils.exposeHTML(GCTest.class, "");
    1.13          }
    1.14 @@ -108,11 +112,27 @@
    1.15                      + "}\n"
    1.16                      + "return arr.length;";
    1.17              Object cnt = Utils.executeScript(GCTest.class, gc, Math.pow(2.0, i));
    1.18 -            System.err.println("cnt: " + cnt);
    1.19              System.gc();
    1.20              System.runFinalization();
    1.21          }
    1.22          throw new OutOfMemoryError(msg);
    1.23      }
    1.24      
    1.25 +    private void assertNotGC(Reference<?> ref, String msg) throws Exception {
    1.26 +        for (int i = 0; i < 10; i++) {
    1.27 +            if (ref.get() == null) {
    1.28 +                throw new IllegalStateException(msg);
    1.29 +            }
    1.30 +            String gc = "var max = arguments[0];\n"
    1.31 +                    +  "var arr = [];\n"
    1.32 +                    + "for (var i = 0; i < max; i++) {\n"
    1.33 +                    + "  arr.push(i);\n"
    1.34 +                    + "}\n"
    1.35 +                    + "return arr.length;";
    1.36 +            Object cnt = Utils.executeScript(GCTest.class, gc, Math.pow(2.0, i));
    1.37 +            System.gc();
    1.38 +            System.runFinalization();
    1.39 +        }
    1.40 +    }
    1.41 +    
    1.42  }
     2.1 --- a/ko4j/src/main/java/org/netbeans/html/ko4j/FXContext.java	Wed Nov 12 10:48:12 2014 +0100
     2.2 +++ b/ko4j/src/main/java/org/netbeans/html/ko4j/FXContext.java	Wed Nov 12 10:56:18 2014 +0100
     2.3 @@ -135,7 +135,10 @@
     2.4  
     2.5      @Override
     2.6      public void applyBindings(Object data) {
     2.7 -        Knockout.applyBindings(data);
     2.8 +        Object ko = Knockout.applyBindings(data);
     2.9 +        if (ko instanceof Knockout) {
    2.10 +            ((Knockout)ko).hold();
    2.11 +        }
    2.12      }
    2.13  
    2.14      @Override
     3.1 --- a/ko4j/src/main/java/org/netbeans/html/ko4j/Knockout.java	Wed Nov 12 10:48:12 2014 +0100
     3.2 +++ b/ko4j/src/main/java/org/netbeans/html/ko4j/Knockout.java	Wed Nov 12 10:56:18 2014 +0100
     3.3 @@ -62,6 +62,7 @@
     3.4  final class Knockout extends WeakReference<Object> {
     3.5      private final PropertyBinding[] props;
     3.6      private final FunctionBinding[] funcs;
     3.7 +    private Object strong;
     3.8  
     3.9      public Knockout(Object model, PropertyBinding[] props, FunctionBinding[] funcs) {
    3.10          super(model);
    3.11 @@ -75,6 +76,10 @@
    3.12          }
    3.13      }
    3.14      
    3.15 +    final void hold() {
    3.16 +        strong = get();
    3.17 +    }
    3.18 +    
    3.19      final Object getValue(int index) {
    3.20          return props[index].getValue();
    3.21      }
    3.22 @@ -108,11 +113,12 @@
    3.23          Object model, String prop, Object oldValue, Object newValue
    3.24      );
    3.25  
    3.26 -    @JavaScriptBody(args = { "bindings" }, wait4js = false, body = 
    3.27 +    @JavaScriptBody(args = { "bindings" }, body = 
    3.28          "ko['cleanNode'](window['document']['body']);\n" +
    3.29 -        "ko['applyBindings'](bindings);\n"
    3.30 +        "ko['applyBindings'](bindings);\n" +
    3.31 +        "return bindings['ko4j'];\n"
    3.32      )
    3.33 -    native static void applyBindings(Object bindings);
    3.34 +    native static Object applyBindings(Object bindings);
    3.35      
    3.36      @JavaScriptBody(args = { "cnt" }, body = 
    3.37          "var arr = new Array(cnt);\n" +