--- old/src/java.base/share/classes/java/util/stream/StreamSpliterators.java 2016-02-02 15:12:57.221042800 +0600 +++ new/src/java.base/share/classes/java/util/stream/StreamSpliterators.java 2016-02-02 15:12:56.831464900 +0600 @@ -156,6 +156,7 @@ init(); initPartialTraversalState(); + initPusher(); nextToConsume = 0; bufferSink.begin(spliterator.getExactSizeIfKnown()); return fillBuffer(); @@ -176,7 +177,7 @@ * Invokes the shape-specific constructor with the provided arguments * and returns the result. */ - abstract AbstractWrappingSpliterator wrap(Spliterator s); + abstract AbstractWrappingSpliterator wrap(Spliterator s); /** * Initializes buffer, sink chain, and pusher for a shape-specific @@ -184,13 +185,27 @@ */ abstract void initPartialTraversalState(); + void initPusher() { + pusher = () -> spliterator.tryAdvance(bufferSink); + } + @Override public Spliterator trySplit() { if (isParallel && !finished) { init(); Spliterator split = spliterator.trySplit(); - return (split == null) ? null : wrap(split); + if (split == null) + return null; + AbstractWrappingSpliterator prefix = wrap(split); + if (buffer != null) { + prefix.buffer = buffer; + prefix.bufferSink = bufferSink; + prefix.nextToConsume = nextToConsume; + prefix.initPusher(); + buffer = null; + } + return prefix; } else return null; @@ -291,7 +306,6 @@ SpinedBuffer b = new SpinedBuffer<>(); buffer = b; bufferSink = ph.wrapSink(b::accept); - pusher = () -> spliterator.tryAdvance(bufferSink); } @Override @@ -335,7 +349,7 @@ } @Override - AbstractWrappingSpliterator wrap(Spliterator s) { + AbstractWrappingSpliterator wrap(Spliterator s) { return new IntWrappingSpliterator<>(ph, s, isParallel); } @@ -344,7 +358,6 @@ SpinedBuffer.OfInt b = new SpinedBuffer.OfInt(); buffer = b; bufferSink = ph.wrapSink((Sink.OfInt) b::accept); - pusher = () -> spliterator.tryAdvance(bufferSink); } @Override @@ -393,7 +406,7 @@ } @Override - AbstractWrappingSpliterator wrap(Spliterator s) { + AbstractWrappingSpliterator wrap(Spliterator s) { return new LongWrappingSpliterator<>(ph, s, isParallel); } @@ -402,7 +415,6 @@ SpinedBuffer.OfLong b = new SpinedBuffer.OfLong(); buffer = b; bufferSink = ph.wrapSink((Sink.OfLong) b::accept); - pusher = () -> spliterator.tryAdvance(bufferSink); } @Override @@ -451,7 +463,7 @@ } @Override - AbstractWrappingSpliterator wrap(Spliterator s) { + AbstractWrappingSpliterator wrap(Spliterator s) { return new DoubleWrappingSpliterator<>(ph, s, isParallel); } @@ -460,7 +472,6 @@ SpinedBuffer.OfDouble b = new SpinedBuffer.OfDouble(); buffer = b; bufferSink = ph.wrapSink((Sink.OfDouble) b::accept); - pusher = () -> spliterator.tryAdvance(bufferSink); } @Override