nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/DeletedArrayFilter.java
changeset 26886 18c744ab4df2
parent 25865 d38d876f1654
child 27525 e7d3c00b9fb8
equal deleted inserted replaced
26786:f0c5e4b732da 26886:18c744ab4df2
    24  */
    24  */
    25 
    25 
    26 package jdk.nashorn.internal.runtime.arrays;
    26 package jdk.nashorn.internal.runtime.arrays;
    27 
    27 
    28 import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED;
    28 import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED;
    29 
       
    30 import java.lang.reflect.Array;
    29 import java.lang.reflect.Array;
    31 import jdk.nashorn.internal.runtime.BitVector;
    30 import jdk.nashorn.internal.runtime.BitVector;
    32 
    31 
    33 /**
    32 /**
    34  * This filter handles the deletion of array elements.
    33  * This filter handles the deletion of array elements.
    38     private final BitVector deleted;
    37     private final BitVector deleted;
    39 
    38 
    40     DeletedArrayFilter(final ArrayData underlying) {
    39     DeletedArrayFilter(final ArrayData underlying) {
    41         super(underlying);
    40         super(underlying);
    42 
    41 
    43         this.deleted = new BitVector(underlying.length());
    42         this.deleted = new BitVector(underlying.length);
    44     }
    43     }
    45 
    44 
    46     @Override
    45     @Override
    47     public ArrayData copy() {
    46     public ArrayData copy() {
    48         final DeletedArrayFilter copy = new DeletedArrayFilter(underlying.copy());
    47         final DeletedArrayFilter copy = new DeletedArrayFilter(underlying.copy());
    78     }
    77     }
    79 
    78 
    80     @Override
    79     @Override
    81     public void shiftLeft(final int by) {
    80     public void shiftLeft(final int by) {
    82         super.shiftLeft(by);
    81         super.shiftLeft(by);
    83         deleted.shiftLeft(by, length());
    82         deleted.shiftLeft(by, length);
    84     }
    83     }
    85 
    84 
    86     @Override
    85     @Override
    87     public ArrayData shiftRight(final int by) {
    86     public ArrayData shiftRight(final int by) {
    88         super.shiftRight(by);
    87         super.shiftRight(by);
    89         deleted.shiftRight(by, length());
    88         deleted.shiftRight(by, length);
    90 
    89 
    91         return this;
    90         return this;
    92     }
    91     }
    93 
    92 
    94     @Override
    93     @Override
    95     public ArrayData ensure(final long safeIndex) {
    94     public ArrayData ensure(final long safeIndex) {
    96         if (safeIndex >= SparseArrayData.MAX_DENSE_LENGTH && safeIndex >= length()) {
    95         if (safeIndex >= SparseArrayData.MAX_DENSE_LENGTH && safeIndex >= length) {
    97             return new SparseArrayData(this, safeIndex + 1);
    96             return new SparseArrayData(this, safeIndex + 1);
    98         }
    97         }
    99 
    98 
   100         super.ensure(safeIndex);
    99         super.ensure(safeIndex);
   101         deleted.resize(length());
   100         deleted.resize(length);
   102 
   101 
   103         return this;
   102         return this;
   104     }
   103     }
   105 
   104 
   106     @Override
   105     @Override
   107     public ArrayData shrink(final long newLength) {
   106     public ArrayData shrink(final long newLength) {
   108         super.shrink(newLength);
   107         super.shrink(newLength);
   109         deleted.resize(length());
   108         deleted.resize(length);
   110 
   109 
   111         return this;
   110         return this;
   112     }
   111     }
   113 
   112 
   114     @Override
   113     @Override
   145     }
   144     }
   146 
   145 
   147     @Override
   146     @Override
   148     public ArrayData delete(final int index) {
   147     public ArrayData delete(final int index) {
   149         final long longIndex = ArrayIndex.toLongIndex(index);
   148         final long longIndex = ArrayIndex.toLongIndex(index);
   150         assert longIndex >= 0 && longIndex < length();
   149         assert longIndex >= 0 && longIndex < length;
   151         deleted.set(longIndex);
   150         deleted.set(longIndex);
   152         underlying.setEmpty(index);
   151         underlying.setEmpty(index);
   153         return this;
   152         return this;
   154     }
   153     }
   155 
   154 
   156     @Override
   155     @Override
   157     public ArrayData delete(final long fromIndex, final long toIndex) {
   156     public ArrayData delete(final long fromIndex, final long toIndex) {
   158         assert fromIndex >= 0 && fromIndex <= toIndex && toIndex < length();
   157         assert fromIndex >= 0 && fromIndex <= toIndex && toIndex < length;
   159         deleted.setRange(fromIndex, toIndex + 1);
   158         deleted.setRange(fromIndex, toIndex + 1);
   160         underlying.setEmpty(fromIndex, toIndex);
   159         underlying.setEmpty(fromIndex, toIndex);
   161         return this;
   160         return this;
   162     }
   161     }
   163 
   162 
   164     @Override
   163     @Override
   165     public Object pop() {
   164     public Object pop() {
   166         final long index = length() - 1;
   165         final long index = length - 1;
   167 
   166 
   168         if (super.has((int)index)) {
   167         if (super.has((int)index)) {
   169             final boolean isDeleted = deleted.isSet(index);
   168             final boolean isDeleted = deleted.isSet(index);
   170             final Object value = super.pop();
   169             final Object value = super.pop();
   171 
   170 
   178     @Override
   177     @Override
   179     public ArrayData slice(final long from, final long to) {
   178     public ArrayData slice(final long from, final long to) {
   180         final ArrayData newArray = underlying.slice(from, to);
   179         final ArrayData newArray = underlying.slice(from, to);
   181         final DeletedArrayFilter newFilter = new DeletedArrayFilter(newArray);
   180         final DeletedArrayFilter newFilter = new DeletedArrayFilter(newArray);
   182         newFilter.getDeleted().copy(deleted);
   181         newFilter.getDeleted().copy(deleted);
   183         newFilter.getDeleted().shiftLeft(from, newFilter.length());
   182         newFilter.getDeleted().shiftLeft(from, newFilter.length);
   184 
   183 
   185         return newFilter;
   184         return newFilter;
   186     }
   185     }
   187 
   186 
   188     private BitVector getDeleted() {
   187     private BitVector getDeleted() {