diff --git a/NiL.JS/Core/SparseArray.cs b/NiL.JS/Core/SparseArray.cs index f5d9c364d..b95421fc9 100644 --- a/NiL.JS/Core/SparseArray.cs +++ b/NiL.JS/Core/SparseArray.cs @@ -186,7 +186,7 @@ private void rebuildSegmentToSparse(int realSegmentIndex, TValue[] values) _navyData[realSegmentIndex] = new NavyItem[len]; - var bias = realSegmentIndex * SegmentSize; + var bias = _segmentsNavyData[realSegmentIndex].index * SegmentSize; if (typeof(TValue).IsClass) { @@ -266,6 +266,7 @@ private enum FindNearestMode { NotLess, NotMore } mask = SegmentSize >> 1; var n = _navyData[realSegmentIndex][0]; var itemIndex = 0; + var nestedAlterI = -1; while (true) { if (n.index >= index) @@ -276,12 +277,24 @@ private enum FindNearestMode { NotLess, NotMore } if (itemIndex == 0) { if (n.oneContinue == 0) - break; - - nextIndex = n.oneContinue; + { + if (nestedAlterI == -1) + break; + + mask = 0; + n = _navyData[realSegmentIndex][nestedAlterI]; + itemIndex = nestedAlterI; + nestedAlterI = -1; + continue; + } + + itemIndex = n.oneContinue; mask = 0; } + if (itemIndex != n.oneContinue && n.oneContinue != 0) + nestedAlterI = n.oneContinue; + mask >>= 1; n = _navyData[realSegmentIndex][itemIndex]; } @@ -364,7 +377,7 @@ private enum FindNearestMode { NotLess, NotMore } if (n.zeroContinue == 0) return (realSegmentIndex, (int)navyItem.index, itemIndex); - nextIndex = n.zeroContinue; + itemIndex = n.zeroContinue; mask = int.MaxValue; }