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() { |