blob: 55e26b253a677d0b12c14ab60fedbd1f96c06d7f [file] [log] [blame]
/*
* Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.nashorn.internal.runtime.arrays;
import static jdk.nashorn.internal.lookup.Lookup.MH;
import java.lang.invoke.MethodHandle;
import java.nio.Buffer;
import jdk.internal.dynalink.CallSiteDescriptor;
import jdk.internal.dynalink.linker.GuardedInvocation;
import jdk.internal.dynalink.linker.LinkRequest;
import jdk.nashorn.internal.lookup.Lookup;
/**
* The superclass of all ArrayData used by TypedArrays
*
* @param <T> buffer implementation
*/
public abstract class TypedArrayData<T extends Buffer> extends ContinuousArrayData {
/** wrapped native buffer */
protected final T nb;
/**
* Constructor
* @param nb wrapped native buffer
* @param elementLength length in elements
*/
protected TypedArrayData(final T nb, final int elementLength) {
super(elementLength); //TODO is this right?
this.nb = nb;
}
/**
* Length in number of elements. Accessed from {@code ArrayBufferView}
* @return element length
*/
public final int getElementLength() {
return (int)length();
}
/**
* Is this an unsigned array data?
* @return true if unsigned
*/
public boolean isUnsigned() {
return false;
}
/**
* Is this a clamped array data?
* @return true if clamped
*/
public boolean isClamped() {
return false;
}
@Override
public boolean canDelete(final int index, final boolean strict) {
return false;
}
@Override
public boolean canDelete(final long longIndex, final boolean strict) {
return false;
}
@Override
public TypedArrayData<T> copy() {
throw new UnsupportedOperationException();
}
@Override
public Object[] asObjectArray() {
throw new UnsupportedOperationException();
}
@Override
public ArrayData shiftLeft(final int by) {
throw new UnsupportedOperationException();
}
@Override
public ArrayData shiftRight(final int by) {
throw new UnsupportedOperationException();
}
@Override
public ArrayData ensure(final long safeIndex) {
return this;
}
@Override
public ArrayData shrink(final long newLength) {
throw new UnsupportedOperationException();
}
@Override
public final boolean has(final int index) {
return 0 <= index && index < length();
}
@Override
public ArrayData delete(final int index) {
return this;
}
@Override
public ArrayData delete(final long fromIndex, final long toIndex) {
return this;
}
@Override
public TypedArrayData<T> convert(final Class<?> type) {
throw new UnsupportedOperationException();
}
@Override
public Object pop() {
throw new UnsupportedOperationException();
}
@Override
public ArrayData slice(final long from, final long to) {
throw new UnsupportedOperationException();
}
/**
* Element getter method handle
* @return getter
*/
protected abstract MethodHandle getGetElem();
/**
* Element setter method handle
* @return setter
*/
protected abstract MethodHandle getSetElem();
@Override
public MethodHandle getElementGetter(final Class<?> returnType, final int programPoint) {
final MethodHandle getter = getContinuousElementGetter(getClass(), getGetElem(), returnType, programPoint);
if (getter != null) {
return Lookup.filterReturnType(getter, returnType);
}
return getter;
}
@Override
public MethodHandle getElementSetter(final Class<?> elementType) {
return getContinuousElementSetter(getClass(), Lookup.filterArgumentType(getSetElem(), 2, elementType), elementType);
}
@Override
protected MethodHandle getContinuousElementSetter(final Class<? extends ContinuousArrayData> clazz, final MethodHandle setHas, final Class<?> elementType) {
final MethodHandle mh = Lookup.filterArgumentType(setHas, 2, elementType);
return MH.asType(mh, mh.type().changeParameterType(0, clazz));
}
@Override
public GuardedInvocation findFastGetIndexMethod(final Class<? extends ArrayData> clazz, final CallSiteDescriptor desc, final LinkRequest request) {
final GuardedInvocation inv = super.findFastGetIndexMethod(clazz, desc, request);
if (inv != null) {
return inv;
}
return null;
}
@Override
public GuardedInvocation findFastSetIndexMethod(final Class<? extends ArrayData> clazz, final CallSiteDescriptor desc, final LinkRequest request) { // array, index, value
final GuardedInvocation inv = super.findFastSetIndexMethod(clazz, desc, request);
if (inv != null) {
return inv;
}
return null;
}
}