Github user GCHQResearcher1337 commented on a diff in the pull request: https://github.com/apache/tinkerpop/pull/876#discussion_r202452106 --- Diff: gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_NL_O_P_S_SE_SL_Traverser.java --- @@ -0,0 +1,156 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tinkerpop.gremlin.process.traversal.traverser; + +import org.apache.commons.collections.map.ReferenceMap; +import org.apache.tinkerpop.gremlin.process.traversal.Step; +import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.LabelledCounter; + + +import java.util.Iterator; +import java.util.Stack; + +public class B_LP_NL_O_P_S_SE_SL_Traverser<T> extends B_LP_O_P_S_SE_SL_Traverser<T> { + + protected Stack<LabelledCounter> nestedLoops; + protected ReferenceMap loopNames = null; --- End diff -- Sure. So the loop stack is a stack of LabelledCounters which store the stepId and the loop counter. As per the second part of https://issues.apache.org/jira/browse/TINKERPOP-967 we want to be able to 'name' a loop counter. I could store this in the LabelledCounter alongside the stepId and the counter, but to get more constant time lookup by name I use a separate Map from loop name -> LabelledCounter. When `resetLoops()` is called the counter is removed from the Stack and also needs to be removed from this lookup Map. Because the map is keyed on 'name' not stepId, I don't know which entry to remove without either: * Checking every entry on the map to see if the LabelledCounter matches the one I'm removing from the stack. * Storing the 'name' in the stack of loop counter A Map with 'Weak values' only holds onto entries while the value (the reference to the LabelledCounter) is valid. When it gets released the entry (the 'name' and the Reference to the LabelledCounter) get removed. This avoids needing a second Map/second index/extra to store lookups from I may have overcomplicated this. I was trying to avoid looping over the loopStack (which I expect to be small) and to keep storage down (which is hard to do) - especially considering the existing code seems to want to shave as many bytes as possible off the looping storage (using a short under the hood when the interface exposes an int): https://github.com/apache/tinkerpop/blob/a80eb84169048ed74c5ad27ebc4d12944fd0136a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_S_SE_SL_Traverser.java#L34
---