--- old/src/jdk/nashorn/internal/objects/NativeUint32Array.java 2016-01-20 14:14:47.055064373 +0100 +++ new/src/jdk/nashorn/internal/objects/NativeUint32Array.java 2016-01-20 14:14:46.907064376 +0100 @@ -32,6 +32,7 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.IntBuffer; +import jdk.nashorn.internal.codegen.types.Type; import jdk.nashorn.internal.objects.annotations.Attribute; import jdk.nashorn.internal.objects.annotations.Constructor; import jdk.nashorn.internal.objects.annotations.Function; @@ -41,6 +42,7 @@ import jdk.nashorn.internal.runtime.JSType; import jdk.nashorn.internal.runtime.PropertyMap; import jdk.nashorn.internal.runtime.ScriptObject; +import jdk.nashorn.internal.runtime.UnwarrantedOptimismException; import jdk.nashorn.internal.runtime.arrays.ArrayData; import jdk.nashorn.internal.runtime.arrays.TypedArrayData; @@ -78,7 +80,7 @@ private static final class Uint32ArrayData extends TypedArrayData { - private static final MethodHandle GET_ELEM = specialCall(MethodHandles.lookup(), Uint32ArrayData.class, "getElem", long.class, int.class).methodHandle(); + private static final MethodHandle GET_ELEM = specialCall(MethodHandles.lookup(), Uint32ArrayData.class, "getElem", double.class, int.class).methodHandle(); private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), Uint32ArrayData.class, "setElem", void.class, int.class, int.class).methodHandle(); private Uint32ArrayData(final IntBuffer nb, final int start, final int end) { @@ -103,14 +105,18 @@ return getContinuousElementGetter(getClass(), GET_ELEM, returnType, programPoint); } - private long getElem(final int index) { + private int getRawElem(final int index) { try { - return JSType.toUint32(nb.get(index)); + return nb.get(index); } catch (final IndexOutOfBoundsException e) { throw new ClassCastException(); //force relink - this works for unoptimistic too } } + private double getElem(final int index) { + return JSType.toUint32(getRawElem(index)); + } + private void setElem(final int index, final int elem) { try { if (index < nb.limit()) { @@ -128,42 +134,37 @@ @Override public Class getElementType() { - return long.class; + return double.class; } @Override public Class getBoxedElementType() { - return Integer.class; + return Double.class; } @Override public int getInt(final int index) { - return (int)getLong(index); + return getRawElem(index); } @Override - public long getLong(final int index) { - return getElem(index); - } - - @Override - public long getLongOptimistic(final int index, final int programPoint) { - return getElem(index); + public int getIntOptimistic(final int index, final int programPoint) { + return JSType.toUint32Optimistic(getRawElem(index), programPoint); } @Override public double getDouble(final int index) { - return getLong(index); + return getElem(index); } @Override public double getDoubleOptimistic(final int index, final int programPoint) { - return getLong(index); + return getElem(index); } @Override public Object getObject(final int index) { - return getLong(index); + return getElem(index); } @Override @@ -178,11 +179,6 @@ } @Override - public ArrayData set(final int index, final long value, final boolean strict) { - return set(index, (int)value, strict); - } - - @Override public ArrayData set(final int index, final double value, final boolean strict) { return set(index, (int)value, strict); }