[WebGL2] Implement getBufferSubData()
authormmaxfield@apple.com <mmaxfield@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 4 Nov 2016 01:57:15 +0000 (01:57 +0000)
committermmaxfield@apple.com <mmaxfield@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 4 Nov 2016 01:57:15 +0000 (01:57 +0000)
https://bugs.webkit.org/show_bug.cgi?id=164111

Reviewed by Dean Jackson.

Source/WebCore:

The call exists in OpenGL 3.2 but in order to have parity with
OpenGL ES 3 we back it with glMapBufferRange() instead.

This patch simply adds surface area to GraphicsContext3D
until we can get an ANGLE implementation of it.

When testing this patch I discovered that r207649 incorrectly
interpreted arguments to bufferData() and bufferSubData() as
byte offsets. Instead, they should be element indices. This
patch fixes those functions to work correctly so that
getBufferSubData() can be tested correctly.

Tests: fast/canvas/webgl/webgl2-buffers.html
       fast/canvas/webgl/getBufferSubData-webgl1.html

* html/canvas/WebGL2RenderingContext.cpp:
(WebCore::arrayBufferViewElementSize):
(WebCore::WebGL2RenderingContext::bufferData):
(WebCore::WebGL2RenderingContext::bufferSubData):
(WebCore::WebGL2RenderingContext::getBufferSubData):
* html/canvas/WebGL2RenderingContext.h:
* html/canvas/WebGL2RenderingContext.idl:
* platform/graphics/GraphicsContext3D.h:
* platform/graphics/opengl/GraphicsContext3DOpenGLCommon.cpp:
(WebCore::GraphicsContext3D::getBufferSubData):
(WebCore::GraphicsContext3D::mapBufferRange):
(WebCore::GraphicsContext3D::unmapBuffer):

LayoutTests:

Test every successful download/upload combination I can think of.

* fast/canvas/webgl/getBufferSubData-webgl1.html: Added.
* fast/canvas/webgl/getBufferSubData-webgl1-expected.txt: Added.
* fast/canvas/webgl/webgl2-buffers-expected.txt: Added.
* fast/canvas/webgl/webgl2-buffers.html: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@208363 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/fast/canvas/webgl/getBufferSubData-webgl1-expected.txt [new file with mode: 0644]
LayoutTests/fast/canvas/webgl/getBufferSubData-webgl1.html [new file with mode: 0644]
LayoutTests/fast/canvas/webgl/webgl2-buffers-expected.txt [new file with mode: 0644]
LayoutTests/fast/canvas/webgl/webgl2-buffers.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/html/canvas/WebGL2RenderingContext.cpp
Source/WebCore/html/canvas/WebGL2RenderingContext.h
Source/WebCore/html/canvas/WebGL2RenderingContext.idl
Source/WebCore/platform/graphics/GraphicsContext3D.h
Source/WebCore/platform/graphics/opengl/GraphicsContext3DOpenGLCommon.cpp

index 5a3a386..4d521ca 100644 (file)
@@ -1,3 +1,17 @@
+2016-11-03  Myles C. Maxfield  <mmaxfield@apple.com>
+
+        [WebGL2] Implement getBufferSubData()
+        https://bugs.webkit.org/show_bug.cgi?id=164111
+
+        Reviewed by Dean Jackson.
+
+        Test every successful download/upload combination I can think of.
+
+        * fast/canvas/webgl/getBufferSubData-webgl1.html: Added.
+        * fast/canvas/webgl/getBufferSubData-webgl1-expected.txt: Added.
+        * fast/canvas/webgl/webgl2-buffers-expected.txt: Added.
+        * fast/canvas/webgl/webgl2-buffers.html: Added.
+
 2016-11-03  Chris Dumez  <cdumez@apple.com>
 
         [WK2][Cocoa] Implement user interface for HTML form validation
diff --git a/LayoutTests/fast/canvas/webgl/getBufferSubData-webgl1-expected.txt b/LayoutTests/fast/canvas/webgl/getBufferSubData-webgl1-expected.txt
new file mode 100644 (file)
index 0000000..2f45278
--- /dev/null
@@ -0,0 +1,30 @@
+Make sure that getBufferSubData() doesn't work on WebGL 1 contexts
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getBufferSubData(context.ARRAY_BUFFER, 0, receiver, 0, 10) threw exception TypeError: context.getBufferSubData is not a function. (In 'context.getBufferSubData(context.ARRAY_BUFFER, 0, receiver, 0, 10)', 'context.getBufferSubData' is undefined).
+PASS context.getError() is context.NO_ERROR
+PASS context is null
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/canvas/webgl/getBufferSubData-webgl1.html b/LayoutTests/fast/canvas/webgl/getBufferSubData-webgl1.html
new file mode 100644 (file)
index 0000000..1aa1a2a
--- /dev/null
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="../../../resources/js-test-pre.js"></script>
+</head>
+<body>
+<canvas id="canvas" width="40" height="40"></canvas>
+<script>
+description("Make sure that getBufferSubData() doesn't work on WebGL 1 contexts");
+
+if (window.internals)
+       internals.setWebGL2Enabled(true);
+
+var arrayBuffer = new ArrayBuffer(40);
+var fullArrayView = new Float32Array(arrayBuffer); // [15, 16, 17, 18, 19, 20, 21, 22, 23, 24], 40 bytes
+var receiver = new Float32Array(20); // 20 floats, 80 bytes
+for (var i = 0; i < 10; ++i)
+       fullArrayView[i] = 15 + i;
+
+var canvas = document.getElementById("canvas");
+var context = canvas.getContext("webgl2");
+trySuccessUploadDownload();
+
+canvas = document.createElement("canvas");
+canvas.width = 40;
+canvas.height = 40;
+context = canvas.getContext("webgl");
+tryFailUploadDownload();
+
+if (window.internals)
+       internals.setWebGL2Enabled(false);
+
+canvas = document.createElement("canvas");
+canvas.width = 40;
+canvas.height = 40;
+context = canvas.getContext("webgl2");
+shouldBeNull("context");
+
+function trySuccessUploadDownload() {
+       var buffer = context.createBuffer();
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.bindBuffer(context.ARRAY_BUFFER, buffer);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.bufferData(context.ARRAY_BUFFER, arrayBuffer, context.STATIC_DRAW);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(context.ARRAY_BUFFER, 0, receiver, 0, 10);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       for (var i = 0; i < 10; ++i)
+               shouldBe("receiver[" + i + "]", "fullArrayView[" + i + "]");
+       context.deleteBuffer(buffer);
+       shouldBe("context.getError()", "context.NO_ERROR");
+}
+
+function tryFailUploadDownload() {
+       var buffer = context.createBuffer();
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.bindBuffer(context.ARRAY_BUFFER, buffer);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.bufferData(context.ARRAY_BUFFER, arrayBuffer, context.STATIC_DRAW);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldThrow("context.getBufferSubData(context.ARRAY_BUFFER, 0, receiver, 0, 10)");
+       context.deleteBuffer(buffer);
+       shouldBe("context.getError()", "context.NO_ERROR");
+}
+</script>
+<script src="../../../resources/js-test-post.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/LayoutTests/fast/canvas/webgl/webgl2-buffers-expected.txt b/LayoutTests/fast/canvas/webgl/webgl2-buffers-expected.txt
new file mode 100644 (file)
index 0000000..32fdb30
--- /dev/null
@@ -0,0 +1,3113 @@
+Make sure that reading and writing WebGL2 buffers works as expected.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[0]
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS receiver[7] is fullArrayView[6]
+PASS receiver[8] is fullArrayView[7]
+PASS receiver[9] is fullArrayView[8]
+PASS receiver[10] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[3]
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[0]
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS receiver[7] is fullArrayView[6]
+PASS receiver[8] is fullArrayView[7]
+PASS receiver[9] is fullArrayView[8]
+PASS receiver[10] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[3]
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[0]
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS receiver[7] is fullArrayView[6]
+PASS receiver[8] is fullArrayView[7]
+PASS receiver[9] is fullArrayView[8]
+PASS receiver[10] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[0]
+PASS receiver[3] is fullArrayView[1]
+PASS receiver[4] is fullArrayView[2]
+PASS receiver[5] is fullArrayView[3]
+PASS receiver[6] is fullArrayView[4]
+PASS receiver[7] is fullArrayView[5]
+PASS receiver[8] is fullArrayView[6]
+PASS receiver[9] is fullArrayView[7]
+PASS receiver[10] is fullArrayView[8]
+PASS receiver[11] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[0]
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS receiver[7] is fullArrayView[6]
+PASS receiver[8] is fullArrayView[7]
+PASS receiver[9] is fullArrayView[8]
+PASS receiver[10] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[3]
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[0]
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS receiver[7] is fullArrayView[6]
+PASS receiver[8] is fullArrayView[7]
+PASS receiver[9] is fullArrayView[8]
+PASS receiver[10] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[3]
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[0]
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS receiver[7] is fullArrayView[6]
+PASS receiver[8] is fullArrayView[7]
+PASS receiver[9] is fullArrayView[8]
+PASS receiver[10] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[0]
+PASS receiver[3] is fullArrayView[1]
+PASS receiver[4] is fullArrayView[2]
+PASS receiver[5] is fullArrayView[3]
+PASS receiver[6] is fullArrayView[4]
+PASS receiver[7] is fullArrayView[5]
+PASS receiver[8] is fullArrayView[6]
+PASS receiver[9] is fullArrayView[7]
+PASS receiver[10] is fullArrayView[8]
+PASS receiver[11] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[0]
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS receiver[7] is fullArrayView[6]
+PASS receiver[8] is fullArrayView[7]
+PASS receiver[9] is fullArrayView[8]
+PASS receiver[10] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[3]
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[0]
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS receiver[7] is fullArrayView[6]
+PASS receiver[8] is fullArrayView[7]
+PASS receiver[9] is fullArrayView[8]
+PASS receiver[10] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[3]
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[0]
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS receiver[7] is fullArrayView[6]
+PASS receiver[8] is fullArrayView[7]
+PASS receiver[9] is fullArrayView[8]
+PASS receiver[10] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[0]
+PASS receiver[3] is fullArrayView[1]
+PASS receiver[4] is fullArrayView[2]
+PASS receiver[5] is fullArrayView[3]
+PASS receiver[6] is fullArrayView[4]
+PASS receiver[7] is fullArrayView[5]
+PASS receiver[8] is fullArrayView[6]
+PASS receiver[9] is fullArrayView[7]
+PASS receiver[10] is fullArrayView[8]
+PASS receiver[11] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[0]
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS receiver[7] is fullArrayView[6]
+PASS receiver[8] is fullArrayView[7]
+PASS receiver[9] is fullArrayView[8]
+PASS receiver[10] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[3]
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[0]
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS receiver[7] is fullArrayView[6]
+PASS receiver[8] is fullArrayView[7]
+PASS receiver[9] is fullArrayView[8]
+PASS receiver[10] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[3]
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[0]
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS receiver[7] is fullArrayView[6]
+PASS receiver[8] is fullArrayView[7]
+PASS receiver[9] is fullArrayView[8]
+PASS receiver[10] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[0]
+PASS receiver[3] is fullArrayView[1]
+PASS receiver[4] is fullArrayView[2]
+PASS receiver[5] is fullArrayView[3]
+PASS receiver[6] is fullArrayView[4]
+PASS receiver[7] is fullArrayView[5]
+PASS receiver[8] is fullArrayView[6]
+PASS receiver[9] is fullArrayView[7]
+PASS receiver[10] is fullArrayView[8]
+PASS receiver[11] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[0]
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS receiver[7] is fullArrayView[6]
+PASS receiver[8] is fullArrayView[7]
+PASS receiver[9] is fullArrayView[8]
+PASS receiver[10] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[3]
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[0]
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS receiver[7] is fullArrayView[6]
+PASS receiver[8] is fullArrayView[7]
+PASS receiver[9] is fullArrayView[8]
+PASS receiver[10] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[3]
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[0]
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS receiver[7] is fullArrayView[6]
+PASS receiver[8] is fullArrayView[7]
+PASS receiver[9] is fullArrayView[8]
+PASS receiver[10] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[0]
+PASS receiver[3] is fullArrayView[1]
+PASS receiver[4] is fullArrayView[2]
+PASS receiver[5] is fullArrayView[3]
+PASS receiver[6] is fullArrayView[4]
+PASS receiver[7] is fullArrayView[5]
+PASS receiver[8] is fullArrayView[6]
+PASS receiver[9] is fullArrayView[7]
+PASS receiver[10] is fullArrayView[8]
+PASS receiver[11] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[0]
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS receiver[7] is fullArrayView[6]
+PASS receiver[8] is fullArrayView[7]
+PASS receiver[9] is fullArrayView[8]
+PASS receiver[10] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[3]
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[0]
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS receiver[7] is fullArrayView[6]
+PASS receiver[8] is fullArrayView[7]
+PASS receiver[9] is fullArrayView[8]
+PASS receiver[10] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[3]
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[0]
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS receiver[7] is fullArrayView[6]
+PASS receiver[8] is fullArrayView[7]
+PASS receiver[9] is fullArrayView[8]
+PASS receiver[10] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[0]
+PASS receiver[3] is fullArrayView[1]
+PASS receiver[4] is fullArrayView[2]
+PASS receiver[5] is fullArrayView[3]
+PASS receiver[6] is fullArrayView[4]
+PASS receiver[7] is fullArrayView[5]
+PASS receiver[8] is fullArrayView[6]
+PASS receiver[9] is fullArrayView[7]
+PASS receiver[10] is fullArrayView[8]
+PASS receiver[11] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[0]
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS receiver[7] is fullArrayView[6]
+PASS receiver[8] is fullArrayView[7]
+PASS receiver[9] is fullArrayView[8]
+PASS receiver[10] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[3]
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[0]
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS receiver[7] is fullArrayView[6]
+PASS receiver[8] is fullArrayView[7]
+PASS receiver[9] is fullArrayView[8]
+PASS receiver[10] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[3]
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[0]
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS receiver[7] is fullArrayView[6]
+PASS receiver[8] is fullArrayView[7]
+PASS receiver[9] is fullArrayView[8]
+PASS receiver[10] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[0]
+PASS receiver[3] is fullArrayView[1]
+PASS receiver[4] is fullArrayView[2]
+PASS receiver[5] is fullArrayView[3]
+PASS receiver[6] is fullArrayView[4]
+PASS receiver[7] is fullArrayView[5]
+PASS receiver[8] is fullArrayView[6]
+PASS receiver[9] is fullArrayView[7]
+PASS receiver[10] is fullArrayView[8]
+PASS receiver[11] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[0]
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS receiver[7] is fullArrayView[6]
+PASS receiver[8] is fullArrayView[7]
+PASS receiver[9] is fullArrayView[8]
+PASS receiver[10] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[3]
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[0]
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS receiver[7] is fullArrayView[6]
+PASS receiver[8] is fullArrayView[7]
+PASS receiver[9] is fullArrayView[8]
+PASS receiver[10] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS receiver[5] is fullArrayView[6]
+PASS receiver[6] is fullArrayView[7]
+PASS receiver[7] is fullArrayView[8]
+PASS receiver[8] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[3]
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[4]
+PASS receiver[2] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[0]
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS receiver[7] is fullArrayView[6]
+PASS receiver[8] is fullArrayView[7]
+PASS receiver[9] is fullArrayView[8]
+PASS receiver[10] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[0]
+PASS receiver[3] is fullArrayView[1]
+PASS receiver[4] is fullArrayView[2]
+PASS receiver[5] is fullArrayView[3]
+PASS receiver[6] is fullArrayView[4]
+PASS receiver[7] is fullArrayView[5]
+PASS receiver[8] is fullArrayView[6]
+PASS receiver[9] is fullArrayView[7]
+PASS receiver[10] is fullArrayView[8]
+PASS receiver[11] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[0]
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS receiver[9] is fullArrayView[9]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS receiver[6] is fullArrayView[6]
+PASS receiver[7] is fullArrayView[7]
+PASS receiver[8] is fullArrayView[8]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[1]
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[1]
+PASS receiver[3] is fullArrayView[2]
+PASS receiver[4] is fullArrayView[3]
+PASS receiver[5] is fullArrayView[4]
+PASS receiver[6] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[1]
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[2]
+PASS receiver[2] is fullArrayView[3]
+PASS receiver[3] is fullArrayView[4]
+PASS receiver[4] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is sentinel
+PASS receiver[2] is fullArrayView[2]
+PASS receiver[3] is fullArrayView[3]
+PASS receiver[4] is fullArrayView[4]
+PASS receiver[5] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is fullArrayView[2]
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS context.getError() is context.NO_ERROR
+PASS receiver[0] is sentinel
+PASS receiver[1] is fullArrayView[3]
+PASS receiver[2] is fullArrayView[4]
+PASS receiver[3] is fullArrayView[5]
+PASS context.getError() is context.NO_ERROR
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/canvas/webgl/webgl2-buffers.html b/LayoutTests/fast/canvas/webgl/webgl2-buffers.html
new file mode 100644 (file)
index 0000000..55270fd
--- /dev/null
@@ -0,0 +1,489 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="../../../resources/js-test-pre.js"></script>
+</head>
+<body>
+<canvas id="canvas" width="40" height="40"></canvas>
+<script>
+description("Make sure that reading and writing WebGL2 buffers works as expected.");
+
+if (window.internals)
+       internals.setWebGL2Enabled(true);
+
+var arrayBuffer = new ArrayBuffer(40);
+var fullArrayView = new Float32Array(arrayBuffer); // [15, 16, 17, 18, 19, 20, 21, 22, 23, 24], 40 bytes
+var partialArrayView = new Float32Array(arrayBuffer, 4, 5); // [16, 17, 18, 19, 20], 20 bytes
+var receiver = new Float32Array(20); // 20 floats, 80 bytes
+for (var i = 0; i < 10; ++i)
+       fullArrayView[i] = 15 + i;
+
+var sentinel = 100;
+function fillReceiver() {
+       for (var i = 0; i < receiver.length; ++i)
+               receiver[i] = sentinel;
+}
+
+var canvas = document.getElementById("canvas");
+var context = canvas.getContext("webgl2");
+
+runTests(context.ARRAY_BUFFER);
+runTests(context.COPY_READ_BUFFER);
+runTests(context.COPY_WRITE_BUFFER);
+runTests(context.ELEMENT_ARRAY_BUFFER);
+runTests(context.PIXEL_PACK_BUFFER);
+runTests(context.PIXEL_UNPACK_BUFFER);
+runTests(context.TRANSFORM_FEEDBACK_BUFFER);
+runTests(context.UNIFORM_BUFFER);
+
+function runTests(target) {
+       var buffer = context.createBuffer();
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.bindBuffer(target, buffer);
+       shouldBe("context.getError()", "context.NO_ERROR");
+
+
+
+       context.bufferData(target, arrayBuffer, context.STATIC_DRAW);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 0, receiver, 0, 10);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       for (var i = 0; i < 10; ++i)
+               shouldBe("receiver[" + i + "]", "fullArrayView[" + i + "]");
+
+       fillReceiver();
+       context.bufferData(target, arrayBuffer, context.STATIC_DRAW);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 0, receiver, 1, 10);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       for (var i = 0; i < 10; ++i)
+               shouldBe("receiver[" + (i + 1) + "]", "fullArrayView[" + i + "]");
+
+       context.bufferData(target, arrayBuffer, context.STATIC_DRAW);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 4, receiver, 0, 9);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       for (var i = 0; i < 9; ++i)
+               shouldBe("receiver[" + i + "]", "fullArrayView[" + (i + 1) + "]");
+
+       fillReceiver();
+       context.bufferData(target, arrayBuffer, context.STATIC_DRAW);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 8, receiver, 1, 8);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       for (var i = 0; i < 8; ++i)
+               shouldBe("receiver[" + (i + 1) + "]", "fullArrayView[" + (i + 2) + "]");
+
+       ////////////////////////////////////////////////////////////////////////////////////////////////
+
+       context.bufferData(target, partialArrayView, context.STATIC_DRAW);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 0, receiver, 0, 5);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       for (var i = 0; i < 5; ++i)
+               shouldBe("receiver[" + i + "]", "fullArrayView[" + (i + 1) + "]");
+
+       fillReceiver();
+       context.bufferData(target, partialArrayView, context.STATIC_DRAW);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 0, receiver, 1, 5);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       for (var i = 0; i < 5; ++i)
+               shouldBe("receiver[" + (i + 1) + "]", "fullArrayView[" + (i + 1) + "]");
+
+       context.bufferData(target, partialArrayView, context.STATIC_DRAW);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 4, receiver, 0, 4);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       for (var i = 0; i < 4; ++i)
+               shouldBe("receiver[" + i + "]", "fullArrayView[" + (i + 2) + "]");
+
+       fillReceiver();
+       context.bufferData(target, partialArrayView, context.STATIC_DRAW);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 8, receiver, 1, 3);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       for (var i = 0; i < 3; ++i)
+               shouldBe("receiver[" + (i + 1) + "]", "fullArrayView[" + (i + 3) + "]");
+
+       ////////////////////////////////////////////////////////////////////////////////////////////////
+
+       context.bufferData(target, partialArrayView, context.STATIC_DRAW, 0, 5);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 0, receiver, 0, 5);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       for (var i = 0; i < 5; ++i)
+               shouldBe("receiver[" + i + "]", "fullArrayView[" + (i + 1) + "]");
+
+       fillReceiver();
+       context.bufferData(target, partialArrayView, context.STATIC_DRAW, 0, 5);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 0, receiver, 1, 5);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       for (var i = 0; i < 5; ++i)
+               shouldBe("receiver[" + (i + 1) + "]", "fullArrayView[" + (i + 1) + "]");
+
+       context.bufferData(target, partialArrayView, context.STATIC_DRAW, 0, 5);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 4, receiver, 0, 4);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       for (var i = 0; i < 4; ++i)
+               shouldBe("receiver[" + i + "]", "fullArrayView[" + (i + 2) + "]");
+
+       fillReceiver();
+       context.bufferData(target, partialArrayView, context.STATIC_DRAW, 0, 5);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 8, receiver, 1, 3);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       for (var i = 0; i < 3; ++i)
+               shouldBe("receiver[" + (i + 1) + "]", "fullArrayView[" + (i + 3) + "]");
+
+       ////////////////////////////////////////////////////////////////////////////////////////////////
+
+       context.bufferData(target, partialArrayView, context.STATIC_DRAW, 1, 4);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 0, receiver, 0, 4);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       for (var i = 0; i < 4; ++i)
+               shouldBe("receiver[" + i + "]", "fullArrayView[" + (i + 2) + "]");
+
+       fillReceiver();
+       context.bufferData(target, partialArrayView, context.STATIC_DRAW, 1, 4);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 0, receiver, 1, 4);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       for (var i = 0; i < 4; ++i)
+               shouldBe("receiver[" + (i + 1) + "]", "fullArrayView[" + (i + 2) + "]");
+
+       context.bufferData(target, partialArrayView, context.STATIC_DRAW, 1, 4);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 4, receiver, 0, 3);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       for (var i = 0; i < 3; ++i)
+               shouldBe("receiver[" + i + "]", "fullArrayView[" + (i + 3) + "]");
+
+       fillReceiver();
+       context.bufferData(target, partialArrayView, context.STATIC_DRAW, 1, 4);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 8, receiver, 1, 2);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       for (var i = 0; i < 2; ++i)
+               shouldBe("receiver[" + (i + 1) + "]", "fullArrayView[" + (i + 4) + "]");
+
+
+
+       ////////////////////////////////////////////////////////////////////////////////////////////////
+       ////////////////////////////////////////////////////////////////////////////////////////////////
+       ////////////////////////////////////////////////////////////////////////////////////////////////
+       // Give the buffer a size which is big enough to hold the entire buffer
+       fillReceiver();
+       context.bufferData(target, receiver, context.STATIC_DRAW);
+       shouldBe("context.getError()", "context.NO_ERROR");
+
+
+
+       context.bufferSubData(target, 0, arrayBuffer);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 0, receiver, 0, 10);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       for (var i = 0; i < 10; ++i)
+               shouldBe("receiver[" + i + "]", "fullArrayView[" + i + "]");
+
+       fillReceiver();
+       context.bufferSubData(target, 0, arrayBuffer);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 0, receiver, 1, 10);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       for (var i = 0; i < 10; ++i)
+               shouldBe("receiver[" + (i + 1) + "]", "fullArrayView[" + i + "]");
+
+       context.bufferSubData(target, 0, arrayBuffer);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 4, receiver, 0, 9);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       for (var i = 0; i < 9; ++i)
+               shouldBe("receiver[" + i + "]", "fullArrayView[" + (i + 1) + "]");
+
+       fillReceiver();
+       context.bufferSubData(target, 0, arrayBuffer);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 8, receiver, 1, 8);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       for (var i = 0; i < 8; ++i)
+               shouldBe("receiver[" + (i + 1) + "]", "fullArrayView[" + (i + 2) + "]");
+
+       ////////////////////////////////////////////////////////////////////////////////////////////////
+
+       context.bufferSubData(target, 0, partialArrayView);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 0, receiver, 0, 5);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       for (var i = 0; i < 5; ++i)
+               shouldBe("receiver[" + i + "]", "fullArrayView[" + (i + 1) + "]");
+
+       fillReceiver();
+       context.bufferSubData(target, 0, partialArrayView);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 0, receiver, 1, 5);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       for (var i = 0; i < 5; ++i)
+               shouldBe("receiver[" + (i + 1) + "]", "fullArrayView[" + (i + 1) + "]");
+
+       context.bufferSubData(target, 0, partialArrayView);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 4, receiver, 0, 4);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       for (var i = 0; i < 4; ++i)
+               shouldBe("receiver[" + i + "]", "fullArrayView[" + (i + 2) + "]");
+
+       fillReceiver();
+       context.bufferSubData(target, 0, partialArrayView);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 8, receiver, 1, 3);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       for (var i = 0; i < 3; ++i)
+               shouldBe("receiver[" + (i + 1) + "]", "fullArrayView[" + (i + 3) + "]");
+
+       ////////////////////////////////////////////////////////////////////////////////////////////////
+
+       context.bufferSubData(target, 0, partialArrayView, 0, 5);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 0, receiver, 0, 5);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       for (var i = 0; i < 5; ++i)
+               shouldBe("receiver[" + i + "]", "fullArrayView[" + (i + 1) + "]");
+
+       fillReceiver();
+       context.bufferSubData(target, 0, partialArrayView, 0, 5);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 0, receiver, 1, 5);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       for (var i = 0; i < 5; ++i)
+               shouldBe("receiver[" + (i + 1) + "]", "fullArrayView[" + (i + 1) + "]");
+
+       context.bufferSubData(target, 0, partialArrayView, 0, 5);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 4, receiver, 0, 4);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       for (var i = 0; i < 4; ++i)
+               shouldBe("receiver[" + i + "]", "fullArrayView[" + (i + 2) + "]");
+
+       fillReceiver();
+       context.bufferSubData(target, 0, partialArrayView, 0, 5);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 8, receiver, 1, 3);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       for (var i = 0; i < 3; ++i)
+               shouldBe("receiver[" + (i + 1) + "]", "fullArrayView[" + (i + 3) + "]");
+
+       ////////////////////////////////////////////////////////////////////////////////////////////////
+
+       context.bufferSubData(target, 0, partialArrayView, 1, 4);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 0, receiver, 0, 4);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       for (var i = 0; i < 4; ++i)
+               shouldBe("receiver[" + i + "]", "fullArrayView[" + (i + 2) + "]");
+
+       fillReceiver();
+       context.bufferSubData(target, 0, partialArrayView, 1, 4);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 0, receiver, 1, 4);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       for (var i = 0; i < 4; ++i)
+               shouldBe("receiver[" + (i + 1) + "]", "fullArrayView[" + (i + 2) + "]");
+
+       context.bufferSubData(target, 0, partialArrayView, 1, 4);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 4, receiver, 0, 3);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       for (var i = 0; i < 3; ++i)
+               shouldBe("receiver[" + i + "]", "fullArrayView[" + (i + 3) + "]");
+
+       fillReceiver();
+       context.bufferSubData(target, 0, partialArrayView, 1, 4);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 8, receiver, 1, 2);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       for (var i = 0; i < 2; ++i)
+               shouldBe("receiver[" + (i + 1) + "]", "fullArrayView[" + (i + 4) + "]");
+
+
+
+       ////////////////////////////////////////////////////////////////////////////////////////////////
+       ////////////////////////////////////////////////////////////////////////////////////////////////
+       ////////////////////////////////////////////////////////////////////////////////////////////////
+       // Give the buffer a size which is big enough to hold the entire buffer
+       fillReceiver();
+       context.bufferData(target, receiver, context.STATIC_DRAW);
+       shouldBe("context.getError()", "context.NO_ERROR");
+
+
+
+       context.bufferSubData(target, 4, arrayBuffer);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 0, receiver, 0, 11);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       for (var i = 0; i < 10; ++i)
+               shouldBe("receiver[" + (i + 1) + "]", "fullArrayView[" + i + "]");
+
+       fillReceiver();
+       context.bufferSubData(target, 4, arrayBuffer);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 0, receiver, 1, 11);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       shouldBe("receiver[1]", "sentinel");
+       for (var i = 0; i < 10; ++i)
+               shouldBe("receiver[" + (i + 2) + "]", "fullArrayView[" + i + "]");
+
+       context.bufferSubData(target, 4, arrayBuffer);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 4, receiver, 0, 10);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       for (var i = 0; i < 10; ++i)
+               shouldBe("receiver[" + i + "]", "fullArrayView[" + i + "]");
+
+       fillReceiver();
+       context.bufferSubData(target, 4, arrayBuffer);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 8, receiver, 1, 8);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       for (var i = 0; i < 8; ++i)
+               shouldBe("receiver[" + (i + 1) + "]", "fullArrayView[" + (i + 1) + "]");
+
+       ////////////////////////////////////////////////////////////////////////////////////////////////
+
+       context.bufferSubData(target, 4, partialArrayView);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 0, receiver, 0, 6);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       for (var i = 0; i < 5; ++i)
+               shouldBe("receiver[" + (i + 1) + "]", "fullArrayView[" + (i + 1) + "]");
+
+       fillReceiver();
+       context.bufferSubData(target, 4, partialArrayView);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 0, receiver, 1, 6);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       shouldBe("receiver[1]", "sentinel");
+       for (var i = 0; i < 5; ++i)
+               shouldBe("receiver[" + (i + 2) + "]", "fullArrayView[" + (i + 1) + "]");
+
+       context.bufferSubData(target, 4, partialArrayView);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 4, receiver, 0, 5);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       for (var i = 0; i < 4; ++i)
+               shouldBe("receiver[" + i + "]", "fullArrayView[" + (i + 1) + "]");
+
+       fillReceiver();
+       context.bufferSubData(target, 4, partialArrayView);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 8, receiver, 1, 4);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       for (var i = 0; i < 3; ++i)
+               shouldBe("receiver[" + (i + 1) + "]", "fullArrayView[" + (i + 2) + "]");
+
+       ////////////////////////////////////////////////////////////////////////////////////////////////
+
+       context.bufferSubData(target, 4, partialArrayView, 0, 5);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 0, receiver, 0, 6);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       for (var i = 0; i < 5; ++i)
+               shouldBe("receiver[" + (i + 1) + "]", "fullArrayView[" + (i + 1) + "]");
+
+       fillReceiver();
+       context.bufferSubData(target, 4, partialArrayView, 0, 5);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 0, receiver, 1, 6);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       shouldBe("receiver[1]", "sentinel");
+       for (var i = 0; i < 5; ++i)
+               shouldBe("receiver[" + (i + 2) + "]", "fullArrayView[" + (i + 1) + "]");
+
+       context.bufferSubData(target, 4, partialArrayView, 0, 5);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 4, receiver, 0, 5);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       for (var i = 0; i < 4; ++i)
+               shouldBe("receiver[" + i + "]", "fullArrayView[" + (i + 1) + "]");
+
+       fillReceiver();
+       context.bufferSubData(target, 4, partialArrayView, 0, 5);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 8, receiver, 1, 4);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       for (var i = 0; i < 3; ++i)
+               shouldBe("receiver[" + (i + 1) + "]", "fullArrayView[" + (i + 2) + "]");
+
+       ////////////////////////////////////////////////////////////////////////////////////////////////
+
+       context.bufferSubData(target, 4, partialArrayView, 1, 4);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 0, receiver, 0, 5);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       for (var i = 0; i < 4; ++i)
+               shouldBe("receiver[" + (i + 1) + "]", "fullArrayView[" + (i + 2) + "]");
+
+       fillReceiver();
+       context.bufferSubData(target, 4, partialArrayView, 1, 4);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 0, receiver, 1, 5);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       shouldBe("receiver[1]", "sentinel");
+       for (var i = 0; i < 4; ++i)
+               shouldBe("receiver[" + (i + 2) + "]", "fullArrayView[" + (i + 2) + "]");
+
+       context.bufferSubData(target, 4, partialArrayView, 1, 4);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 4, receiver, 0, 4);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       for (var i = 0; i < 4; ++i)
+               shouldBe("receiver[" + i + "]", "fullArrayView[" + (i + 2) + "]");
+
+       fillReceiver();
+       context.bufferSubData(target, 4, partialArrayView, 1, 4);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       context.getBufferSubData(target, 8, receiver, 1, 3);
+       shouldBe("context.getError()", "context.NO_ERROR");
+       shouldBe("receiver[0]", "sentinel");
+       for (var i = 0; i < 3; ++i)
+               shouldBe("receiver[" + (i + 1) + "]", "fullArrayView[" + (i + 3) + "]");
+
+
+
+       context.deleteBuffer(buffer);
+       shouldBe("context.getError()", "context.NO_ERROR");
+}
+</script>
+<script src="../../../resources/js-test-post.js"></script>
+</body>
+</html>
\ No newline at end of file
index 0f9ac39..dd81914 100644 (file)
@@ -1,3 +1,38 @@
+2016-11-03  Myles C. Maxfield  <mmaxfield@apple.com>
+
+        [WebGL2] Implement getBufferSubData()
+        https://bugs.webkit.org/show_bug.cgi?id=164111
+
+        Reviewed by Dean Jackson.
+
+        The call exists in OpenGL 3.2 but in order to have parity with
+        OpenGL ES 3 we back it with glMapBufferRange() instead.
+
+        This patch simply adds surface area to GraphicsContext3D
+        until we can get an ANGLE implementation of it.
+
+        When testing this patch I discovered that r207649 incorrectly
+        interpreted arguments to bufferData() and bufferSubData() as
+        byte offsets. Instead, they should be element indices. This
+        patch fixes those functions to work correctly so that
+        getBufferSubData() can be tested correctly.
+
+        Tests: fast/canvas/webgl/webgl2-buffers.html
+               fast/canvas/webgl/getBufferSubData-webgl1.html
+
+        * html/canvas/WebGL2RenderingContext.cpp:
+        (WebCore::arrayBufferViewElementSize):
+        (WebCore::WebGL2RenderingContext::bufferData):
+        (WebCore::WebGL2RenderingContext::bufferSubData):
+        (WebCore::WebGL2RenderingContext::getBufferSubData):
+        * html/canvas/WebGL2RenderingContext.h:
+        * html/canvas/WebGL2RenderingContext.idl:
+        * platform/graphics/GraphicsContext3D.h:
+        * platform/graphics/opengl/GraphicsContext3DOpenGLCommon.cpp:
+        (WebCore::GraphicsContext3D::getBufferSubData):
+        (WebCore::GraphicsContext3D::mapBufferRange):
+        (WebCore::GraphicsContext3D::unmapBuffer):
+
 2016-11-03  Chris Dumez  <cdumez@apple.com>
 
         Unreviewed, mark support for the 'download' attribute as 'Done'.
index c1cf186..8cf2649 100644 (file)
@@ -88,13 +88,49 @@ void WebGL2RenderingContext::initializeShaderExtensions()
     m_context->getExtensions()->ensureEnabled("GL_EXT_frag_depth");
 }
 
-void WebGL2RenderingContext::bufferData(GC3Denum target, ArrayBufferView& data, GC3Denum usage, GC3Duint srcOffset, GC3Duint length)
-{
-    if (srcOffset > data.byteLength() || length > data.byteLength() - srcOffset) {
+inline static Optional<unsigned> arrayBufferViewElementSize(const ArrayBufferView& data)
+{
+    switch (data.getType()) {
+    case JSC::NotTypedArray:
+    case JSC::TypeDataView:
+        return Nullopt;
+    case JSC::TypeInt8:
+    case JSC::TypeUint8:
+    case JSC::TypeUint8Clamped:
+    case JSC::TypeInt16:
+    case JSC::TypeUint16:
+    case JSC::TypeInt32:
+    case JSC::TypeUint32:
+    case JSC::TypeFloat32:
+    case JSC::TypeFloat64:
+        return elementSize(data.getType());
+    }
+}
+
+void WebGL2RenderingContext::bufferData(GC3Denum target, const ArrayBufferView& data, GC3Denum usage, GC3Duint srcOffset, GC3Duint length)
+{
+    auto optionalElementSize = arrayBufferViewElementSize(data);
+    if (!optionalElementSize) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "bufferData", "Invalid type of Array Buffer View");
+        return;
+    }
+    auto elementSize = optionalElementSize.value();
+    Checked<GC3Duint, RecordOverflow> checkedElementSize(elementSize);
+
+    Checked<GC3Duint, RecordOverflow> checkedSrcOffset(srcOffset);
+    Checked<GC3Duint, RecordOverflow> checkedByteSrcOffset = checkedSrcOffset * checkedElementSize;
+    Checked<GC3Duint, RecordOverflow> checkedlength(length);
+    Checked<GC3Duint, RecordOverflow> checkedByteLength = checkedlength * checkedElementSize;
+
+    if (checkedByteSrcOffset.hasOverflowed()
+        || checkedByteLength.hasOverflowed()
+        || checkedByteSrcOffset.unsafeGet() > data.byteLength()
+        || checkedByteLength.unsafeGet() > data.byteLength() - checkedByteSrcOffset.unsafeGet()) {
         synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "bufferData", "srcOffset or length is out of bounds");
         return;
     }
-    auto slice = Uint8Array::create(data.unsharedBuffer(), data.byteOffset() + srcOffset, length);
+
+    auto slice = Uint8Array::create(data.possiblySharedBuffer(), data.byteOffset() + checkedByteSrcOffset.unsafeGet(), checkedByteLength.unsafeGet());
     if (!slice) {
         synthesizeGLError(GraphicsContext3D::OUT_OF_MEMORY, "bufferData", "Could not create intermediate ArrayBufferView");
         return;
@@ -102,17 +138,35 @@ void WebGL2RenderingContext::bufferData(GC3Denum target, ArrayBufferView& data,
     WebGLRenderingContextBase::bufferData(target, BufferDataSource(slice.get()), usage);
 }
 
-void WebGL2RenderingContext::bufferSubData(GC3Denum target, long long offset, ArrayBufferView& data, GC3Duint srcOffset, GC3Duint length)
+void WebGL2RenderingContext::bufferSubData(GC3Denum target, long long offset, const ArrayBufferView& data, GC3Duint srcOffset, GC3Duint length)
 {
-    if (srcOffset > data.byteLength() || length > data.byteLength() - srcOffset) {
-        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "bufferData", "srcOffset or length is out of bounds");
+    auto optionalElementSize = arrayBufferViewElementSize(data);
+    if (!optionalElementSize) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "bufferSubData", "Invalid type of Array Buffer View");
+        return;
+    }
+    auto elementSize = optionalElementSize.value();
+    Checked<GC3Duint, RecordOverflow> checkedElementSize(elementSize);
+
+    Checked<GC3Duint, RecordOverflow> checkedSrcOffset(srcOffset);
+    Checked<GC3Duint, RecordOverflow> checkedByteSrcOffset = checkedSrcOffset * checkedElementSize;
+    Checked<GC3Duint, RecordOverflow> checkedlength(length);
+    Checked<GC3Duint, RecordOverflow> checkedByteLength = checkedlength * checkedElementSize;
+
+    if (checkedByteSrcOffset.hasOverflowed()
+        || checkedByteLength.hasOverflowed()
+        || checkedByteSrcOffset.unsafeGet() > data.byteLength()
+        || checkedByteLength.unsafeGet() > data.byteLength() - checkedByteSrcOffset.unsafeGet()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "bufferSubData", "srcOffset or length is out of bounds");
         return;
     }
-    auto slice = Uint8Array::create(data.unsharedBuffer(), data.byteOffset() + srcOffset, length);
+
+    auto slice = Uint8Array::create(data.possiblySharedBuffer(), data.byteOffset() + checkedByteSrcOffset.unsafeGet(), checkedByteLength.unsafeGet());
     if (!slice) {
-        synthesizeGLError(GraphicsContext3D::OUT_OF_MEMORY, "bufferData", "Could not create intermediate ArrayBufferView");
+        synthesizeGLError(GraphicsContext3D::OUT_OF_MEMORY, "bufferSubData", "Could not create intermediate ArrayBufferView");
         return;
     }
+
     WebGLRenderingContextBase::bufferSubData(target, offset, BufferDataSource(slice.get()));
 }
 
@@ -120,8 +174,74 @@ void WebGL2RenderingContext::copyBufferSubData(GC3Denum, GC3Denum, GC3Dint64, GC
 {
 }
 
-void WebGL2RenderingContext::getBufferSubData(GC3Denum, GC3Dint64, ArrayBuffer*)
+void WebGL2RenderingContext::getBufferSubData(GC3Denum target, long long srcByteOffset, RefPtr<ArrayBufferView>&& dstData, GC3Duint dstOffset, GC3Duint length)
 {
+    if (isContextLostOrPending())
+        return;
+    WebGLBuffer* buffer = validateBufferDataParameters("bufferSubData", target, GraphicsContext3D::STATIC_DRAW);
+    if (!buffer) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "getBufferSubData", "No WebGLBuffer is bound to target");
+        return;
+    }
+
+    // FIXME: Implement "If target is TRANSFORM_FEEDBACK_BUFFER, and any transform feedback object is currently active, an INVALID_OPERATION error is generated."
+
+    if (!dstData) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "getBufferSubData", "Null dstData");
+        return;
+    }
+
+    auto optionalElementSize = arrayBufferViewElementSize(*dstData);
+    if (!optionalElementSize) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "getBufferSubData", "Invalid type of Array Buffer View");
+        return;
+    }
+    auto elementSize = optionalElementSize.value();
+    auto dstDataLength = dstData->byteLength() / elementSize;
+
+    if (dstOffset > dstDataLength) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "getBufferSubData", "dstOffset is larger than the length of the destination buffer.");
+        return;
+    }
+
+    GC3Duint copyLength = length ? length : dstDataLength - dstOffset;
+
+    Checked<GC3Duint, RecordOverflow> checkedDstOffset(dstOffset);
+    Checked<GC3Duint, RecordOverflow> checkedCopyLength(copyLength);
+    auto checkedDestinationEnd = checkedDstOffset + checkedCopyLength;
+    if (checkedDestinationEnd.hasOverflowed()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "getBufferSubData", "dstOffset + copyLength is too high");
+        return;
+    }
+
+    if (checkedDestinationEnd.unsafeGet() > dstDataLength) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "getBufferSubData", "end of written destination is past the end of the buffer");
+        return;
+    }
+
+    if (srcByteOffset < 0) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "getBufferSubData", "srcByteOffset is less than 0");
+        return;
+    }
+
+    Checked<GC3Dintptr, RecordOverflow> checkedSrcByteOffset(srcByteOffset);
+    Checked<GC3Dintptr, RecordOverflow> checkedCopyLengthPtr(copyLength);
+    Checked<GC3Dintptr, RecordOverflow> checkedElementSize(elementSize);
+    auto checkedSourceEnd = checkedSrcByteOffset + checkedCopyLengthPtr * checkedElementSize;
+    if (checkedSourceEnd.hasOverflowed() || checkedSourceEnd.unsafeGet() > buffer->byteLength()) {
+        synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "getBufferSubData", "Parameters would read outside the bounds of the source buffer");
+        return;
+    }
+
+    m_context->moveErrorsToSyntheticErrorList();
+#if PLATFORM(MAC) || PLATFORM(IOS)
+    // FIXME: Coalesce multiple getBufferSubData() calls to use a single map() call
+    void* ptr = m_context->mapBufferRange(target, checkedSrcByteOffset.unsafeGet(), static_cast<GC3Dsizeiptr>(checkedCopyLengthPtr.unsafeGet() * checkedElementSize.unsafeGet()), GraphicsContext3D::MAP_READ_BIT);
+    memcpy(static_cast<char*>(dstData->baseAddress()) + dstData->byteOffset() + dstOffset * elementSize, ptr, copyLength * elementSize);
+    bool success = m_context->unmapBuffer(target);
+    ASSERT_UNUSED(success, success);
+#endif
+    m_context->moveErrorsToSyntheticErrorList();
 }
 
 void WebGL2RenderingContext::blitFramebuffer(GC3Dint, GC3Dint, GC3Dint, GC3Dint, GC3Dint, GC3Dint, GC3Dint, GC3Dint, GC3Dbitfield, GC3Denum)
index d724cad..105bce7 100644 (file)
@@ -46,11 +46,10 @@ public:
     /* Buffer objects */
     using WebGLRenderingContextBase::bufferData;
     using WebGLRenderingContextBase::bufferSubData;
-    void bufferData(GC3Denum target, ArrayBufferView& data, GC3Denum usage, GC3Duint srcOffset, GC3Duint length);
-    void bufferSubData(GC3Denum target, long long offset, ArrayBufferView& data, GC3Duint srcOffset, GC3Duint length);
+    void bufferData(GC3Denum target, const ArrayBufferView& data, GC3Denum usage, GC3Duint srcOffset, GC3Duint length);
+    void bufferSubData(GC3Denum target, long long offset, const ArrayBufferView& data, GC3Duint srcOffset, GC3Duint length);
     void copyBufferSubData(GC3Denum readTarget, GC3Denum writeTarget, GC3Dint64 readOffset, GC3Dint64 writeOffset, GC3Dint64 size);
-    void getBufferSubData(GC3Denum target, GC3Dint64 offset, RefPtr<ArrayBufferView>&& returnedData);
-    void getBufferSubData(GC3Denum target, GC3Dint64 offset, ArrayBuffer* returnedData);
+    void getBufferSubData(GC3Denum target, long long srcByteOffset, RefPtr<ArrayBufferView>&& dstData, GC3Duint dstOffset = 0, GC3Duint length = 0);
     
     /* Framebuffer objects */
     WebGLGetInfo getFramebufferAttachmentParameter(GC3Denum target, GC3Denum attachment, GC3Denum pname) final;
index bf735f4..59774c8 100644 (file)
@@ -349,7 +349,7 @@ typedef (ImageData or HTMLImageElement or HTMLCanvasElement or HTMLVideoElement)
     // MapBufferRange, in particular its read-only and write-only modes,
     // can not be exposed safely to JavaScript. GetBufferSubData
     // replaces it for the purpose of fetching data back from the GPU.
-    void getBufferSubData(GLenum target, GLintptr offset, ArrayBuffer? returnedData);
+    void getBufferSubData(GLenum target, GLintptr srcByteOffset, ArrayBufferView dstData, optional GLuint dstOffset = 0, optional GLuint length = 0);
 
     /* Framebuffer objects */
     void blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
index df6e09f..daa4e28 100644 (file)
@@ -712,7 +712,10 @@ public:
         TEXTURE_IMMUTABLE_FORMAT = 0x912F,
         MAX_ELEMENT_INDEX = 0x8D6B,
         NUM_SAMPLE_COUNTS = 0x9380,
-        TEXTURE_IMMUTABLE_LEVELS = 0x82DF
+        TEXTURE_IMMUTABLE_LEVELS = 0x82DF, 
+
+        // OpenGL ES 3 constants
+        MAP_READ_BIT = 0x0001
     };
 
     // Context creation attributes.
@@ -965,6 +968,9 @@ public:
     void bufferData(GC3Denum target, GC3Dsizeiptr size, const void* data, GC3Denum usage);
     void bufferSubData(GC3Denum target, GC3Dintptr offset, GC3Dsizeiptr size, const void* data);
 
+    void* mapBufferRange(GC3Denum target, GC3Dintptr offset, GC3Dsizeiptr length, GC3Dbitfield access);
+    GC3Dboolean unmapBuffer(GC3Denum target);
+
     GC3Denum checkFramebufferStatus(GC3Denum target);
     void clear(GC3Dbitfield mask);
     void clearColor(GC3Dclampf red, GC3Dclampf green, GC3Dclampf blue, GC3Dclampf alpha);
index 771e8c9..1203fa9 100644 (file)
@@ -59,6 +59,7 @@
 
 #if PLATFORM(IOS)
 #import <OpenGLES/ES2/glext.h>
+#import <OpenGLES/ES3/gl.h>
 // From <OpenGLES/glext.h>
 #define GL_RGBA32F_ARB                      0x8814
 #define GL_RGB32F_ARB                       0x8815
 #if USE(OPENGL_ES_2)
 #include "OpenGLESShims.h"
 #elif PLATFORM(MAC)
+#define GL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED
 #include <OpenGL/gl.h>
+#include <OpenGL/gl3.h>
+#undef GL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED
 #elif PLATFORM(GTK) || PLATFORM(EFL) || PLATFORM(WIN)
 #include "OpenGLShims.h"
 #endif
@@ -547,6 +551,20 @@ void GraphicsContext3D::bufferSubData(GC3Denum target, GC3Dintptr offset, GC3Dsi
     ::glBufferSubData(target, offset, size, data);
 }
 
+#if PLATFORM(MAC) || PLATFORM(IOS)
+void* GraphicsContext3D::mapBufferRange(GC3Denum target, GC3Dintptr offset, GC3Dsizeiptr length, GC3Dbitfield access)
+{
+    makeContextCurrent();
+    return ::glMapBufferRange(target, offset, length, access);
+}
+
+GC3Dboolean GraphicsContext3D::unmapBuffer(GC3Denum target)
+{
+    makeContextCurrent();
+    return ::glUnmapBuffer(target);
+}
+#endif
+
 GC3Denum GraphicsContext3D::checkFramebufferStatus(GC3Denum target)
 {
     makeContextCurrent();