src/jdk/nashorn/internal/runtime/arrays/DeletedArrayFilter.java

Thu, 25 Sep 2014 15:53:47 +0200

author
lagergren
date
Thu, 25 Sep 2014 15:53:47 +0200
changeset 1028
d79265f2fa92
parent 962
ac62e33a99b0
child 1095
3dbb4c9ff43c
permissions
-rw-r--r--

8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
Reviewed-by: hannesw, attila, sundar

jlaskey@3 1 /*
jlaskey@7 2 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
jlaskey@3 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
jlaskey@3 4 *
jlaskey@3 5 * This code is free software; you can redistribute it and/or modify it
jlaskey@3 6 * under the terms of the GNU General Public License version 2 only, as
jlaskey@3 7 * published by the Free Software Foundation. Oracle designates this
jlaskey@3 8 * particular file as subject to the "Classpath" exception as provided
jlaskey@3 9 * by Oracle in the LICENSE file that accompanied this code.
jlaskey@3 10 *
jlaskey@3 11 * This code is distributed in the hope that it will be useful, but WITHOUT
jlaskey@3 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
jlaskey@3 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
jlaskey@3 14 * version 2 for more details (a copy is included in the LICENSE file that
jlaskey@3 15 * accompanied this code).
jlaskey@3 16 *
jlaskey@3 17 * You should have received a copy of the GNU General Public License version
jlaskey@3 18 * 2 along with this work; if not, write to the Free Software Foundation,
jlaskey@3 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
jlaskey@3 20 *
jlaskey@3 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
jlaskey@3 22 * or visit www.oracle.com if you need additional information or have any
jlaskey@3 23 * questions.
jlaskey@3 24 */
jlaskey@3 25
jlaskey@3 26 package jdk.nashorn.internal.runtime.arrays;
jlaskey@3 27
jlaskey@3 28 import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED;
jlaskey@3 29 import java.lang.reflect.Array;
jlaskey@3 30 import jdk.nashorn.internal.runtime.BitVector;
jlaskey@3 31
jlaskey@3 32 /**
jlaskey@3 33 * This filter handles the deletion of array elements.
jlaskey@3 34 */
jlaskey@3 35 final class DeletedArrayFilter extends ArrayFilter {
jlaskey@3 36 /** Bit vector tracking deletions. */
jlaskey@3 37 private final BitVector deleted;
jlaskey@3 38
jlaskey@3 39 DeletedArrayFilter(final ArrayData underlying) {
jlaskey@3 40 super(underlying);
jlaskey@3 41
lagergren@1028 42 this.deleted = new BitVector(underlying.length);
jlaskey@3 43 }
jlaskey@3 44
jlaskey@3 45 @Override
hannesw@482 46 public ArrayData copy() {
attila@962 47 final DeletedArrayFilter copy = new DeletedArrayFilter(underlying.copy());
hannesw@482 48 copy.getDeleted().copy(deleted);
hannesw@482 49 return copy;
hannesw@482 50 }
hannesw@482 51
hannesw@482 52 @Override
jlaskey@3 53 public Object[] asObjectArray() {
jlaskey@3 54 final Object[] value = super.asObjectArray();
jlaskey@3 55
jlaskey@3 56 for (int i = 0; i < value.length; i++) {
jlaskey@3 57 if (deleted.isSet(i)) {
jlaskey@3 58 value[i] = UNDEFINED;
jlaskey@3 59 }
jlaskey@3 60 }
jlaskey@3 61
jlaskey@3 62 return value;
jlaskey@3 63 }
jlaskey@3 64
jlaskey@3 65 @Override
jlaskey@3 66 public Object asArrayOfType(final Class<?> componentType) {
jlaskey@3 67 final Object value = super.asArrayOfType(componentType);
jlaskey@3 68 final Object undefValue = convertUndefinedValue(componentType);
jlaskey@3 69 final int l = Array.getLength(value);
jlaskey@3 70 for (int i = 0; i < l; i++) {
jlaskey@3 71 if (deleted.isSet(i)) {
jlaskey@3 72 Array.set(value, i, undefValue);
jlaskey@3 73 }
jlaskey@3 74 }
jlaskey@3 75
jlaskey@3 76 return value;
jlaskey@3 77 }
jlaskey@3 78
jlaskey@3 79 @Override
jlaskey@3 80 public void shiftLeft(final int by) {
jlaskey@3 81 super.shiftLeft(by);
lagergren@1028 82 deleted.shiftLeft(by, length);
jlaskey@3 83 }
jlaskey@3 84
jlaskey@3 85 @Override
jlaskey@3 86 public ArrayData shiftRight(final int by) {
jlaskey@3 87 super.shiftRight(by);
lagergren@1028 88 deleted.shiftRight(by, length);
jlaskey@3 89
jlaskey@3 90 return this;
jlaskey@3 91 }
jlaskey@3 92
jlaskey@3 93 @Override
jlaskey@3 94 public ArrayData ensure(final long safeIndex) {
lagergren@1028 95 if (safeIndex >= SparseArrayData.MAX_DENSE_LENGTH && safeIndex >= length) {
jlaskey@3 96 return new SparseArrayData(this, safeIndex + 1);
jlaskey@3 97 }
jlaskey@3 98
jlaskey@3 99 super.ensure(safeIndex);
lagergren@1028 100 deleted.resize(length);
jlaskey@3 101
jlaskey@3 102 return this;
jlaskey@3 103 }
jlaskey@3 104
jlaskey@3 105 @Override
jlaskey@3 106 public ArrayData shrink(final long newLength) {
jlaskey@3 107 super.shrink(newLength);
lagergren@1028 108 deleted.resize(length);
jlaskey@3 109
jlaskey@3 110 return this;
jlaskey@3 111 }
jlaskey@3 112
jlaskey@3 113 @Override
jlaskey@3 114 public ArrayData set(final int index, final Object value, final boolean strict) {
jlaskey@3 115 deleted.clear(ArrayIndex.toLongIndex(index));
jlaskey@3 116
jlaskey@3 117 return super.set(index, value, strict);
jlaskey@3 118 }
jlaskey@3 119
jlaskey@3 120 @Override
jlaskey@3 121 public ArrayData set(final int index, final int value, final boolean strict) {
jlaskey@3 122 deleted.clear(ArrayIndex.toLongIndex(index));
jlaskey@3 123
jlaskey@3 124 return super.set(index, value, strict);
jlaskey@3 125 }
jlaskey@3 126
jlaskey@3 127 @Override
jlaskey@3 128 public ArrayData set(final int index, final long value, final boolean strict) {
jlaskey@3 129 deleted.clear(ArrayIndex.toLongIndex(index));
jlaskey@3 130
jlaskey@3 131 return super.set(index, value, strict);
jlaskey@3 132 }
jlaskey@3 133
jlaskey@3 134 @Override
jlaskey@3 135 public ArrayData set(final int index, final double value, final boolean strict) {
jlaskey@3 136 deleted.clear(ArrayIndex.toLongIndex(index));
jlaskey@3 137
jlaskey@3 138 return super.set(index, value, strict);
jlaskey@3 139 }
jlaskey@3 140
jlaskey@3 141 @Override
jlaskey@3 142 public boolean has(final int index) {
jlaskey@3 143 return super.has(index) && deleted.isClear(ArrayIndex.toLongIndex(index));
jlaskey@3 144 }
jlaskey@3 145
jlaskey@3 146 @Override
jlaskey@3 147 public ArrayData delete(final int index) {
jlaskey@3 148 final long longIndex = ArrayIndex.toLongIndex(index);
lagergren@1028 149 assert longIndex >= 0 && longIndex < length;
jlaskey@3 150 deleted.set(longIndex);
jlaskey@368 151 underlying.setEmpty(index);
jlaskey@3 152 return this;
jlaskey@3 153 }
jlaskey@3 154
jlaskey@3 155 @Override
jlaskey@3 156 public ArrayData delete(final long fromIndex, final long toIndex) {
lagergren@1028 157 assert fromIndex >= 0 && fromIndex <= toIndex && toIndex < length;
jlaskey@3 158 deleted.setRange(fromIndex, toIndex + 1);
jlaskey@368 159 underlying.setEmpty(fromIndex, toIndex);
jlaskey@3 160 return this;
jlaskey@3 161 }
jlaskey@3 162
jlaskey@3 163 @Override
jlaskey@3 164 public Object pop() {
lagergren@1028 165 final long index = length - 1;
jlaskey@3 166
jlaskey@3 167 if (super.has((int)index)) {
jlaskey@3 168 final boolean isDeleted = deleted.isSet(index);
jlaskey@3 169 final Object value = super.pop();
jlaskey@3 170
jlaskey@3 171 return isDeleted ? UNDEFINED : value;
jlaskey@3 172 }
jlaskey@3 173
jlaskey@3 174 return super.pop();
jlaskey@3 175 }
jlaskey@3 176
jlaskey@3 177 @Override
jlaskey@3 178 public ArrayData slice(final long from, final long to) {
jlaskey@3 179 final ArrayData newArray = underlying.slice(from, to);
jlaskey@3 180 final DeletedArrayFilter newFilter = new DeletedArrayFilter(newArray);
jlaskey@3 181 newFilter.getDeleted().copy(deleted);
lagergren@1028 182 newFilter.getDeleted().shiftLeft(from, newFilter.length);
jlaskey@3 183
jlaskey@3 184 return newFilter;
jlaskey@3 185 }
jlaskey@3 186
jlaskey@3 187 private BitVector getDeleted() {
jlaskey@3 188 return deleted;
jlaskey@3 189 }
jlaskey@3 190 }

mercurial