Skip to content

Commit

Permalink
take the offset of the buffer into account when construction a subarr…
Browse files Browse the repository at this point in the history
…ay from a buffer (fixes mozilla#1204)
  • Loading branch information
rbri committed Apr 8, 2022
1 parent b05aa96 commit 7f884bf
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
86 changes: 84 additions & 2 deletions testsrc/org/mozilla/javascript/tests/es6/TypedArrayJavaTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,95 @@

/** Test for TypedArrays. */
public class TypedArrayJavaTest {

/**
* Test case for {@link https://github.com/mozilla/rhino/issues/768}
*
* @throws Exception if test failed
*/
@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",
Expand All @@ -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();
Expand Down

0 comments on commit 7f884bf

Please sign in to comment.