Bug 991981 - Test for ArrayBuffer.prototype.slice. r=sfink
authorJeff Walden <jwalden@mit.edu>
Tue, 08 Apr 2014 17:06:53 -0700
changeset 210067 17e0e70a8b5458d39156aa1c475a5054bfd7719b
parent 210066 a91412e045d946f0835a73db9f1c84ef1c6273f2
child 210068 0f8cc6e38a1e0f8e3985d77c3569598ef198a3b7
push id1
push userroot
push dateMon, 20 Oct 2014 17:29:22 +0000
reviewerssfink
bugs991981
milestone35.0a1
Bug 991981 - Test for ArrayBuffer.prototype.slice. r=sfink
js/src/tests/ecma_6/ArrayBuffer/browser.js
js/src/tests/ecma_6/ArrayBuffer/shell.js
js/src/tests/ecma_6/extensions/ArrayBuffer-slice-arguments-neutering.js
new file mode 100644
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/js/src/tests/ecma_6/extensions/ArrayBuffer-slice-arguments-neutering.js
@@ -0,0 +1,83 @@
+// |reftest| skip-if(!xulRuntime.shell) -- needs neuter()
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ */
+
+var gTestfile = "ArrayBuffer-slice-arguments-neutering.js";
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 991981;
+var summary =
+  "ArrayBuffer.prototype.slice shouldn't misbehave horribly if " +
+  "index-argument conversion neuters the ArrayBuffer being sliced";
+
+print(BUGNUMBER + ": " + summary);
+
+/**************
+ * BEGIN TEST *
+ **************/
+
+function testStart(dataType)
+{
+  var ab = new ArrayBuffer(0x1000);
+
+  var start =
+    {
+      valueOf: function()
+      {
+        neuter(ab, dataType);
+        gc();
+        return 0x800;
+      }
+    };
+
+  var ok = false;
+  try
+  {
+    ab.slice(start);
+  }
+  catch (e)
+  {
+    ok = true;
+  }
+  assertEq(ok, true, "start weirdness should have thrown");
+  assertEq(ab.byteLength, 0, "neutering should work for start weirdness");
+}
+testStart("change-data");
+testStart("same-data");
+
+function testEnd(dataType)
+{
+  var ab = new ArrayBuffer(0x1000);
+
+  var end =
+    {
+      valueOf: function()
+      {
+        neuter(ab, dataType);
+        gc();
+        return 0x1000;
+      }
+    };
+
+  var ok = false;
+  try
+  {
+    ab.slice(0x800, end);
+  }
+  catch (e)
+  {
+    ok = true;
+  }
+  assertEq(ok, true, "byteLength weirdness should have thrown");
+  assertEq(ab.byteLength, 0, "neutering should work for byteLength weirdness");
+}
+testEnd("change-data");
+testEnd("same-data");
+
+/******************************************************************************/
+
+if (typeof reportCompare === "function")
+  reportCompare(true, true);
+
+print("Tests complete");