Skip to content

Commit

Permalink
Merge pull request ReactiveX#447 from mattrjacobs/internal-impl-cache
Browse files Browse the repository at this point in the history
Caching the result of 'isInternalImplementation'
  • Loading branch information
benjchristensen committed Oct 22, 2013
2 parents df02670 + d62ce3d commit 9cf1110
Showing 1 changed file with 17 additions and 4 deletions.
21 changes: 17 additions & 4 deletions rxjava-core/src/main/java/rx/Observable.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

Expand Down Expand Up @@ -129,6 +130,8 @@
*/
public class Observable<T> {

private final static ConcurrentHashMap<Class, Boolean> internalClassMap = new ConcurrentHashMap<Class, Boolean>();

/**
* Executed when 'subscribe' is invoked.
*/
Expand Down Expand Up @@ -4545,11 +4548,21 @@ private boolean isInternalImplementation(Object o) {
return true;
}
// prevent double-wrapping (yeah it happens)
if (o instanceof SafeObserver)
if (o instanceof SafeObserver) {
return true;
// we treat the following package as "internal" and don't wrap it
Package p = o.getClass().getPackage(); // it can be null
return p != null && p.getName().startsWith("rx.operators");
}

Class<?> clazz = o.getClass();
if (internalClassMap.containsKey(clazz)) {
//don't need to do reflection
return internalClassMap.get(clazz);
} else {
// we treat the following package as "internal" and don't wrap it
Package p = o.getClass().getPackage(); // it can be null
Boolean isInternal = (p != null && p.getName().startsWith("rx.operators"));
internalClassMap.put(clazz, isInternal);
return isInternal;
}
}

}

0 comments on commit 9cf1110

Please sign in to comment.