1 /*
2 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package jdk.nashorn.internal.runtime.arrays;
27
28 import static jdk.nashorn.internal.lookup.Lookup.MH;
29 import java.lang.invoke.MethodHandle;
30 import java.nio.Buffer;
31 import jdk.dynalink.CallSiteDescriptor;
32 import jdk.dynalink.linker.GuardedInvocation;
33 import jdk.dynalink.linker.LinkRequest;
34 import jdk.nashorn.internal.lookup.Lookup;
35
36 /**
37 * The superclass of all ArrayData used by TypedArrays
38 *
39 * @param <T> buffer implementation
40 */
41 public abstract class TypedArrayData<T extends Buffer> extends ContinuousArrayData {
42
43 /** wrapped native buffer */
44 protected final T nb;
45
46 /**
47 * Constructor
48 * @param nb wrapped native buffer
49 * @param elementLength length in elements
50 */
51 protected TypedArrayData(final T nb, final int elementLength) {
52 super(elementLength); //TODO is this right?
53 this.nb = nb;
54 }
55
56 /**
57 * Length in number of elements. Accessed from {@code ArrayBufferView}
58 * @return element length
59 */
60 public final int getElementLength() {
61 return (int)length();
62 }
63
64 /**
65 * Is this an unsigned array data?
66 * @return true if unsigned
67 */
68 public boolean isUnsigned() {
69 return false;
70 }
71
72 /**
73 * Is this a clamped array data?
74 * @return true if clamped
75 */
76 public boolean isClamped() {
77 return false;
78 }
79
80 @Override
81 public boolean canDelete(final int index, final boolean strict) {
82 return false;
83 }
84
85 @Override
86 public boolean canDelete(final long longIndex, final boolean strict) {
87 return false;
88 }
89
90 @Override
91 public TypedArrayData<T> copy() {
92 throw new UnsupportedOperationException();
93 }
94
95 @Override
96 public Object[] asObjectArray() {
97 throw new UnsupportedOperationException();
98 }
99
100 @Override
101 public void shiftLeft(final int by) {
102 throw new UnsupportedOperationException();
103 }
104
105 @Override
106 public ArrayData shiftRight(final int by) {
107 throw new UnsupportedOperationException();
108 }
109
110 @Override
111 public ArrayData ensure(final long safeIndex) {
112 return this;
113 }
114
115 @Override
116 public ArrayData shrink(final long newLength) {
117 throw new UnsupportedOperationException();
118 }
119
120 @Override
121 public final boolean has(final int index) {
122 return 0 <= index && index < length();
123 }
124
125 @Override
126 public ArrayData delete(final int index) {
127 return this;
128 }
129
130 @Override
131 public ArrayData delete(final long fromIndex, final long toIndex) {
132 return this;
133 }
134
135 @Override
136 public TypedArrayData<T> convert(final Class<?> type) {
137 throw new UnsupportedOperationException();
138 }
139
140 @Override
141 public Object pop() {
142 throw new UnsupportedOperationException();
143 }
144
145 @Override
146 public ArrayData slice(final long from, final long to) {
147 throw new UnsupportedOperationException();
148 }
149
150 /**
151 * Element getter method handle
152 * @return getter
153 */
154 protected abstract MethodHandle getGetElem();
155
156 /**
157 * Element setter method handle
158 * @return setter
159 */
160 protected abstract MethodHandle getSetElem();
161
162 @Override
163 public MethodHandle getElementGetter(final Class<?> returnType, final int programPoint) {
164 final MethodHandle getter = getContinuousElementGetter(getClass(), getGetElem(), returnType, programPoint);
165 if (getter != null) {
166 return Lookup.filterReturnType(getter, returnType);
167 }
168 return getter;
169 }
170
171 @Override
172 public MethodHandle getElementSetter(final Class<?> elementType) {
173 return getContinuousElementSetter(getClass(), Lookup.filterArgumentType(getSetElem(), 2, elementType), elementType);
174 }
175
176 @Override
177 protected MethodHandle getContinuousElementSetter(final Class<? extends ContinuousArrayData> clazz, final MethodHandle setHas, final Class<?> elementType) {
178 final MethodHandle mh = Lookup.filterArgumentType(setHas, 2, elementType);
179 return MH.asType(mh, mh.type().changeParameterType(0, clazz));
180 }
181
182 @Override
183 public GuardedInvocation findFastGetIndexMethod(final Class<? extends ArrayData> clazz, final CallSiteDescriptor desc, final LinkRequest request) {
184 final GuardedInvocation inv = super.findFastGetIndexMethod(clazz, desc, request);
185
186 if (inv != null) {
187 return inv;
188 }
189
190 return null;
191 }
192
193 @Override
194 public GuardedInvocation findFastSetIndexMethod(final Class<? extends ArrayData> clazz, final CallSiteDescriptor desc, final LinkRequest request) { // array, index, value
195 final GuardedInvocation inv = super.findFastSetIndexMethod(clazz, desc, request);
196
197 if (inv != null) {
198 return inv;
199 }
200
201 return null;
202 }
203
204 }
--- EOF ---