Github user spmallette commented on a diff in the pull request: https://github.com/apache/tinkerpop/pull/838#discussion_r191525536 --- Diff: gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatStep.java --- @@ -273,11 +300,40 @@ public RepeatEndStep(final Traversal.Admin traversal) { super(traversal); } + final LinkedList<Traverser.Admin<S>> stashedStarts = new LinkedList<>(); + + private Traverser.Admin<S> nextStart(RepeatStep<S> repeatStep, boolean useDfs) { + if (!useDfs) { + return this.starts.next(); + } else { + if (this.starts.hasNext()) { + return this.starts.next(); + } else { + return this.stashedStarts.pop(); + } + } + } + + @Override + public boolean hasNext() { + return super.hasNext() || !this.stashedStarts.isEmpty(); + } + @Override protected Iterator<Traverser.Admin<S>> standardAlgorithm() throws NoSuchElementException { final RepeatStep<S> repeatStep = (RepeatStep<S>) this.getTraversal().getParent(); + final List<Step> steps = repeatStep.repeatTraversal.getSteps(); + final Step stepBeforeRepeatEndStep = steps.get(steps.size() - 2); + final boolean useDfs = !(stepBeforeRepeatEndStep instanceof Barrier); while (true) { - final Traverser.Admin<S> start = this.starts.next(); + final Traverser.Admin<S> start = nextStart(repeatStep, useDfs); + if (useDfs) { + final List<Traverser.Admin<S>> localStarts = new ArrayList<>(); --- End diff -- any reason you need to allocate a `List` here? could you not write directly to `stashedStarts`?
---