nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/SparseArrayData.java
author lagergren
Fri, 26 Sep 2014 18:47:20 +0200
changeset 26886 18c744ab4df2
parent 26768 751b0f427090
child 27098 2875b30458d3
permissions -rw-r--r--
8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this Reviewed-by: attila, hannesw
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     1
/*
16151
97c1e756ae1e 8005663: Update copyright year to 2013
jlaskey
parents: 16147
diff changeset
     2
 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     4
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    10
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    15
 * accompanied this code).
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    16
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    20
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    23
 * questions.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    24
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    25
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    26
package jdk.nashorn.internal.runtime.arrays;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    27
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    28
import java.util.Arrays;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    29
import java.util.Map;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    30
import java.util.TreeMap;
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
    31
import jdk.nashorn.internal.codegen.types.Type;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    32
import jdk.nashorn.internal.runtime.JSType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    33
import jdk.nashorn.internal.runtime.ScriptRuntime;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    34
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    35
/**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    36
 * Handle arrays where the index is very large.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    37
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    38
class SparseArrayData extends ArrayData {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
    39
    static final long MAX_DENSE_LENGTH = 16 * 512 * 1024;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    40
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    41
    /** Underlying array. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    42
    private ArrayData underlying;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    43
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    44
    /** Maximum length to be stored in the array. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    45
    private final long maxDenseLength;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    46
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    47
    /** Sparse elements. */
19236
73d242d205f9 8020132: Big object literal with numerical keys exceeds method size
hannesw
parents: 18606
diff changeset
    48
    private TreeMap<Long, Object> sparseMap;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    49
19236
73d242d205f9 8020132: Big object literal with numerical keys exceeds method size
hannesw
parents: 18606
diff changeset
    50
    SparseArrayData(final ArrayData underlying, final long length) {
73d242d205f9 8020132: Big object literal with numerical keys exceeds method size
hannesw
parents: 18606
diff changeset
    51
        this(underlying, length, new TreeMap<Long, Object>());
73d242d205f9 8020132: Big object literal with numerical keys exceeds method size
hannesw
parents: 18606
diff changeset
    52
    }
73d242d205f9 8020132: Big object literal with numerical keys exceeds method size
hannesw
parents: 18606
diff changeset
    53
73d242d205f9 8020132: Big object literal with numerical keys exceeds method size
hannesw
parents: 18606
diff changeset
    54
    SparseArrayData(final ArrayData underlying, final long length, final TreeMap<Long, Object> sparseMap) {
73d242d205f9 8020132: Big object literal with numerical keys exceeds method size
hannesw
parents: 18606
diff changeset
    55
        super(length);
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
    56
        assert underlying.length <= length;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    57
        this.underlying = underlying;
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
    58
        this.maxDenseLength = Math.max(MAX_DENSE_LENGTH, underlying.length);
19236
73d242d205f9 8020132: Big object literal with numerical keys exceeds method size
hannesw
parents: 18606
diff changeset
    59
        this.sparseMap = sparseMap;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    60
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    61
19236
73d242d205f9 8020132: Big object literal with numerical keys exceeds method size
hannesw
parents: 18606
diff changeset
    62
    @Override
73d242d205f9 8020132: Big object literal with numerical keys exceeds method size
hannesw
parents: 18606
diff changeset
    63
    public ArrayData copy() {
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
    64
        return new SparseArrayData(underlying.copy(), length, new TreeMap<>(sparseMap));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    65
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    66
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    67
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    68
    public Object[] asObjectArray() {
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
    69
        final int len = (int)Math.min(length, Integer.MAX_VALUE);
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
    70
        final int underlyingLength = (int)Math.min(len, underlying.length);
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
    71
        final Object[] objArray = new Object[len];
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    72
18318
5e4244619d79 8012291: NativeArray is inconsistent in using long for length and index in some places and int for the same in other places
hannesw
parents: 17241
diff changeset
    73
        for (int i = 0; i < underlyingLength; i++) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    74
            objArray[i] = underlying.getObject(i);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    75
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    76
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
    77
        Arrays.fill(objArray, underlyingLength, len, ScriptRuntime.UNDEFINED);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    78
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    79
        for (final Map.Entry<Long, Object> entry : sparseMap.entrySet()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    80
            final long key = entry.getKey();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    81
            if (key <= Integer.MAX_VALUE) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    82
                objArray[(int)key] = entry.getValue();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    83
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    84
                break; // ascending key order
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    85
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    86
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    87
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    88
        return objArray;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    89
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    90
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    91
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    92
    public void shiftLeft(final int by) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    93
        underlying.shiftLeft(by);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    94
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    95
        final TreeMap<Long, Object> newSparseMap = new TreeMap<>();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    96
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    97
        for (final Map.Entry<Long, Object> entry : sparseMap.entrySet()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    98
            final long newIndex = entry.getKey().longValue() - by;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    99
            if (newIndex < maxDenseLength) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   100
                underlying = underlying.set((int) newIndex, entry.getValue(), false);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   101
            } else if (newIndex >= 0) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   102
                newSparseMap.put(Long.valueOf(newIndex), entry.getValue());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   103
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   104
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   105
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   106
        sparseMap = newSparseMap;
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   107
        setLength(Math.max(length - by, 0));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   108
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   109
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   110
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   111
    public ArrayData shiftRight(final int by) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   112
        final TreeMap<Long, Object> newSparseMap = new TreeMap<>();
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   113
        if (underlying.length + by > maxDenseLength) {
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   114
            for (long i = maxDenseLength - by; i < underlying.length; i++) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   115
                if (underlying.has((int) i)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   116
                    newSparseMap.put(Long.valueOf(i + by), underlying.getObject((int) i));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   117
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   118
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   119
            underlying = underlying.shrink((int) (maxDenseLength - by));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   120
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   121
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   122
        underlying.shiftRight(by);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   123
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   124
        for (final Map.Entry<Long, Object> entry : sparseMap.entrySet()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   125
            final long newIndex = entry.getKey().longValue() + by;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   126
            newSparseMap.put(Long.valueOf(newIndex), entry.getValue());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   127
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   128
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   129
        sparseMap = newSparseMap;
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   130
        setLength(length + by);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   131
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   132
        return this;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   133
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   134
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   135
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   136
    public ArrayData ensure(final long safeIndex) {
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   137
        if (safeIndex < maxDenseLength && underlying.length <= safeIndex) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   138
            underlying = underlying.ensure(safeIndex);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   139
        }
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   140
        setLength(Math.max(safeIndex + 1, length));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   141
        return this;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   142
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   143
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   144
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   145
    public ArrayData shrink(final long newLength) {
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   146
        if (newLength < underlying.length) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   147
            underlying = underlying.shrink(newLength);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   148
            underlying.setLength(newLength);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   149
            sparseMap.clear();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   150
            setLength(newLength);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   151
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   152
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   153
        sparseMap.subMap(Long.valueOf(newLength), Long.MAX_VALUE).clear();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   154
        setLength(newLength);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   155
        return this;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   156
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   157
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   158
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   159
    public ArrayData set(final int index, final Object value, final boolean strict) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   160
        if (index >= 0 && index < maxDenseLength) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   161
            ensure(index);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   162
            underlying = underlying.set(index, value, strict);
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   163
            setLength(Math.max(underlying.length, length));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   164
        } else {
24769
attila
parents: 24719
diff changeset
   165
            final Long longIndex = indexToKey(index);
attila
parents: 24719
diff changeset
   166
            sparseMap.put(longIndex, value);
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   167
            setLength(Math.max(longIndex + 1, length));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   168
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   169
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   170
        return this;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   171
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   172
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   173
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   174
    public ArrayData set(final int index, final int value, final boolean strict) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   175
        if (index >= 0 && index < maxDenseLength) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   176
            ensure(index);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   177
            underlying = underlying.set(index, value, strict);
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   178
            setLength(Math.max(underlying.length, length));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   179
        } else {
24769
attila
parents: 24719
diff changeset
   180
            final Long longIndex = indexToKey(index);
attila
parents: 24719
diff changeset
   181
            sparseMap.put(longIndex, value);
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   182
            setLength(Math.max(longIndex + 1, length));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   183
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   184
        return this;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   185
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   186
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   187
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   188
    public ArrayData set(final int index, final long value, final boolean strict) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   189
        if (index >= 0 && index < maxDenseLength) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   190
            ensure(index);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   191
            underlying = underlying.set(index, value, strict);
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   192
            setLength(Math.max(underlying.length, length));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   193
        } else {
24769
attila
parents: 24719
diff changeset
   194
            final Long longIndex = indexToKey(index);
attila
parents: 24719
diff changeset
   195
            sparseMap.put(longIndex, value);
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   196
            setLength(Math.max(longIndex + 1, length));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   197
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   198
        return this;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   199
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   200
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   201
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   202
    public ArrayData set(final int index, final double value, final boolean strict) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   203
        if (index >= 0 && index < maxDenseLength) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   204
            ensure(index);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   205
            underlying = underlying.set(index, value, strict);
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   206
            setLength(Math.max(underlying.length, length));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   207
        } else {
24769
attila
parents: 24719
diff changeset
   208
            final Long longIndex = indexToKey(index);
attila
parents: 24719
diff changeset
   209
            sparseMap.put(longIndex, value);
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   210
            setLength(Math.max(longIndex + 1, length));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   211
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   212
        return this;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   213
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   214
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   215
    @Override
18606
5704d7a4a0a8 8010697: DeletedArrayFilter seems to leak memory
jlaskey
parents: 18318
diff changeset
   216
    public ArrayData setEmpty(final int index) {
5704d7a4a0a8 8010697: DeletedArrayFilter seems to leak memory
jlaskey
parents: 18318
diff changeset
   217
        underlying.setEmpty(index);
5704d7a4a0a8 8010697: DeletedArrayFilter seems to leak memory
jlaskey
parents: 18318
diff changeset
   218
        return this;
5704d7a4a0a8 8010697: DeletedArrayFilter seems to leak memory
jlaskey
parents: 18318
diff changeset
   219
    }
5704d7a4a0a8 8010697: DeletedArrayFilter seems to leak memory
jlaskey
parents: 18318
diff changeset
   220
5704d7a4a0a8 8010697: DeletedArrayFilter seems to leak memory
jlaskey
parents: 18318
diff changeset
   221
    @Override
5704d7a4a0a8 8010697: DeletedArrayFilter seems to leak memory
jlaskey
parents: 18318
diff changeset
   222
    public ArrayData setEmpty(final long lo, final long hi) {
5704d7a4a0a8 8010697: DeletedArrayFilter seems to leak memory
jlaskey
parents: 18318
diff changeset
   223
        underlying.setEmpty(lo, hi);
5704d7a4a0a8 8010697: DeletedArrayFilter seems to leak memory
jlaskey
parents: 18318
diff changeset
   224
        return this;
5704d7a4a0a8 8010697: DeletedArrayFilter seems to leak memory
jlaskey
parents: 18318
diff changeset
   225
    }
5704d7a4a0a8 8010697: DeletedArrayFilter seems to leak memory
jlaskey
parents: 18318
diff changeset
   226
5704d7a4a0a8 8010697: DeletedArrayFilter seems to leak memory
jlaskey
parents: 18318
diff changeset
   227
    @Override
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   228
    public Type getOptimisticType() {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   229
        return underlying.getOptimisticType();
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   230
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   231
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   232
    @Override
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   233
    public int getInt(final int index) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   234
        if (index >= 0 && index < maxDenseLength) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   235
            return underlying.getInt(index);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   236
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   237
        return JSType.toInt32(sparseMap.get(indexToKey(index)));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   238
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   239
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   240
    @Override
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   241
    public int getIntOptimistic(final int index, final int programPoint) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   242
        if (index >= 0 && index < maxDenseLength) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   243
            return underlying.getIntOptimistic(index, programPoint);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   244
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   245
        return JSType.toInt32Optimistic(sparseMap.get(indexToKey(index)), programPoint);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   246
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   247
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   248
    @Override
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   249
    public long getLong(final int index) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   250
        if (index >= 0 && index < maxDenseLength) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   251
            return underlying.getLong(index);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   252
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   253
        return JSType.toLong(sparseMap.get(indexToKey(index)));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   254
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   255
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   256
    @Override
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   257
    public long getLongOptimistic(final int index, final int programPoint) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   258
        if (index >= 0 && index < maxDenseLength) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   259
            return underlying.getLongOptimistic(index, programPoint);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   260
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   261
        return JSType.toLongOptimistic(sparseMap.get(indexToKey(index)), programPoint);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   262
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   263
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   264
    @Override
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   265
    public double getDouble(final int index) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   266
        if (index >= 0 && index < maxDenseLength) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   267
            return underlying.getDouble(index);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   268
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   269
        return JSType.toNumber(sparseMap.get(indexToKey(index)));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   270
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   271
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   272
    @Override
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   273
    public double getDoubleOptimistic(final int index, final int programPoint) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   274
        if (index >= 0 && index < maxDenseLength) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   275
            return underlying.getDouble(index);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   276
        }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   277
        return JSType.toNumberOptimistic(sparseMap.get(indexToKey(index)), programPoint);
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   278
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   279
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 19472
diff changeset
   280
    @Override
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   281
    public Object getObject(final int index) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   282
        if (index >= 0 && index < maxDenseLength) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   283
            return underlying.getObject(index);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   284
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   285
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   286
        final Long key = indexToKey(index);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   287
        if (sparseMap.containsKey(key)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   288
            return sparseMap.get(key);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   289
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   290
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   291
        return ScriptRuntime.UNDEFINED;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   292
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   293
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   294
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   295
    public boolean has(final int index) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   296
        if (index >= 0 && index < maxDenseLength) {
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   297
            return index < underlying.length && underlying.has(index);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   298
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   299
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   300
        return sparseMap.containsKey(indexToKey(index));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   301
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   302
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   303
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   304
    public ArrayData delete(final int index) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   305
        if (index >= 0 && index < maxDenseLength) {
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   306
            if (index < underlying.length) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   307
                underlying = underlying.delete(index);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   308
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   309
        } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   310
            sparseMap.remove(indexToKey(index));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   311
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   312
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   313
        return this;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   314
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   315
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   316
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   317
    public ArrayData delete(final long fromIndex, final long toIndex) {
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   318
        if (fromIndex < maxDenseLength && fromIndex < underlying.length) {
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   319
            underlying = underlying.delete(fromIndex, Math.min(toIndex, underlying.length - 1));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   320
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   321
        if (toIndex >= maxDenseLength) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   322
            sparseMap.subMap(fromIndex, true, toIndex, true).clear();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   323
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   324
        return this;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   325
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   326
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   327
    private static Long indexToKey(final int index) {
24769
attila
parents: 24719
diff changeset
   328
        return Long.valueOf(ArrayIndex.toLongIndex(index));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   329
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   330
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   331
    @Override
26768
751b0f427090 8025435: Optimistic builtins support, implemented initial optimistic versions of push, pop, and charCodeAt
lagergren
parents: 25865
diff changeset
   332
    public ArrayData convert(final Class<?> type) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   333
        underlying = underlying.convert(type);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   334
        return this;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   335
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   336
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   337
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   338
    public Object pop() {
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   339
        if (length == 0) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   340
            return ScriptRuntime.UNDEFINED;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   341
        }
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   342
        if (length == underlying.length) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   343
            final Object result = underlying.pop();
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   344
            setLength(underlying.length);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   345
            return result;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   346
        }
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   347
        setLength(length - 1);
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   348
        final Long key = Long.valueOf(length);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   349
        return sparseMap.containsKey(key) ? sparseMap.remove(key) : ScriptRuntime.UNDEFINED;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   350
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   351
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   352
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   353
    public ArrayData slice(final long from, final long to) {
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   354
        assert to <= length;
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   355
        final long start = from < 0 ? (from + length) : from;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   356
        final long newLength = to - start;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   357
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   358
        if (start >= 0 && to <= maxDenseLength) {
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   359
            if (newLength <= underlying.length) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   360
                return underlying.slice(from, to);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   361
            }
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   362
            return underlying.slice(from, to).ensure(newLength - 1).delete(underlying.length, newLength);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   363
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   364
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   365
        ArrayData sliced = EMPTY_ARRAY;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   366
        sliced = sliced.ensure(newLength - 1);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   367
        for (long i = start; i < to; i = nextIndex(i)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   368
            if (has((int)i)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   369
                sliced = sliced.set((int)(i - start), getObject((int)i), false);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   370
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   371
        }
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   372
        assert sliced.length == newLength;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   373
        return sliced;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   374
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   375
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   376
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   377
    public long nextIndex(final long index) {
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   378
        if (index < underlying.length - 1) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   379
            return underlying.nextIndex(index);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   380
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   381
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   382
        final Long nextKey = sparseMap.higherKey(index);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   383
        if (nextKey != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   384
            return nextKey;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   385
        }
26886
18c744ab4df2 8059211: Changed ArrayData.length accessor to use the protected field and fixed javadoc warnings related to this
lagergren
parents: 26768
diff changeset
   386
        return length;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   387
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   388
}