nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeArrayBuffer.java
author sundar
Mon, 11 May 2015 22:57:24 +0530
changeset 30512 aa86a08c6625
parent 30395 352bc6fe8406
child 30830 9d3a0827accd
permissions -rw-r--r--
8080042: can't build nashorn.jar from jdk9-dev/nashorn using jdk8 installation as JAVA_HOME Reviewed-by: lagergren, jlaskey
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.objects;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    27
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    28
import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
29537
e6615d669728 8066217: ArrayBuffer constructor was erroneous with zero args
lagergren
parents: 27363
diff changeset
    29
23374
f470afc89c6c 8015958: DataView constructor is not defined
sundar
parents: 23084
diff changeset
    30
import java.nio.ByteBuffer;
30512
aa86a08c6625 8080042: can't build nashorn.jar from jdk9-dev/nashorn using jdk8 installation as JAVA_HOME
sundar
parents: 30395
diff changeset
    31
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    32
import jdk.nashorn.internal.objects.annotations.Attribute;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    33
import jdk.nashorn.internal.objects.annotations.Constructor;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    34
import jdk.nashorn.internal.objects.annotations.Function;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    35
import jdk.nashorn.internal.objects.annotations.Getter;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    36
import jdk.nashorn.internal.objects.annotations.ScriptClass;
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    37
import jdk.nashorn.internal.objects.annotations.SpecializedFunction;
27363
9722f0db287b 8061959: ArrayBuffer lacked static isViewMethod
lagergren
parents: 25865
diff changeset
    38
import jdk.nashorn.internal.objects.annotations.Where;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    39
import jdk.nashorn.internal.runtime.JSType;
18618
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 16226
diff changeset
    40
import jdk.nashorn.internal.runtime.PropertyMap;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    41
import jdk.nashorn.internal.runtime.ScriptObject;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    42
import jdk.nashorn.internal.runtime.ScriptRuntime;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    43
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    44
/**
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    45
 * NativeArrayBuffer - ArrayBuffer as described in the JS typed
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    46
 * array spec
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    47
 */
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    48
@ScriptClass("ArrayBuffer")
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    49
public final class NativeArrayBuffer extends ScriptObject {
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    50
    private final ByteBuffer nb;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    51
18618
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 16226
diff changeset
    52
    // initialized by nasgen
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 16226
diff changeset
    53
    private static PropertyMap $nasgenmap$;
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 16226
diff changeset
    54
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    55
    /**
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    56
     * Constructor
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    57
     * @param nb native byte buffer to wrap
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    58
     * @param global global instance
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    59
     */
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    60
    protected NativeArrayBuffer(final ByteBuffer nb, final Global global) {
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
    61
        super(global.getArrayBufferPrototype(), $nasgenmap$);
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    62
        this.nb = nb;
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    63
    }
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    64
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    65
    /**
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    66
     * Constructor
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    67
     * @param nb native byte buffer to wrap
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    68
     */
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    69
    protected NativeArrayBuffer(final ByteBuffer nb) {
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    70
        this(nb, Global.instance());
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18618
diff changeset
    71
    }
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18618
diff changeset
    72
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    73
    /**
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    74
     * Constructor
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    75
     * @param byteLength byteLength for buffer
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    76
     */
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    77
    protected NativeArrayBuffer(final int byteLength) {
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    78
        this(ByteBuffer.allocateDirect(byteLength));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    79
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    80
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    81
    /**
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    82
     * Clone constructor
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    83
     * Used only for slice
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    84
     * @param other original buffer
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    85
     * @param begin begin byte index
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    86
     * @param end   end byte index
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    87
     */
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    88
    protected NativeArrayBuffer(final NativeArrayBuffer other, final int begin, final int end) {
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
    89
        this(cloneBuffer(other.getNioBuffer(), begin, end));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    90
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    91
24731
ab0c8fc915ae 8038406: Testability: as a first step of moving loggers away from the process global space, the Debug object now supports logging POJOs from log entries as an event queue, which can be introspected from test scripts. This is way better than screen scraping brittle and subject-to-change log output.
lagergren
parents: 24727
diff changeset
    92
    /**
ab0c8fc915ae 8038406: Testability: as a first step of moving loggers away from the process global space, the Debug object now supports logging POJOs from log entries as an event queue, which can be introspected from test scripts. This is way better than screen scraping brittle and subject-to-change log output.
lagergren
parents: 24727
diff changeset
    93
     * Constructor
ab0c8fc915ae 8038406: Testability: as a first step of moving loggers away from the process global space, the Debug object now supports logging POJOs from log entries as an event queue, which can be introspected from test scripts. This is way better than screen scraping brittle and subject-to-change log output.
lagergren
parents: 24727
diff changeset
    94
     * @param newObj is this invoked with new
ab0c8fc915ae 8038406: Testability: as a first step of moving loggers away from the process global space, the Debug object now supports logging POJOs from log entries as an event queue, which can be introspected from test scripts. This is way better than screen scraping brittle and subject-to-change log output.
lagergren
parents: 24727
diff changeset
    95
     * @param self   self reference
ab0c8fc915ae 8038406: Testability: as a first step of moving loggers away from the process global space, the Debug object now supports logging POJOs from log entries as an event queue, which can be introspected from test scripts. This is way better than screen scraping brittle and subject-to-change log output.
lagergren
parents: 24727
diff changeset
    96
     * @param args   arguments to constructor
ab0c8fc915ae 8038406: Testability: as a first step of moving loggers away from the process global space, the Debug object now supports logging POJOs from log entries as an event queue, which can be introspected from test scripts. This is way better than screen scraping brittle and subject-to-change log output.
lagergren
parents: 24727
diff changeset
    97
     * @return new NativeArrayBuffer
ab0c8fc915ae 8038406: Testability: as a first step of moving loggers away from the process global space, the Debug object now supports logging POJOs from log entries as an event queue, which can be introspected from test scripts. This is way better than screen scraping brittle and subject-to-change log output.
lagergren
parents: 24727
diff changeset
    98
     */
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    99
    @Constructor(arity = 1)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   100
    public static NativeArrayBuffer constructor(final boolean newObj, final Object self, final Object... args) {
24731
ab0c8fc915ae 8038406: Testability: as a first step of moving loggers away from the process global space, the Debug object now supports logging POJOs from log entries as an event queue, which can be introspected from test scripts. This is way better than screen scraping brittle and subject-to-change log output.
lagergren
parents: 24727
diff changeset
   101
        if (!newObj) {
ab0c8fc915ae 8038406: Testability: as a first step of moving loggers away from the process global space, the Debug object now supports logging POJOs from log entries as an event queue, which can be introspected from test scripts. This is way better than screen scraping brittle and subject-to-change log output.
lagergren
parents: 24727
diff changeset
   102
            throw typeError("constructor.requires.new", "ArrayBuffer");
ab0c8fc915ae 8038406: Testability: as a first step of moving loggers away from the process global space, the Debug object now supports logging POJOs from log entries as an event queue, which can be introspected from test scripts. This is way better than screen scraping brittle and subject-to-change log output.
lagergren
parents: 24727
diff changeset
   103
        }
ab0c8fc915ae 8038406: Testability: as a first step of moving loggers away from the process global space, the Debug object now supports logging POJOs from log entries as an event queue, which can be introspected from test scripts. This is way better than screen scraping brittle and subject-to-change log output.
lagergren
parents: 24727
diff changeset
   104
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   105
        if (args.length == 0) {
29537
e6615d669728 8066217: ArrayBuffer constructor was erroneous with zero args
lagergren
parents: 27363
diff changeset
   106
            return new NativeArrayBuffer(0);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   107
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   108
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   109
        return new NativeArrayBuffer(JSType.toInt32(args[0]));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   110
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   111
24731
ab0c8fc915ae 8038406: Testability: as a first step of moving loggers away from the process global space, the Debug object now supports logging POJOs from log entries as an event queue, which can be introspected from test scripts. This is way better than screen scraping brittle and subject-to-change log output.
lagergren
parents: 24727
diff changeset
   112
    private static ByteBuffer cloneBuffer(final ByteBuffer original, final int begin, final int end) {
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   113
        final ByteBuffer clone = ByteBuffer.allocateDirect(original.capacity());
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   114
        original.rewind();//copy from the beginning
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   115
        clone.put(original);
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   116
        original.rewind();
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   117
        clone.flip();
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   118
        clone.position(begin);
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   119
        clone.limit(end);
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   120
        return clone.slice();
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18618
diff changeset
   121
    }
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18618
diff changeset
   122
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   123
    ByteBuffer getNioBuffer() {
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   124
        return nb;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   125
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   126
19638
bf08be79957a 8023784: Object.prototype.toString should contain the class name for all instances
sundar
parents: 18851
diff changeset
   127
    @Override
bf08be79957a 8023784: Object.prototype.toString should contain the class name for all instances
sundar
parents: 18851
diff changeset
   128
    public String getClassName() {
bf08be79957a 8023784: Object.prototype.toString should contain the class name for all instances
sundar
parents: 18851
diff changeset
   129
        return "ArrayBuffer";
bf08be79957a 8023784: Object.prototype.toString should contain the class name for all instances
sundar
parents: 18851
diff changeset
   130
    }
bf08be79957a 8023784: Object.prototype.toString should contain the class name for all instances
sundar
parents: 18851
diff changeset
   131
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   132
    /**
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   133
     * Byte length for native array buffer
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   134
     * @param self native array buffer
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   135
     * @return byte length
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   136
     */
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   137
    @Getter(attributes = Attribute.NOT_ENUMERABLE | Attribute.NOT_WRITABLE | Attribute.NOT_CONFIGURABLE)
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   138
    public static int byteLength(final Object self) {
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   139
        return ((NativeArrayBuffer)self).getByteLength();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   140
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   141
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   142
    /**
27363
9722f0db287b 8061959: ArrayBuffer lacked static isViewMethod
lagergren
parents: 25865
diff changeset
   143
     * Returns true if an object is an ArrayBufferView
9722f0db287b 8061959: ArrayBuffer lacked static isViewMethod
lagergren
parents: 25865
diff changeset
   144
     *
9722f0db287b 8061959: ArrayBuffer lacked static isViewMethod
lagergren
parents: 25865
diff changeset
   145
     * @param self self
9722f0db287b 8061959: ArrayBuffer lacked static isViewMethod
lagergren
parents: 25865
diff changeset
   146
     * @param obj  object to check
9722f0db287b 8061959: ArrayBuffer lacked static isViewMethod
lagergren
parents: 25865
diff changeset
   147
     *
9722f0db287b 8061959: ArrayBuffer lacked static isViewMethod
lagergren
parents: 25865
diff changeset
   148
     * @return true if obj is an ArrayBufferView
9722f0db287b 8061959: ArrayBuffer lacked static isViewMethod
lagergren
parents: 25865
diff changeset
   149
     */
9722f0db287b 8061959: ArrayBuffer lacked static isViewMethod
lagergren
parents: 25865
diff changeset
   150
    @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
9722f0db287b 8061959: ArrayBuffer lacked static isViewMethod
lagergren
parents: 25865
diff changeset
   151
    public static boolean isView(final Object self, final Object obj) {
9722f0db287b 8061959: ArrayBuffer lacked static isViewMethod
lagergren
parents: 25865
diff changeset
   152
        return obj instanceof ArrayBufferView;
9722f0db287b 8061959: ArrayBuffer lacked static isViewMethod
lagergren
parents: 25865
diff changeset
   153
    }
9722f0db287b 8061959: ArrayBuffer lacked static isViewMethod
lagergren
parents: 25865
diff changeset
   154
9722f0db287b 8061959: ArrayBuffer lacked static isViewMethod
lagergren
parents: 25865
diff changeset
   155
    /**
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   156
     * Slice function
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   157
     * @param self   native array buffer
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   158
     * @param begin0 start byte index
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   159
     * @param end0   end byte index
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   160
     * @return new array buffer, sliced
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   161
     */
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   162
    @Function(attributes = Attribute.NOT_ENUMERABLE)
23763
950d8bc0554f 8038456: improve nasgen type checks and use specific return type for @Function, @SpecializedFunctio methods
sundar
parents: 23375
diff changeset
   163
    public static NativeArrayBuffer slice(final Object self, final Object begin0, final Object end0) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   164
        final NativeArrayBuffer arrayBuffer = (NativeArrayBuffer)self;
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   165
        final int               byteLength  = arrayBuffer.getByteLength();
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   166
        final int               begin       = adjustIndex(JSType.toInt32(begin0), byteLength);
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   167
        final int               end         = adjustIndex(end0 != ScriptRuntime.UNDEFINED ? JSType.toInt32(end0) : byteLength, byteLength);
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   168
        return new NativeArrayBuffer(arrayBuffer, begin, Math.max(end, begin));
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   169
    }
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   170
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   171
    /**
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   172
     * Specialized slice function
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   173
     * @param self   native array buffer
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   174
     * @param begin  start byte index
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   175
     * @param end    end byte index
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   176
     * @return new array buffer, sliced
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   177
     */
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   178
    @SpecializedFunction
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   179
    public static Object slice(final Object self, final int begin, final int end) {
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   180
        final NativeArrayBuffer arrayBuffer = (NativeArrayBuffer)self;
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   181
        final int byteLength  = arrayBuffer.getByteLength();
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   182
        return new NativeArrayBuffer(arrayBuffer, adjustIndex(begin, byteLength), Math.max(adjustIndex(end, byteLength), begin));
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   183
    }
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   184
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   185
    /**
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   186
     * Specialized slice function
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   187
     * @param self   native array buffer
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   188
     * @param begin  start byte index
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   189
     * @return new array buffer, sliced
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   190
     */
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   191
    @SpecializedFunction
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   192
    public static Object slice(final Object self, final int begin) {
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   193
        return slice(self, begin, ((NativeArrayBuffer)self).getByteLength());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   194
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   195
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   196
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   197
     * If index is negative, it refers to an index from the end of the array, as
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   198
     * opposed to from the beginning. The index is clamped to the valid index
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   199
     * range for the array.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   200
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   201
     * @param index  The index.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   202
     * @param length The length of the array.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   203
     * @return valid index index in the range [0, length).
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   204
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   205
    static int adjustIndex(final int index, final int length) {
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   206
        return index < 0 ? clamp(index + length, length) : clamp(index, length);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   207
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   208
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   209
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   210
     * Clamp index into the range [0, length).
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   211
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   212
    private static int clamp(final int index, final int length) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   213
        if (index < 0) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   214
            return 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   215
        } else if (index > length) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   216
            return length;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   217
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   218
        return index;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   219
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   220
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   221
    int getByteLength() {
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 19638
diff changeset
   222
        return nb.limit();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   223
    }
23374
f470afc89c6c 8015958: DataView constructor is not defined
sundar
parents: 23084
diff changeset
   224
f470afc89c6c 8015958: DataView constructor is not defined
sundar
parents: 23084
diff changeset
   225
    ByteBuffer getBuffer() {
24727
attila
parents: 24720 23375
diff changeset
   226
       return nb;
23374
f470afc89c6c 8015958: DataView constructor is not defined
sundar
parents: 23084
diff changeset
   227
    }
f470afc89c6c 8015958: DataView constructor is not defined
sundar
parents: 23084
diff changeset
   228
f470afc89c6c 8015958: DataView constructor is not defined
sundar
parents: 23084
diff changeset
   229
    ByteBuffer getBuffer(final int offset) {
30512
aa86a08c6625 8080042: can't build nashorn.jar from jdk9-dev/nashorn using jdk8 installation as JAVA_HOME
sundar
parents: 30395
diff changeset
   230
        return (ByteBuffer)nb.duplicate().position(offset);
23374
f470afc89c6c 8015958: DataView constructor is not defined
sundar
parents: 23084
diff changeset
   231
    }
f470afc89c6c 8015958: DataView constructor is not defined
sundar
parents: 23084
diff changeset
   232
f470afc89c6c 8015958: DataView constructor is not defined
sundar
parents: 23084
diff changeset
   233
    ByteBuffer getBuffer(final int offset, final int length) {
30512
aa86a08c6625 8080042: can't build nashorn.jar from jdk9-dev/nashorn using jdk8 installation as JAVA_HOME
sundar
parents: 30395
diff changeset
   234
        return (ByteBuffer)getBuffer(offset).limit(length);
23374
f470afc89c6c 8015958: DataView constructor is not defined
sundar
parents: 23084
diff changeset
   235
    }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   236
}