< prev index next >

modules/base/src/main/java/javafx/beans/property/BooleanPropertyBase.java

Print this page
rev 9211 : 8130458: Memory leak in bind/unbind of [Primitive]PropertyBase

*** 163,183 **** if (rawObservable == null) { throw new NullPointerException("Cannot bind to null"); } final ObservableBooleanValue newObservable = (rawObservable instanceof ObservableBooleanValue) ? (ObservableBooleanValue) rawObservable ! : new BooleanBinding() { ! { ! super.bind(rawObservable); ! } ! ! @Override ! protected boolean computeValue() { ! final Boolean value = rawObservable.getValue(); ! return (value == null)? false : value; ! } ! }; if (!newObservable.equals(observable)) { unbind(); observable = newObservable; if (listener == null) { --- 163,173 ---- if (rawObservable == null) { throw new NullPointerException("Cannot bind to null"); } final ObservableBooleanValue newObservable = (rawObservable instanceof ObservableBooleanValue) ? (ObservableBooleanValue) rawObservable ! : new ValueWrapper(rawObservable); if (!newObservable.equals(observable)) { unbind(); observable = newObservable; if (listener == null) {
*** 194,203 **** --- 184,196 ---- @Override public void unbind() { if (observable != null) { value = observable.get(); observable.removeListener(listener); + if (observable instanceof ValueWrapper) { + ((ValueWrapper)observable).dispose(); + } observable = null; } } /**
*** 250,255 **** --- 243,268 ---- @Override public boolean wasGarbageCollected() { return wref.get() == null; } } + + private class ValueWrapper extends BooleanBinding { + private ObservableValue<? extends Boolean> observable; + + public ValueWrapper(ObservableValue<? extends Boolean> observable) { + this.observable = observable; + bind(observable); + } + + @Override + protected boolean computeValue() { + final Boolean value = observable.getValue(); + return (value == null) ? false : value; + } + + @Override + public void dispose() { + unbind(observable); + } + } }
< prev index next >