diff --git a/src/org/mozilla/javascript/typedarrays/NativeTypedArrayView.java b/src/org/mozilla/javascript/typedarrays/NativeTypedArrayView.java index f5418ae0e6..23ddc08ceb 100644 --- a/src/org/mozilla/javascript/typedarrays/NativeTypedArrayView.java +++ b/src/org/mozilla/javascript/typedarrays/NativeTypedArrayView.java @@ -245,7 +245,8 @@ private Object js_subarray(Context cx, Scriptable scope, int s, int e) { start = Math.max(0, start); end = Math.min(length, end); int len = Math.max(0, (end - start)); - int byteOff = Math.min(start * getBytesPerElement(), arrayBuffer.getLength()); + int byteOff = + Math.min(getByteOffset() + start * getBytesPerElement(), arrayBuffer.getLength()); return cx.newObject( scope, diff --git a/testsrc/org/mozilla/javascript/tests/es6/TypedArrayJavaTest.java b/testsrc/org/mozilla/javascript/tests/es6/TypedArrayJavaTest.java index 637127cd2d..ffdc7318fa 100644 --- a/testsrc/org/mozilla/javascript/tests/es6/TypedArrayJavaTest.java +++ b/testsrc/org/mozilla/javascript/tests/es6/TypedArrayJavaTest.java @@ -8,6 +8,7 @@ /** Test for TypedArrays. */ public class TypedArrayJavaTest { + /** * Test case for {@link https://github.com/mozilla/rhino/issues/768} * @@ -15,6 +16,87 @@ public class TypedArrayJavaTest { */ @Test public void subarrayWithoutParams() throws Exception { + String script = "var ta = new §§type§§([1, 2]);\n" + "'' + ta.subarray();"; + + allTypes(script, "1,2"); + } + + /** @throws Exception if test failed */ + @Test + public void subarrayFromSubarray() throws Exception { + subarrayFromSubarray(0, 7, 0, 6, "1,2,3,4,5,6,7 - 1,2,3,4,5,6"); + subarrayFromSubarray(0, 7, 0, 7, "1,2,3,4,5,6,7 - 1,2,3,4,5,6,7"); + subarrayFromSubarray(0, 7, 0, 8, "1,2,3,4,5,6,7 - 1,2,3,4,5,6,7"); + subarrayFromSubarray(0, 7, 0, 80, "1,2,3,4,5,6,7 - 1,2,3,4,5,6,7"); + + subarrayFromSubarray(1, 7, 0, 5, "2,3,4,5,6,7 - 2,3,4,5,6"); + subarrayFromSubarray(1, 7, 0, 6, "2,3,4,5,6,7 - 2,3,4,5,6,7"); + subarrayFromSubarray(1, 7, 0, 7, "2,3,4,5,6,7 - 2,3,4,5,6,7"); + subarrayFromSubarray(1, 7, 0, 70, "2,3,4,5,6,7 - 2,3,4,5,6,7"); + + subarrayFromSubarray(0, 8, 0, 6, "1,2,3,4,5,6,7 - 1,2,3,4,5,6"); + subarrayFromSubarray(0, 8, 0, 7, "1,2,3,4,5,6,7 - 1,2,3,4,5,6,7"); + subarrayFromSubarray(0, 8, 0, 8, "1,2,3,4,5,6,7 - 1,2,3,4,5,6,7"); + subarrayFromSubarray(0, 8, 0, 80, "1,2,3,4,5,6,7 - 1,2,3,4,5,6,7"); + + subarrayFromSubarray(1, 8, 0, 5, "2,3,4,5,6,7 - 2,3,4,5,6"); + subarrayFromSubarray(1, 8, 0, 6, "2,3,4,5,6,7 - 2,3,4,5,6,7"); + subarrayFromSubarray(1, 8, 0, 7, "2,3,4,5,6,7 - 2,3,4,5,6,7"); + subarrayFromSubarray(1, 8, 0, 70, "2,3,4,5,6,7 - 2,3,4,5,6,7"); + + subarrayFromSubarray(0, 6, 0, 5, "1,2,3,4,5,6 - 1,2,3,4,5"); + subarrayFromSubarray(0, 6, 0, 6, "1,2,3,4,5,6 - 1,2,3,4,5,6"); + subarrayFromSubarray(0, 6, 0, 7, "1,2,3,4,5,6 - 1,2,3,4,5,6"); + subarrayFromSubarray(0, 6, 0, 70, "1,2,3,4,5,6 - 1,2,3,4,5,6"); + + subarrayFromSubarray(2, 5, 0, 2, "3,4,5 - 3,4"); + subarrayFromSubarray(2, 5, 0, 3, "3,4,5 - 3,4,5"); + subarrayFromSubarray(2, 5, 0, 4, "3,4,5 - 3,4,5"); + subarrayFromSubarray(2, 5, 0, 40, "3,4,5 - 3,4,5"); + + subarrayFromSubarray(2, 5, 1, 2, "3,4,5 - 4"); + subarrayFromSubarray(2, 5, 1, 3, "3,4,5 - 4,5"); + subarrayFromSubarray(2, 5, 1, 4, "3,4,5 - 4,5"); + subarrayFromSubarray(2, 5, 1, 40, "3,4,5 - 4,5"); + + subarrayFromSubarray(2, 5, -1, Integer.MIN_VALUE, "3,4,5 - 5"); + subarrayFromSubarray(2, 5, -3, Integer.MIN_VALUE, "3,4,5 - 3,4,5"); + subarrayFromSubarray(2, 5, -4, Integer.MIN_VALUE, "3,4,5 - 3,4,5"); + subarrayFromSubarray(2, 5, -40, Integer.MIN_VALUE, "3,4,5 - 3,4,5"); + + subarrayFromSubarray(-6, Integer.MIN_VALUE, 0, 5, "2,3,4,5,6,7 - 2,3,4,5,6"); + subarrayFromSubarray(-6, Integer.MIN_VALUE, 0, 6, "2,3,4,5,6,7 - 2,3,4,5,6,7"); + subarrayFromSubarray(-6, Integer.MIN_VALUE, 0, 7, "2,3,4,5,6,7 - 2,3,4,5,6,7"); + subarrayFromSubarray(-6, Integer.MIN_VALUE, 0, 70, "2,3,4,5,6,7 - 2,3,4,5,6,7"); + + subarrayFromSubarray(2, 5, 0, -1, "3,4,5 - 3,4"); + subarrayFromSubarray(2, 5, 0, -2, "3,4,5 - 3"); + subarrayFromSubarray(2, 5, 0, -3, "3,4,5 - "); + subarrayFromSubarray(2, 5, 0, -4, "3,4,5 - "); + + subarrayFromSubarray(2, 5, 1, -1, "3,4,5 - 4"); + subarrayFromSubarray(2, 5, 1, -2, "3,4,5 - "); + subarrayFromSubarray(2, 5, 1, -3, "3,4,5 - "); + } + + private static void subarrayFromSubarray(int from, int to, int from2, int to2, String expected) + throws Exception { + String script = + "var arr = new §§type§§([1, 2, 3, 4, 5, 6, 7]);\n" + + "var sub1 = arr.subarray(" + + from + + (Integer.MIN_VALUE != to ? (", " + to) : "") + + ");\n" + + "var sub2 = sub1.subarray(" + + from2 + + (Integer.MIN_VALUE != to2 ? (", " + to2) : "") + + ");\n" + + "'' + sub1 + ' - ' + sub2"; + + allTypes(script, expected); + } + + private static void allTypes(String script, String expected) throws Exception { String[] allNativeTypes = { "Float32Array", "Float64Array", @@ -32,9 +114,9 @@ public void subarrayWithoutParams() throws Exception { Scriptable global = cx.initStandardObjects(); for (String type : allNativeTypes) { - String script = "var ta = new " + type + "([1, 2]);\n" + "'' + ta.subarray();"; + script = script.replace("§§type§§", type); Object obj = cx.evaluateString(global, script, "", 1, null); - assertEquals("1,2", obj); + assertEquals(expected, obj); } Context.exit();